verständnissfrage
-
stehe irgentwie gerade auf dem schlauch. wie verhält sich das wenn ich in einer klasse einen vector definiert habe und den dann an eine andere klasse übergebe? wird dann nur der zeiger auf den vector kopiert oder die ganze dahintehängende speicherstruktur?
meine das so:
class a { private: std::vector<BITMAP*> vBilder; public: a(void) { pseudocode: füge 10 elemente dem vector hinzu. } const std::vector<BITMAP*> gebeBilder(void) { return vBilder; } }; class b { private: std::vector<BITMAP*> vBilder2; public: b(std::vector<BITMAP*> bi) { vBilder2=bi; } }; dann instanzere ich a oa(); b ob(a.gebeBilder());meine fragen:
* vBilder aus klasse "a" stellt doch eingentlich nur einen zeiger dar, oder?
* beim übergeben dieses zeigers in dem konstruktor von klasse "b" an die variable "vBilder2" wird doch nur eine kopie des zeigers in "vBilder2" übertragen, oder? meine, es wird nicht die komplette speicherstruktur, welche an "vBilder" hängt(mit allen allokierten einzelelementen) mitkopiert?
hoffe das klingt nicht zu doof.
-
* vBilder aus klasse "a" stellt doch eingentlich nur einen zeiger dar, oder?
* beim übergeben dieses zeigers in dem konstruktor von klasse "b" an die variable "vBilder2" wird doch nur eine kopie des zeigers in "vBilder2" übertragen, oder? meine, es wird nicht die komplette speicherstruktur, welche an "vBilder" hängt(mit allen allokierten einzelelementen) mitkopiert?
hoffe das klingt nicht zu doof.Nein. Ein std::vector kopiert dir jedesmal den gesamten Inhalt. Die Zeiger, die enthalten sind werden auch kopiert. Es wird einfach eine Exakte Kopie davon erstellt. Wenn du den enhaltenen Zeigern neuen Speicher zuweisen willst, musst du das selbst machen. Am besten wahrscheinlich mit einem eigenen Objekt, dass dafür verantworlich ist und welches du dann im vector speicherst, anstatt die rohen Zeiger.
-
zum glück hab ich gefragt. ich wollte einfach nur einen zeiger auf den angelegten vector einer anderen klasse übergeben, damit diese damit ebenfalls arbeiten kann. er sollte nicht das ganze objekt kopieren.
-
Dann kannst du ganz einfach eine const Referenz machen:
public: b(std::vector<BITMAP*> const & bi) { vBilder2=bi; }Da wird nicht der ganze vector kopiert, sondern lediglich eine Referenz übergeben. (Allerdings macht es dann nicht viel Sinn, wenn du den dann gleich einem anderen vector mit dem = zuweist, weil das ganze halt da kopiert wird. ;))