我有一个班级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 :(得分:3)
具有引用成员的类需要在其构造函数中设置引用。在大多数情况下,这意味着该类不能具有默认构造函数。解决问题的最佳方法是使用指针而不是引用:
class MyClass{
public:
MyClass() : s_(0) {}
MyClass(Something* s) : s_(s) {}
Something* s_;
}
答案 1 :(得分:1)
正如我在上面评论的那样,仅通过描述,我会说这是一个经典案例,其中s
应该是Something*
而不是Something&
......
OTOH,这项工作非常完美,因此如果您只是初始化数组的每个元素, 需要 默认构造函数:< / p>
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;
}
答案 2 :(得分:0)
你也可以这样做:
class MyClass{
public:
MyClass() : s_(0) {}
MyClass(Something& s) : s_(&s) {}
Something* s_;
}