Конструктор по умолчанию для класса со ссылочным членом данных?

У меня есть класс 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

0

Решение

Класс со ссылочным членом должен установить ссылку в своих конструкторах. В большинстве случаев это означает, что класс не может иметь конструктор по умолчанию. Лучший способ решить проблему — использовать указатель вместо ссылки:

class MyClass{
public:
MyClass() : s_(0) {}
MyClass(Something* s) : s_(s) {}
Something* s_;
}
3

Другие решения

Как я уже говорил выше, одним лишь описанием я бы сказал, что это классический случай, когда 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;
}
1

Вы также можете сделать это:

class MyClass{
public:
MyClass() : s_(0) {}
MyClass(Something& s) : s_(&s) {}
Something* s_;
}
0
По вопросам рекламы [email protected]