2016-12-12 4 views
0

私のC++クラスでプライベート変数を初期化するにはどうすればよいですか?std :: stringのプライベートクラス変数を初期化する&

ああ:

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に)私のコンストラクタでそれを初期化してきたが、それ依然としてエラーが発生しています。

+4

なぜ 'name'を' string& 'にする必要がありますか?なぜ単に文字列ではないのですか?クラスデータメンバを参照するのは、最初から実際の文字列には初期化されていないので、複雑なものです。 –

答えて

3

まず、デフォルトコンストラクタを修正しましょう。割り当てで参照を初期化することはできません。彼らは、初期化子リストで初期化する必要があります

static string empty_name(""); 

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

empty_name変数の使用は、翻訳単位にスコープ。これにより、参照メンバをあるオブジェクトに初期化することができます。

メンバ関数loadまでは、作成後に参照を再割り当てする方法はありません。この機能が必要な場合は、外部のstd::stringオブジェクトにアクセスする必要がある場合は参照をポインタに置き換えるか、オブジェクトの外部にある文字列を参照する必要がない場合はコピー(つまりstd::string name)を参照に置き換えることをお勧めします。