具有引用数据成员的类的默认构造函数?

时间:2014-04-05 00:39:42

标签: c++ reference default-constructor class-members

我有一个班级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

3 个答案:

答案 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_;
}