Some questions. You've handed off control of a bunch of pins to the CubeControl class. Yet, you diddle with them in setup(). Why?
The CubeControl class should have a begin() method, and that method should be called in setup(), and that method should do the pin diddling.
Does you computer lack an enter key?
CubeControl(byte howManyLayers, byte howManyRegisters, byte layerPinNumbers[], byte registerDataPinNums[], byte registerClockPinNums[], byte registerResetPinNums[]);
would, in my opinion, be easier to read as:
CubeControl(byte howManyLayers,
byte howManyRegisters,
byte layerPinNumbers[],
byte registerDataPinNums[],
byte registerClockPinNums[],
byte registerResetPinNums[]);
This is a picky thing, I'm sure, but I like singular names for singular things and plural names for plural things. howManyLayers is a singular thing (layerCount would be a better name, in my opinion, to reflect this). layerPinNumbers is a plural thing - a list of pin numbers.
In the cpp file, then, you use singular names, layerPin, registerDataPin, etc. to point to plural things.
Again, in the picky department, a name like layerPointer says to me that you really don't know what this variable is for. If it is a pointer (and it is by definition, it points to something. The name should reflect what it points to.
As I said, these are picky things, but when reading the code, it really helps to spot incorrect logic when one does not have to keep flipping back to the header file to see if a variable is a singular thing being used as though it was plural or is it a plural thing being used as though it was a singular thing.
You have stuff commented out in the destructor, and it is a good thing that it is. The things pointed to be the members of the class are not owned by the class, so the destructor should not be trying to destroy them. That code should not just be commented out, it should be deleted.
writeLayer(arrayHolder, thisLayer, thisCube.layerDuration);
void CubeControl::writeLayer(byte layer[], byte col, unsigned int duration)
The value in thisLayer is referred to in the called method by the name col. Now, this is very confusing. Is the value a row number, a column number, or a layer number, or the temperature last Tuesday in Singapore?
for (int chips = 0; chips < numRegisters; chips++)
Again with the mismatch in plural name/singular intent. registerNum would be a better name, in my opinion. Or, just r or c.
for (int regnum = 0; regnum < numRegisters; regnum++)
{
arrayHolder[regnum] = thisCube.layer[thisLayer][regnum];
}
writeLayer(arrayHolder, thisLayer, thisCube.layerDuration);
Serial.println();
Serial.println(arrayHolder[0]);
I can't see anything in writeLayer that affects the value in arrayHolder[0]. If you suspect that something there IS affecting arrayHolder[0], you should print the value before and after the call. If you suspect that arrayHolder[n] is being populated incorrectly, you should be printing the value in the loop where the assignment occurs.
Might I also suggest that output like
4
4
is less meaningful than output like
arrayHolder[0] = 4
arrayHolder[1] = 4