Referenzen in Container
-
#include <map> class A { }; class B { }; typedef std::map<A&,B&> Map; typedef Map::iterator it; int main() { return 0; }
Dieser Versuch endet folgendermassen:
/usr/include/c++/3.4/bits/stl_function.h: In instantiation of `std::less<A&>': /usr/include/c++/3.4/bits/stl_tree.h:398: instantiated from `std::_Rb_tree<A&, std::pair<A&, B&>, std::_Select1st<std::pair<A&, B&> >, std::less<A&>, std::allocator<std::pair<A&, B&> > >::_Rb_tree_impl<std::less<A&>, false>' /usr/include/c++/3.4/bits/stl_tree.h:433: instantiated from `std::_Rb_tree<A&, std::pair<A&, B&>, std::_Select1st<std::pair<A&, B&> >, std::less<A&>, std::allocator<std::pair<A&, B&> > >' /usr/include/c++/3.4/bits/stl_map.h:124: instantiated from `std::map<A&, B&, std::less<A&>, std::allocator<std::pair<A&, B&> > >' test6.cpp:8: instantiated from here /usr/include/c++/3.4/bits/stl_function.h:227: error: forming reference to reference type `A&' /usr/include/c++/3.4/bits/stl_tree.h: In instantiation of `std::_Rb_tree<A&, std::pair<A&, B&>, std::_Select1st<std::pair<A&, B&> >, std::less<A&>, std::allocator<std::pair<A&, B&> > >': /usr/include/c++/3.4/bits/stl_map.h:124: instantiated from `std::map<A&, B&, std::less<A&>, std::allocator<std::pair<A&, B&> > >' test6.cpp:8: instantiated from here /usr/include/c++/3.4/bits/stl_tree.h:482: error: forming reference to reference type `A&' /usr/include/c++/3.4/bits/stl_tree.h:506: error: forming reference to reference type `A&' /usr/include/c++/3.4/bits/stl_tree.h:1015: error: forming reference to reference type `A&' /usr/include/c++/3.4/bits/stl_tree.h:1090: error: forming pointer to reference type `A&' /usr/include/c++/3.4/bits/stl_tree.h:1099: error: forming reference to reference type `A&' /usr/include/c++/3.4/bits/stl_tree.h:1119: error: forming reference to reference type `A&' /usr/include/c++/3.4/bits/stl_tree.h:1140: error: forming reference to reference type `A&' /usr/include/c++/3.4/bits/stl_tree.h:1151: error: forming reference to reference type `A&' /usr/include/c++/3.4/bits/stl_tree.h:1169: error: forming reference to reference type `A&' /usr/include/c++/3.4/bits/stl_tree.h:1187: error: forming reference to reference type `A&' /usr/include/c++/3.4/bits/stl_tree.h:1205: error: forming reference to reference type `A&' /usr/include/c++/3.4/bits/stl_tree.h:1226: error: forming reference to reference type `A&' /usr/include/c++/3.4/bits/stl_tree.h:1236: error: forming reference to reference type `A&' /usr/include/c++/3.4/bits/stl_map.h: In instantiation of `std::map<A&, B&, std::less<A&>, std::allocator<std::pair<A&, B&> > >': test6.cpp:8: instantiated from here /usr/include/c++/3.4/bits/stl_map.h:332: error: forming reference to reference type `B&' /usr/include/c++/3.4/bits/stl_map.h:425: error: forming reference to reference type `A&' /usr/include/c++/3.4/bits/stl_map.h:498: error: forming reference to reference type `A&' /usr/include/c++/3.4/bits/stl_map.h:513: error: forming reference to reference type `A&' /usr/include/c++/3.4/bits/stl_map.h:525: error: forming reference to reference type `A&' /usr/include/c++/3.4/bits/stl_map.h:540: error: forming reference to reference type `A&' /usr/include/c++/3.4/bits/stl_map.h:555: error: forming reference to reference type `A&' /usr/include/c++/3.4/bits/stl_map.h:565: error: forming reference to reference type `A&' /usr/include/c++/3.4/bits/stl_map.h:575: error: forming reference to reference type `A&' /usr/include/c++/3.4/bits/stl_map.h:594: error: forming reference to reference type `A&' /usr/include/c++/3.4/bits/stl_map.h:613: error: forming reference to reference type `A&'
Was ist hier nicht richtig?
-
Was willst du damit bewirken? Verstehe ich nicht. Du kannst doch nur Objekte speichern oder halt Pointer.
std::map<A,B> // oder std::map<A*,B*>
-
Kann man den in STL-Containern keine Referenzen speichern?
Ich finde Referenzen "fuehlen" sich besser an als Pointer und arbeite deswegen lieber damit.
Hat das nen Sinn, das keine Referenzen erlaubt sind?
-
Wie speicherst du denn Referencen in z.B. einer Klasse als Member-Attribut? Ich glaub du bringst da irgendwie was durcheinander?
Würde sagen, du willst eigentlich Smartpointer benutzen. Schau dir mal shared_pointer von boost an. DAS suchst du eigentlich. Aber kannst mir ja vielleicht noch meine erste Frage beantworten?
-
Wie speicherst du denn Referencen in z.B. einer Klasse als Member-Attribut?
??
Aber kannst mir ja vielleicht noch meine erste Frage beantworten?
Hat eigentich keinen besonderen Sinn. Wie gesagt, ich bevorzuge Referenzen den Pointern.
Die erste Klasse A ist eigentlich eine ABC und ich habe lieber eine Base-reference genommen anstatt des Base-pointers.
-
Raptor schrieb:
Wie speicherst du denn Referencen in z.B. einer Klasse als Member-Attribut?
??
Verstehst du meine Frage nicht, oder weißt du darauf keine Antwort?
Raptor schrieb:
Aber kannst mir ja vielleicht noch meine erste Frage beantworten?
Hat eigentich keinen besonderen Sinn. Wie gesagt, ich bevorzuge Referenzen den Pointern.
Die erste Klasse A ist eigentlich eine ABC und ich habe lieber eine Base-reference genommen anstatt des Base-pointers.Hat eigentlich nichts mit meiner Frage zu tun.
Eigentlich hast du nicht verstanden warum ich dir die Frage gestellt habe? Mir kommt es vor, als ob du nicht weißt was du da schreibst. Ich vermute mal, du hast das mit den Referenzen nicht ganz verstanden, sonst könntest du mir meine erste Frage beantworten.
Aber ich kann dir auch keine Antwort geben, außer das du was machen willst, was irgndwie nicht richtig ist.
class A { int &b; // Reference als Member-Attribute. };
Das versuchst du mit dem Container zu machen. Und das war halt meine Frage.
Machst du aber nicht eher solche Dinge:
class A { int b; // Variable/Object als Member-Attribute. int *p; // Pointer als Member-Attribute. };
-
Artchi schrieb:
Raptor schrieb:
Wie speicherst du denn Referencen in z.B. einer Klasse als Member-Attribut?
??
Verstehst du meine Frage nicht, oder weißt du darauf keine Antwort?
Ich verstehe den Sinn der Frage nicht.
Raptor schrieb:
Aber kannst mir ja vielleicht noch meine erste Frage beantworten?
Hat eigentich keinen besonderen Sinn. Wie gesagt, ich bevorzuge Referenzen den Pointern.
Die erste Klasse A ist eigentlich eine ABC und ich habe lieber eine Base-reference genommen anstatt des Base-pointers.Hat eigentlich nichts mit meiner Frage zu tun.
Ich dachte du meintest du Frage deines ersten Posts.
Eigentlich hast du nicht verstanden warum ich dir die Frage gestellt habe? Mir kommt es vor, als ob du nicht weißt was du da schreibst. Ich vermute mal, du hast das mit den Referenzen nicht ganz verstanden, sonst könntest du mir meine erste Frage beantworten.
Ich verstehe einfach deine Intention nicht, die du mit
Wie speicherst du denn Referencen in z.B. einer Klasse als Member-Attribut?
meinst.
Aber ich kann dir auch keine Antwort geben, außer das du was machen willst, was irgndwie nicht richtig ist.
Das habe ich auch schon gemerkt.
class A { int &b; // Reference als Member-Attribute. };
Meine urspruengliche Klasse A ist leer und hat keine Referenz auf ein int. Falls du damit den Container meinst: Was ist denn falsch daran, statt des Objects selbst, einen Alias zu verwenden?
-
Eigentlich wollte ich dich nur darauf aufmerksam machen, das du eigentlich die Instanzen, die in map liegen werden, sich analog zu den Klassen-Attributen verhalten (das da auch Errors bekommst). Wollte eigentlich nur, das dir dessen bewusst wirst und weshalb das so nicht geht. Weil die von dir genannten "Alias" in dem Fall kein initialisiertes Gegenstück haben, also etwas physikalisch vorhandenes. Das ist halt irgendwie ein Widerspruch den du da versuchst. Weil Referencen nicht null zeigen können, Pointer aber schon. Variablen sind aber nicht null, kann man also auch benutzen.
void foo() { int &i; // error! kann nicht auf nichts refrenzieren. }
Ist doch ähnlich wie du es mit dem Container versuchst. Weil folgendes erst funktioniert:
void foo() { int a = 1; // Variable ist nicht null. int &i = a; }
Vielleicht hat ja jemand anderes hier eine Lösung auf Reference-Basis? Ich kann es mir aber nicht vorstellen.
Du hast drei Möglichkeiten:
1. Benutze Objekte/Variablen.
2. Benutze Pointer (hast recht, ist unkomfortabel)
3. Benutze Smartpointer, z.B. den boost::shared_ptr (mein Favorit)
-
Raptor schrieb:
Was ist denn falsch daran, statt des Objects selbst, einen Alias zu verwenden?
Was ist denn richtig daran?
Welche vorteile hättest du davon, wenn es gehen würde?Du hast nämlich noch zusätzlich folgendes Problem: wo sind denn die Objekte für die diese referenzen nur aliase sind?
Technisch ist es natürlich nicht möglich, aber was würdest du dir davon versprechen wenn es möglich wäre. Welche Vorteile würde es dir bringen die dir ein zeiger nicht bringt? ausser der 'schöneren' syntax? (wobei der unterschied a->b versus a.b nun wirklich nicht die welt ist)