我正在尝试创建一个包含另一个类作为引用的类(私有成员)。
class example{
private:
std::vector<char> chars;
};
class example2{
example2(example to_be_initialized) :ref(to_be_initialized) { }
private:
example& ref;
};
希望缺乏细节不会让任何人感到烦恼(我知道你们喜欢看到完整的代码,但我减少了它,因为如果这不是问题,那么我必须要弄清楚。但我会发布更多/其他如果需要),但我的代码与此非常相似,在做任何涉及ref的事情时我会得到奇怪的unicode字符。一旦我将ref更改为非引用,所有奇怪的未定义行为都会消失。
我想知道上述内容是否合法,仅供将来参考。我知道在这种情况下我不是通过引用类来保存大量内存(因为它只是复制指针,对吧?),但我觉得将来有必要这样做。
提前致谢。
答案 0 :(得分:3)
代码存在一个主要问题:构造函数按值获取其参数,这意味着引用引用临时对象。在构造函数调用之后,它将作为悬空引用保留。
您需要从有效对象初始化引用。您可以通过将构造函数参数作为引用来执行此操作:
class example2
{
public:
example2(example& to_be_initialized) : ref(to_be_initialized) { }
private:
example& ref;
};
然后
example e;
example2 e2(e); // e2.ref and e are the same object
注意:您必须确保理解使用它的引用的语义。引用实际上并不像“指针”。它是一个且只有一个现有对象的别名。除非你实际上需要引用语义,否则你应该存储一个对象:
class example2
{
public:
example2(const example& to_be_initialized) : ex(to_be_initialized) { }
private:
example ex;
};