Ссылки на c ++ без передачи по ссылке - PullRequest
4 голосов
/ 29 марта 2012

у меня class A с public std::list<int> object list_.Class B, с указателем на класс A a.

В методе в классе 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 каждый раз?

Спасибо

Ответы [ 6 ]

7 голосов
/ 29 марта 2012

Вы можете использовать ссылку , как объяснено другими ответами.

В C ++ 11 вы можете сделать даже это:

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

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

Нет a->, даже не list_, даже не push_back(). Всего три нажатия клавиш: add.

7 голосов
/ 29 марта 2012

Это должно работать:

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

В основном я создал локальную ссылочную переменную, ссылающуюся на член list_ экземпляра A.

3 голосов
/ 29 марта 2012

Почему вы не хотите использовать ссылку? Либо это, либо указатель - именно то, что вы хотите использовать здесь.

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

или

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

Использование указателя или ссылки означает, что добавления через a->list_.push_back( ... ) или pList->push_back( ... ) будут идентичными операциями в одной коллекции.

2 голосов
/ 29 марта 2012

Использовать ссылку?

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

std::string& b = a;

b[4] = 'L';

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

Здесь & делает ссылку на b, поэтому вы увидите, что обе строки изменяются при изменении b.

2 голосов
/ 29 марта 2012

Да, вот так:

std::list<int>& my_list = a->list_;
1 голос
/ 29 марта 2012

Мне любопытно, почему вы не любите передавать по ссылке.

Вы можете добавить функции-члены в класс A для обработки манипуляций со списком, вместо того, чтобы вызывать вызывающие функции для вызова функций из списка.сам.Хотя я не знаю, подходит ли это вам.

...