Let's say I have a class that has a member which is an array. Is it possible to define its size upon construction/at run-time, in the following way:
class myClass {
private:
int myArray[n]
public:
myClass();
someOtherMethod();
};
Where n is a variable that is defined based on user input. If not, what would be the best alternative?
Use a vector.
class myClass {
private:
std::vector<int> myArray;
public:
myClass();
someOtherMethod();
};
myClass::myClass (int size)
: myArray (size)
{
...
}
Then, you can fill in the vector as you would an array. Alternatively, as Nawaz points out, use reserve()
, which reserves space for new elements, and/or push_back()
, which adds elements onto the back, one at a time.
It depends.
Semantically, there are 3 types of arrays:
- arrays with a size fixed at compile time
- arrays with a size fixed at runtime
- arrays with a dynamic size
C++ directly supports the first and third cases, respectively with regular arrays and the std::vector
class.
C also supports the second type with two constructs:
- variable length arrays (on the stack)
- the oldie struct hack or tail-padding
I would advise, in C++, using the std::vector
class in your case. It provides more than what you need, but is simpler to use.
On the other hand, you can still use tail-padding, even in C++. It does require careful engineering though.
The class template std::vector
is designed for this purpose.
class myClass {
private:
std::vector<int> myArray;
public:
myClass(int size);
someOtherMethod();
};
myClass::myClass(int size) : myArray(size)
{
}