All,
I’m new to C++ and trying to figure out the best way to do a multidimensional array of pointers to a class.
The code I am presenting demonstrates several questions I had and am hoping to get some help with each question.
The basic idea is to create myMatrix, a two dimensional array of pointers to myClass, populate it by passing it to the function populateMatrix by reference, delete the array, and repeat these steps for a specific number of iterations (10 in the program presented).
I think the code below is 95% correct, although I get an error on line 67 that states "error C2512: 'myClass' : no appropriate default constructor available". I’m not certain how to fix this. Also, I’m not sure how to refer to the matrix once I pass it to the populateMatrix function.
Although those are my questions for the actual code, I was hoping to get some other thoughts on the coding in general. Specifically,
1) If I would like to repopulate the matrix with a different set of values each time (say, read the values from a file for example), should I create and delete the matrix for each iteration as shown, or is it more practical to simply set all the pointers to NULL and reuse it?
2) Should I be setting the pointer to NULL in line 70? I got the basic structure of the code from Wrox Professional C++ (page 360), but they don’t set the pointer to NULL. They way I read Beginning Visual C++ 2010, it seems to say all pointers should be set to null when initialized. Also, I thought I had read somewhere that pointers set to NULL don’t actually go through all the delete steps, so there is a time savings if the pointer is set to NULL to begin with and then never assigned a value. Is this true?
3) With the code shown, is all the memory in fact released between each iteration? I ask because it looks like I am cycling through the y dimension but not the x dimension. Again, the structure is from Wrox Professional C++, so I’m sure its correct, but I don’t understand exactly what happening here.
4) Also, I tried to use nullptr, but I get a C2065 error. The program is a native C++ program and I am using Visual Studio 2008. Is this available or should I stick with NULL?
Also, any other thoughts here would be greatly appreciated.
Max
// MatrixTest
#include <cstring> // For the NULL
class myClass
{
public:
// Static int to track number of values in the matrix
static int numberOfValuesInMatrix;
// Constructor
myClass( int inValue ) : value( inValue )
{
numberOfValuesInMatrix++;
}
// Destructor
~myClass(void)
{
}
protected:
int value;
};
void populateMatrix( myClass**& inMyMatrix, int inIteration, int inXDimension, int inYDimension )
{
int populateNumber;
for (int i = 0; i < inXDimension; i++)
{
for (int j = 0; j < inYDimension; j++)
{
// Here I want to populate inMyMatrix[i][j] with inIteration * 5000 + populateNumber,
// but I'm not sure how I refer to inMyMatrix
//
populateNumber++;
}
}
}
int main()
{
const int iterations = 10;
const int xDimension = 100;
const int yDimension = 50;
for (int i = 0; i < iterations; i++)
{
// Create and initialize myMatrix
myClass::numberOfValuesInMatrix = 0;
myClass** myMatrix = new myClass*[xDimension];
for (int j = 0; j < xDimension; j++)
{
myMatrix[i] = new myClass[yDimension]; // "error C2512: 'myClass' : no appropriate default constructor available"
// Set the pointer to NULL - is this necessary?
myMatrix[i] = NULL;
}
populateMatrix( myMatrix, i, xDimension, yDimension );
// Delete
for (int i = 0; i < xDimension; i++)
{
delete[] myMatrix[i]; // Do I not have to cycle through the y dimension and delete those pointers?
}
delete[] myMatrix;
myClass::numberOfValuesInMatrix = 0;
}
return 0;
}