2012-03-11 11 views
0

私はプライベートインスタンス変数を持ち、そのプライベートivarへの参照を返すgetterメソッドを使用しようとしています(私はivarをpublicにすることができます)。プライベートメンバ変数とC++でそれらへの参照を持つ方法

getterメソッドを使用した後に変数を変更すると、元のものではなくコピーが変更されているように見えます。なぜどんなアイデア?

#include <iostream> 
#include <tr1/unordered_map> 
#include <tr1/functional> 
#include <tr1/utility> 

typedef std::tr1::unordered_map<std::string, std::string> umap_str_str; 

class Parent { 
public: 

    //add an item to the private ivar 
    void prepareIvar(bool useGetter) 
    { 
     std::pair<std::string, std::string> item("myKey" , "myValue"); 

     if(useGetter){ 
      //getting the reference and updating it doesn't work 
      umap_str_str umap = getPrivateIvar(); 
      umap.insert(item); 
     }else { 
      //accessing the private ivar directly does work 
      _UMap.insert(item); 
     } 

    } 
    void printIvar() 
    { 
     std::cout << "printIvar\n"; 
     for(auto it : _UMap){ 
      std::cout << "\tKEY: " << it.first << "VALUE: " << it.second << std::endl; 
     } 
    } 

    //get a reference to the private ivar 
    umap_str_str& getPrivateIvar() 
    { 
     return _UMap; 
    } 
private: 
    umap_str_str _UMap; 
}; 



int main(int argc, const char * argv[]) 
{ 
    Parent *p = new Parent(); 

    p->prepareIvar(true);//use the getter first 
    p->printIvar();//it doesn't print the right info 

    p->prepareIvar(false);//access the private ivar directly 
    p->printIvar();//prints as expected 


    return 0; 
} 

答えて

4

この行では、参照を返すgetPrivateIvar()メソッドを使用しています。しかし、あなたがタイプumap_str_strの変数に格納されています

umap_str_str umap = getPrivateIvar(); 

何が起こっていることは、あなたが_UMapプライベートメンバのコピーとなり、新たなumap_str_strオブジェクトを作成しているということです。代わりに参照を使用する必要があります。

umap_str_str &umap(getPrivateIvar()); 
3

参照をコピーしています。次のものが必要です。

umap_str_str& umap = getPrivateIvar(); 

getPrivateIvar()

はあなたが効果的にコピーコンストラクタを呼び出す

umap_str_str umap = getPrivateIvar(); 

を行うときしかし、あなたのメンバーのエイリアスを返すので、コピーで動作します。

1

あなたは

umap_str_str& umap (getPrivateIvar()); 

がそうでなければ、あなたのマップのコピーを作成して書くことができ

関連する問題