2012-03-29 49 views
4

我有class Apublic std::list<int> object list_Class B,指向A a引用C++而不通過引用

B類的方法...

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->list_.push_back(1); 
a->list_.push_back(2); 
a->list_.push_back(3); 

難道可以讓我直接引用list_對象A,而不必經過對象a每一次?

由於

+4

更好的問題是你爲什麼要避免傳遞引用?您可能會使問題超出所需範圍而複雜化。 – 2012-03-29 13:08:10

+1

爲什麼你的'list_'成員是公開的?這是一種設計氣味,你可能想重新審視你的方法。 – 2012-03-29 13:14:30

回答

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 A引用,所以你會看到,這兩個字符串由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()。只有三個按鍵:add

+1

儘管人們不應該過於看中太多的「本地功能」,但人們很容易將維護人員與符號爆炸相混淆。當然這取決於,當然時間會過濾出最佳實踐。 – 2012-03-29 14:18:24