2012-03-29 18 views
4

私はにpublic std::list<int> object list_を持っています。 Class B、クラスA aへのポインタを持ちます。クラスBでの方法では参照で渡さずにC++で参照する

...

std::list my_list = a->list_; 
my_list.push_back(1); 
my_list.push_back(2); 
my_list.push_back(3); 

私は、変更が元のリストに反映されていない理由である、my_listというは実際にlist_のコピーであることを理解しています。この特定の分野については、私は参照渡しを避けようとしています。私が直接オブジェクトaてひとつひとつの時間を移動することなく、Aにlist_オブジェクトを参照するために次の操作を実行しなくても...

a->list_.push_back(1); 
a->list_.push_back(2); 
a->list_.push_back(3); 

は、それは可能でしょうか?

おかげ

+4

より良い質問は、なぜ参照を渡すのを避けたいのでしょうか?必要以上に問題を複雑にしているかもしれません。 –

+1

あなたの 'list_'メンバーはなぜ公開されていますか?それはあなたのアプローチを再訪したいかもしれないデザインの匂いです。 –

答えて

7

は、これは動作するはずです:

std::list<int>& list = a->list_; 
list.push_back(1); 
list.push_back(2); 
list.push_back(3); 

は基本的に私はAインスタンスのlist_メンバーを参照するローカル参照変数を作成しました。

3

なぜ参照を使用したくないのですか?これとポインタのどちらかが、ここで使用したいものです。ポインタまたは参照のいずれかを使用して

std::list<int>& list = a->list_; 

又は

std::list<int>* pList = &a->list_; 

a->list_.push_back(...)又はpList->push_back(...)介して追加が同じコレクションに同じ操作であることを意味します。

2

はい、そうのように:

std::list<int>& my_list = a->list_; 
2

は、参照を使用しますか?

std::string a("This is a test"); 

std::string& b = a; 

b[4] = 'L'; 

std::cout << a << std::endl << b << std::endl; 

ここ&はリファレンスBになり、あなたは両方の文字列をbを変更することによって変更されていることがわかります。

1

私はあなたが参照渡しを嫌う理由について興味があります。

呼び出し元がリスト自体の関数を呼び出すのではなく、メンバ関数をクラスAに追加してメンバリストを操作することができます。私はこれがあなたの使い方に合っているかどうかわかりません。

7

参照を他の回答で説明したように使用できます。

C++ 11では、あなたもこれを行うことができます。

auto add = [&](int n) { a->list_.push_back(n); }; 

add(1); 
add(2); 
add(3); 

ませa->、いなくてもlist_ではなく、さらにpush_back()を。ちょうど3回のキーストローク:add

+1

あまりにも多くの "ローカル関数"があまりにも派手ではないはずですが、メンテナを簡単にシンボルの爆発と混同することがあります。もちろんそれは異なりますが、もちろんベストプラクティスは除外されます。 –