引用 class 成员 (was) 导致未定义的行为
Reference class member (was) causing undefined behavior
我正在尝试创建一个 class,其中包含另一个 class 作为参考(私人成员)。
class example{
private:
std::vector<char> chars;
};
class example2{
example2(example to_be_initialized) :ref(to_be_initialized) { }
private:
example& ref;
};
希望缺乏细节不会打扰任何人(我知道你们喜欢看完整的代码,但我减少了它,因为如果这不是问题,那是我必须弄清楚的其他问题。但我如果需要,将 post more/the 休息),但我的代码与此非常相似,并且在做任何涉及 ref 的事情时我会得到奇怪的 unicode 字符。一旦我将 ref 更改为非引用,所有奇怪的未定义行为都消失了。
我想知道以上是否合法,仅供日后参考。我知道在这种情况下,我不会通过引用 class 来节省大量内存(因为它只是复制指针,对吗?),但我觉得将来有必要这样做。
提前致谢。
代码存在一个主要问题:构造函数按值获取其参数,这意味着引用引用临时对象。构造函数调用后,它作为悬空引用留下。
您需要从有效对象初始化引用。您可以通过将构造函数参数设为引用来做到这一点:
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
注意:您必须确保了解引用的语义才能使用它。参考并不是真正的 "like a pointer"。它是唯一一个现有对象的别名。除非你真的需要引用语义,否则你应该存储一个对象:
class example2
{
public:
example2(const example& to_be_initialized) : ex(to_be_initialized) { }
private:
example ex;
};
我正在尝试创建一个 class,其中包含另一个 class 作为参考(私人成员)。
class example{
private:
std::vector<char> chars;
};
class example2{
example2(example to_be_initialized) :ref(to_be_initialized) { }
private:
example& ref;
};
希望缺乏细节不会打扰任何人(我知道你们喜欢看完整的代码,但我减少了它,因为如果这不是问题,那是我必须弄清楚的其他问题。但我如果需要,将 post more/the 休息),但我的代码与此非常相似,并且在做任何涉及 ref 的事情时我会得到奇怪的 unicode 字符。一旦我将 ref 更改为非引用,所有奇怪的未定义行为都消失了。
我想知道以上是否合法,仅供日后参考。我知道在这种情况下,我不会通过引用 class 来节省大量内存(因为它只是复制指针,对吗?),但我觉得将来有必要这样做。
提前致谢。
代码存在一个主要问题:构造函数按值获取其参数,这意味着引用引用临时对象。构造函数调用后,它作为悬空引用留下。
您需要从有效对象初始化引用。您可以通过将构造函数参数设为引用来做到这一点:
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
注意:您必须确保了解引用的语义才能使用它。参考并不是真正的 "like a pointer"。它是唯一一个现有对象的别名。除非你真的需要引用语义,否则你应该存储一个对象:
class example2
{
public:
example2(const example& to_be_initialized) : ex(to_be_initialized) { }
private:
example ex;
};