Zeiger auf std::vector ?
-
Hi,
ist es möglich Zeiger auf einen vector zu bekommen?
// main.cpp #include <vector> #include "test.h" int main() { std::vector<long> blub(5, 0); Based based(blub); based.display(); Derived derived(blub); derived.display(); return 0; } // test.h #include <vector> #include <iostream> class Based { public: Based(std::vector<long> &v); ~Based() {}; std::vector<long>& getVector() {return m_value;} void display() const; private: std::vector<long> m_value; }; Based::Based(std::vector<long> &v) : m_value(v) {} void Based::display() const { for(long i=0; i<m_value.size(); i++) std::cout << value[i]; std::cout << std::endl; } class Derived : public Based { public: Derived(std::vector<long>& v); ~Derived() {}; }; Derived::Derived(std::vector<long>& v) : Based(v) { // statt... for(long i=0; i<getVector().size(); i++) getVector()[i] = 42; // ...würde ich lieber folgendes machen: std::vector<long> *pVector = getVector(); for(long i=0; i<pVector.size(); i++) pVector[i] = 42; }
Ist die ganze Konstruktion so überhaupt sinnvoll?
Denn ich habe mir in diesem Zusammenhang noch eine weitere Frage gestellt:
Man könnte die Membervariable
std::vector<long> m_value;
als Pointer
std::vector<long> *m_pValue;
anlegen.Allerdings hätte man dann das Problem, dass dem Konstruktor ein bereits existierendes vector-Objekt übergeben werden muss.
Wenn man nun aber einen Konstruktor hätte, der ein ganz normales Array übernimmt, anstelle eines std::vectors, dann müsste man in diesem Kontruktor ein vector-Objekt anlegen, die Daten des Arrays in dieses Objekt kopieren und anschließend den Pointer *m_pValue auf das im Konstruktor erstellte Objekt setzen.
Allerdings würde beim Verlassen des Konstruktors, das gerade angelegte vector-Objekt zerstört werden, so dass mein Pointer *m_pValue ins Nirvana ginge...Bsp:
Based::Based(long* myarray, long size) { std::vector<long> temp(myarray[0], myarray[0]+size); *m_pValue = temp; }
Wie könnte man das von Konzept her besser machen?
-
Hol dir doch ne Referenz:
std::vector<long> &ref = getVector(); for(int i = 0; i < ref.size(); ++i) ref[i] = 42;
-
1. Es gibt andere Methoden, die Elemente eines std::vector mit einem Wert zu versehen
2. Wieso willst du denn Zeiger benutzen? Wenn du dir die ständigen Funktionsaufrufe (getVector) sparen willst, mach's doch mit 'ner Referenz (wie 0xdeadbeef), und wenn du doch einen Zeiger benutzen willst, dann muss getVector erst mal einen Zeiger zurückliefern, dann musst du Methoden mit "->" aufrufen (Zeiger müssen erst dereferenziert werden) und alles wird nur noch umständlicher als mit Referenzen, die das ja praktisch "automatisch " für dich machen...