У меня есть класс MyClass
в котором мне нужно создать std::array
из std::vector
в конструкторе по умолчанию. Тем не менее, этот класс имеет член данных, который является ссылкой (типа Something
), который также должен быть инициализирован в конструкторе, и я не могу сделать это в конструкторе по умолчанию.
Как мне решить это?
class MyClass{
public:
MyClass(); //Cannot instantiate s??
MyClass(Something& s);
Something& s;
}
MyClass array[10]; // MyClass needs a default constructor but a default
// constructor won't be able to initialize s
Класс со ссылочным членом должен установить ссылку в своих конструкторах. В большинстве случаев это означает, что класс не может иметь конструктор по умолчанию. Лучший способ решить проблему — использовать указатель вместо ссылки:
class MyClass{
public:
MyClass() : s_(0) {}
MyClass(Something* s) : s_(s) {}
Something* s_;
}
Как я уже говорил выше, одним лишь описанием я бы сказал, что это классический случай, когда s
должен быть Something*
а не Something&
…
ОТО, это отлично работает, так что вы не необходимость конструктор по умолчанию если вы просто инициализируете каждый элемент вашего массива:
struct Something { };
struct MyClass {
MyClass(Something& ss) : s{ss} {}
Something& s;
};
int main() {
Something a, b, c, d;
Something v[10] = { a, b, c, d, a, b, c, d, a, b };
return 0;
}
Вы также можете сделать это:
class MyClass{
public:
MyClass() : s_(0) {}
MyClass(Something& s) : s_(&s) {}
Something* s_;
}