Initialisere klasse med en reference

Tags:    c++

Hej Udviklere,
et hurtigt lille spørgsmål jeg ikke synes jeg kan finde svaret på:
Hvis jeg vil have en klassevariabel der referer til en anden klasse, uden at skulle lave en ny kopi - hvordan kan jeg så gøre det rent praktisk?
Og er det bedst at bruge en reference eller en pointer?
Og hvis jeg bruger en reference, hvordan kan jeg så initialisere den?

Et eksempel med reference kunne se sådan ud:
Fold kodeboks ind/udKode 


- så har 'Species' mulighed for at tilgå 'domain' i 'Map'.

Men hvis jeg prøver at lave en constructor:

Fold kodeboks ind/udKode 


får jeg en fejlmeddelelse fra compileren (måske pga min vector<vector>> i Map?). Det løser ikke problemet at give Map en copy constructor.

Jeg har prøvet at løse det ved at gøre r_map til en pointer, og så give constructoren:
Fold kodeboks ind/udKode 


men bruger det ikke hukommelse op?

Tak!



Indlæg senest redigeret d. 20.09.2007 14:13 af Bruger #8249
8 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 1 karma
Sorter efter stemmer Sorter efter dato
Man bør undgå "friend" declerationen hvis det overhovedet er muligt. "Friend are evil!" som en af mine bekendte, som har mange år erfaring inden for emnet fortalte mig for nyligt. Der er andre måder at gøre det på, selv om det måske er en smule mere besværlige.

Jeg har prøvet at løse det ved at gøre r_map til en pointer, og så give constructoren:
Fold kodeboks ind/udKode 


men bruger det ikke hukommelse op?

Tak!


Jo du vil have et "memory leak" hvis ikke du definerer en destructor som tager sig af problemet:
Fold kodeboks ind/udKode 





Indlæg senest redigeret d. 21.09.2007 15:26 af Bruger #4414
Hvordan lyder fejlmeddelelsen?



Dette kompilerer problemfrit:

Fold kodeboks ind/udKode 








Indlæg senest redigeret d. 21.09.2007 11:06 af Bruger #8249
Dette kompilerer problemfrit:

Fold kodeboks ind/udKode 


Sorry, den lille kodestump kompilerer også uden problemer på mit system. Jeg skulle selvfølgelig have sikret mig at det kunne genskabe fejlen :$

Problemet opstår når jeg prøver at lave en vector med flere Species (jeg holder styr på alle mine speciesobjekter i en member vector i en anden klasse (class Dataset).
Denne lille modifikation replicerer min compile fejl:
Fold kodeboks ind/udKode 


Fejlmeddelsen fra MinGW:
Fold kodeboks ind/udKode 




Indlæg senest redigeret d. 21.09.2007 11:09 af Bruger #8249
Kompileren fortæller at den skal bruge en assignment operator, at den ikke kan lave en og at du ikke har givet din en.

Det bliver du nødt til for at kunne kopiere Species objekter, hvilket sker i "list.push_back(MySpecies);"

For at kunne kopiere dine Species objekter skal r_map gøres ikke const. Med assignment operatoren bliver det til:

Fold kodeboks ind/udKode 




Man bør undgå "friend" declerationen hvis det overhovedet er muligt.


Nej, brugt rigtigt kan "friend" være med til at lave et bedre design.



Tak Bertel,
det lyder som om jeg var lidt på det rigtige spor, bare det forkerte sted, med at lave en copy constructor til Map. Det er lidt synd at jeg må gøre r_map non-const, idet Species for guds skyld ikke må ændre i Map - men jeg må bare være forsigtig.
Tak igen!

Felix >> hvis der er nogle gode måder at forbedre et design der ikke bruger friend vil jeg gerne høre dem. I dette tilfælde bruger jeg den da Map indeholder en 145x165 celler 2dvector - da jeg har 3000 Species objekter sparer friend deklarationen mig for 71.775.000 kald til
Fold kodeboks ind/udKode 
hver eneste gang jeg vil lave en beregning. Det er også på grund at det store antal objekter at jeg bekymrer mig om ikke at lave for mange unødvendige kopier...



Indlæg senest redigeret d. 22.09.2007 08:35 af Bruger #8249
t