初始化std :: string&的私有类变量

时间:2016-12-12 21:21:41

标签: c++ c++11

如何在我的c ++类中初始化我的私有变量?

A.H:

class A {
    private:
        std::string& name;
    public:
        A(void);
        ~A(void);

        bool load(std::string& name);
};

a.cpp:

#include <string>
#include "a.h"

A::A(void) {  
    this->name = "";  
}
A::~A(void) {}


bool A::load(std::string& name) {
    this->name = name;
}

错误:

a.cpp: In constructor ‘A::A()’:
a.cpp:3:1: error: uninitialized reference member in ‘std::__cxx11::string& {aka class std::__cxx11::basic_string<char>&}’ [-fpermissive]
 A::A(void) {
 ^
In file included from a.cpp:2:0:
a.h:3:22: note: ‘std::__cxx11::string& A::name’ should be initialized
         std::string& name;

我已经在我的构造函数(在a.cpp中)初始化它,但它仍然是错误的。

1 个答案:

答案 0 :(得分:3)

让我们先修复默认构造函数:你不能用赋值来初始化引用。它们需要使用初始化列表进行初始化:

static string empty_name("");

A::A(void) : name (empty_name) {  
}

请注意使用empty_name变量,作用于翻译单元。这允许您将引用成员初始化为某个对象。

load成员函数而言,在创建引用后无法重新分配引用。如果您需要此功能,最好的办法是在需要访问外部std::string对象时使用指针替换引用,或者如果不需要引用则使用副本(即std::string name)替换引用一个对象外部的字符串。