Это для создания массивов объектов, которые правильно инициализированы.
У меня есть класс C, у которого нет конструктора по умолчанию. Мне нужен массив объектов класса C. Я выясняю, как я хочу инициализировать эти объекты, затем извлекаю класс D из C статическим методом, который предоставляет аргумент для C в конструкторе D по умолчанию:
#include <iostream>
using namespace std;
class C {
public:
C(int x) : mData(x) {}
int method() { return mData; }
// ...
private:
int mData;
};
void f() {
// Here I am in f. I need an array of 50 C objects starting with C(22)
class D : public C {
public:
D() : C(D::clicker()) {}
private:
// I want my C objects to be initialized with consecutive
// integers, starting at 22.
static int clicker() {
static int current = 22;
return current++;
}
};
D array[50] ;
// Now I will display the object in position 11 to verify it got initialized
// with the right value.
cout << "This should be 33: --> " << array[11].method() << endl;
cout << "sizodf(C): " << sizeof(C) << endl;
cout << "sizeof(D): " << sizeof(D) << endl;
return;
}
int main(int, char **) {
f();
return 0;
}
Для простоты в этом примере используется тривиальный конструктор не по умолчанию, а также случай, когда значения известны во время компиляции. Этот метод легко распространить на случаи, когда вы хотите, чтобы массив объектов инициализировался со значениями, которые известны только во время выполнения.