在构造函数初始化列表中初始化 stringstream 引用成员,没有任何内容
Posted
技术标签:
【中文标题】在构造函数初始化列表中初始化 stringstream 引用成员,没有任何内容【英文标题】:Initialize stringstream reference member in constructor initialization list with nothing 【发布时间】:2012-11-23 20:26:43 【问题描述】:我试图初始化一个没有任何内容的字符串流引用成员,说我希望它引用 null 或者只是让它未初始化。
.hpp 文件
class Class
private:
int n;
stringstream& css;
public:
Class(int n);
Class(stringstream& ss, int i);
;
.cpp 文件
Class::Class(int n)
: n(n)
编译器给出: 错误 1 错误 C2758: 'Class::css' : 必须在构造函数基/成员初始化列表中初始化
我必须初始化初始化列表中的所有变量吗? 因为我没有将任何字符串流引用传递给构造函数,我该如何初始化它?或者,如果我不想初始化它,请将其留空。我该怎么做?
【问题讨论】:
【参考方案1】:引用成员必须被初始化。你不需要引用,你需要一个指针。
class Class
private:
int n;
stringstream* css;
public:
Class(int n);
Class(stringstream& ss, int i);
;
Class::Class(int n)
:n(n), css(nullptr)
Class::Class(stringstream& ss, int i)
:n(i), css(&ss)
【讨论】:
@LuchianGrigore:不,智能指针用于所有权。这是一个可为空的引用。这是剩下的一个函数,原始指针仍然有用。 @LuchianGrigore:如果你把它设为 shared_ptr,你就要求你的用户也必须使用 shared_ptr。他们可能只是想给你一个本地的、非动态分配的对象的引用。 但是你不会冒着留下悬空指针的风险吗? @LuchianGrigore:当然。您只需像对待任何引用或指针一样对待该类。如果您想要增加安全措施,请使其不可复制。 我明白了。因此,可为空的引用成员是原始指针的有效用例。你知道我可以对此做进一步的阅读吗?以上是关于在构造函数初始化列表中初始化 stringstream 引用成员,没有任何内容的主要内容,如果未能解决你的问题,请参考以下文章
C++成员初始化列表(构造函数后加冒号:)(用于在构造函数中初始化类成员变量,可以避免使用构造函数体内的赋值语句,可以确保成员变量在对象构造之初就已经被正确初始化,提高代码的性能和可读性)