Default constructor for a class with a reference data member?

不想你离开。 提交于 2019-12-10 10:09:03

问题


I have a class MyClass in which I need to create a std::array of std::vector in the default constructor. However, this class has a data member which is a reference (of type Something) which also needs to be initialized in the constructor and I cannot do this in a default constructor.

How should I solve this?

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

回答1:


A class with a reference member needs to set the reference in its constructors. In most cases this means, that the class cannot have a default constructor. The best way to solve the problem is use a pointer instead of a reference:

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



回答2:


As I commented above, by the description alone, I would say that it's a classical case where s should be a Something* rather than a Something&...

OTOH, this work perfectly, so you don't need a default constructor if you just initialize each element of your array:

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;
}



回答3:


Your can also do this:

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


来源:https://stackoverflow.com/questions/22875186/default-constructor-for-a-class-with-a-reference-data-member

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!