在构造函数初始化列表中初始化 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++11之前)

C++:初始化成员变量(无参构造|有参构造|初始化列表)

拷贝构造函数

C++成员初始化列表(构造函数后加冒号:)(用于在构造函数中初始化类成员变量,可以避免使用构造函数体内的赋值语句,可以确保成员变量在对象构造之初就已经被正确初始化,提高代码的性能和可读性)

在构造函数初始化器列表中初始化函数指针数组 - 错误