2012-03-29 13 views
4

Ich habe class A mit einem public std::list<int> object list_. Class B, mit einem Zeiger auf Klasse A a.Referenzieren in C++ ohne durch Referenz zu gehen

Bei einem Verfahren in der Klasse B ...

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

Ich verstehe, dass my_list in der Tat ist eine Kopie von list_, weshalb die Änderungen nicht auf die ursprünglichen Liste reflektiert werden. Und für dieses spezielle Gebiet versuche ich zu vermeiden, durch Verweis zu gehen. Ohne mit dem folgenden ...

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

Wäre es möglich, zu tun für mich direkt mit dem list_ Objekt in einem Verweis auf, ohne a jedes Mal durch das Objekt zu gehen?

Dank

+4

Die bessere Frage wäre, warum Sie Referenzen vermeiden wollen? Möglicherweise komplizieren Sie das Problem über das hinaus, was benötigt wird. –

+1

Warum ist dein 'list_' Mitglied öffentlich? Das ist ein Designgeruch, mit dem Sie vielleicht Ihre Herangehensweise noch einmal überprüfen möchten. –

Antwort

7

Diese Arbeit sollte:

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

Im Grunde habe ich eine lokale Variable Referenz Referenzierung des list_ Mitglied der A Instanz.

3

Warum möchten Sie keine Referenz verwenden? Entweder dies oder ein Zeiger ist genau das, was Sie hier verwenden möchten.

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

oder

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

entweder den Zeiger oder eine Referenz Verwendung bedeutet, dass Additionen über a->list_.push_back(...) oder pList->push_back(...) identische Operationen an der gleichen Kollektion sein.

2

Ja, etwa so:

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

Referenz verwenden?

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

std::string& b = a; 

b[4] = 'L'; 

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

Hier die & macht b Referenz, so werden Sie sehen, dass beide Strings durch Änderung b geändert werden.

1

Ich bin neugierig, warum Sie ablehnen, durch Bezugnahme zu gehen.

Sie könnten der Klasse A Elementfunktionen hinzufügen, um die Elementliste zu bearbeiten, anstatt dass die Aufrufer die Funktionen in der Liste selbst aufrufen müssen. Ich weiß nicht, ob das zu Ihrer Verwendung passt.

7

Sie können Referenz wie von anderen Antworten erläutert verwenden.

In C++ 11, können Sie auch diese:

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

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

Kein a->, nicht einmal list_, nicht einmal push_back(). Nur drei Tastenanschläge: add.

+1

Obwohl man sich nicht zu sehr mit zu vielen "lokalen Funktionen" auskennt, kann man den Betreuer leicht mit der Symbolexplosion verwechseln. Natürlich kommt es darauf an, und natürlich wird die Zeit Best Practices herausfiltern. –