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

C++ 具有引用数据成员的类的默认构造函数?,c++,reference,default-constructor,class-members,C++,Reference,Default Constructor,Class Members,我有一个类MyClass,我需要在默认构造函数中创建std::vector的std::array。但是,这个类有一个数据成员,它是一个引用(类型为Something),它也需要在构造函数中初始化,而我不能在默认构造函数中进行初始化 我应该如何解决这个问题 class MyClass{ public: MyClass(); //Cannot instantiate s?? MyClass(Something& s); Something& s; } MyC

我有一个类
MyClass
,我需要在默认构造函数中创建
std::vector
std::array
。但是,这个类有一个数据成员,它是一个引用(类型为
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&

OTOH,这工作得很好,因此如果只初始化数组的每个元素,就不需要默认构造函数:

您也可以这样做:

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

你能给我们一个简单的代码例子来说明这个问题吗?但仅凭描述,我想说这是一个经典的例子,
s
应该是
Something*
而不是
Something&
…从技术上讲,它可以有一个默认构造函数(例如,如果它在
s_
中存储对全局的引用)。问题是,您必须将引用“指向”一个
某物
实例。这是因为您使用了列表初始值设定项,而我没有要添加到数组中的元素作为开始:)好吧,您可以始终执行
MyClass():s{sx}{;静态某物sx
class MyClass{
public:
    MyClass() : s_(0) {}
    MyClass(Something& s) : s_(&s) {}
    Something* s_;
}