I want to initialize constant in child-class, instead of base class. And use it to get rid of dynamic memory allocation (I know array sizes already, and there will be a few child-classes with different constants).
So I try:
class A {
public:
const int x;
A() : x(0) {}
A(int x) : x(x) {}
void f() {
double y[this->x];
}
};
class B : A {
B() : A(2) {}
};
Pretty simple, but compiler says:
error C2057: expected constant expression
How can I say to compiler, that it is really a constant?
It isn’t a constant though. It can still be modified by the constructor. Only a compile time constant is allowed for the size of an array. When the compiler says “constant expression”, it is not meaning an expression which returns a constant value, but an constant, such as “52” or “45” or something along those lines.
Use
std::vectorinstead.EDIT: In response to “I know array sizes already, and there will be a few child-classes with different constants”
The only way to do that is to use a template.