【问题标题】:Initialize stringstream reference member in constructor initialization list with nothing在构造函数初始化列表中初始化 stringstream 引用成员,没有任何内容
【发布时间】: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' : 必须在构造函数基/成员初始化列表中初始化

我必须初始化初始化列表中的所有变量吗? 因为我没有将任何字符串流引用传递给构造函数,我该如何初始化它?或者,如果我不想初始化它,请将其留空。我该怎么做?

【问题讨论】:

    标签: c++ reference constructor initialization-list


    【解决方案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:当然。您只需像对待任何引用或指针一样对待该类。如果您想要增加安全措施,请使其不可复制。
    • 我明白了。因此,可为空的引用成员是原始指针的有效用例。你知道我可以对此做进一步的阅读吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多