2012-03-29 34 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