2013-02-27 1 views
6

Wie initialisieren wir einen std :: Vektor in einem Klassenkonstruktor in C++?Wie initialisieren wir einen Std :: Vektor in einem Klassenkonstruktor in C++?

class MyClass 
{ 
public: 
    MyClass(int p_Var1, int* p_Vector) : Var1(p_Var1) //, Initialize std::vector - MyVector with p_Vector 
    { 
    }; 
    ~MyClass(void); 
private: 
    int Var1; 
    std::vector<int> MyVector; 
}; 
+0

I wie möchten Sie Ihren 'std :: vector' initialisieren? (Welche spezielle Form seiner Konstruktoren möchten Sie verwenden?) –

+1

Es kommt darauf an. Was meinst du mit "initialisieren"? Gegen welche Version des C++ Standards arbeiten Sie? – Johnsyweb

+0

@Mark Garcia mit int * p_Vector – CLearner

Antwort

10

Zuerst myVector wird initialisiert, auch wenn Sie nichts tun, da es nicht-triviale Konstrukteure. Wenn Sie initialisieren möchten, geben Sie einen Zeiger auf eine Sequenz von int, Sie müssen auch die Länge kennen. Wenn Sie sowohl einen Zeiger und die Länge haben, können Sie tun:

: myVector(pInitialValues, pInitialValues + length) 

Alternativ (und mehr idiomatisch), werden Sie die Anrufer lassen tun die Zugabe, und haben den Konstruktor zwei Zeiger nehmen, eine Anfang und ein Ende: (. Wenn der Anrufer unter Verwendung von 11 C++ ist, er diese von einem C Stil Array std::begin() und std::end() erhalten kann)

: myVector(pBegin, pEnd) 

EDIT:

Nur um es klar zu machen: nur int* liefert keine Informationen genug, um etwas zu tun. Ein int* verweist auf das erste Element eines C-artigen Arrays ; Sie müssen auch einen Weg von finden das Ende: eine Element-Zählung, ein Ende-Zeiger, etc. In Sonderfälle können andere Techniken verwendet werden; Wenn das C-Format Array nur nicht negative Zahlen enthält, können Sie -1 als ein Sentinal und etwas wie : myVector(pVector, std::find( pVector, NULL, -1)) verwenden. Dies sind jedoch Sonderfälle.

+1

* da es nicht-triviale Konstruktoren * hat? Sollte es nicht * sein, da es den Standardkonstruktor * hat? Und da ist ein Kopierkonstruktor :) –

+0

@BЈovић Bin mir nicht sicher was genau da sein soll. Formal ist es ein nicht-trivialer Konstruktor, der mit den angegebenen Argumenten aufgerufen werden kann (oder ein nicht-trivialer Standardkonstruktor, wenn keine Initialisierung angegeben ist). In der Praxis gibt es jedoch nicht-triviale Konstruktoren, die die Datenelemente nicht initialisieren, einschließlich der vom Compiler erzeugten Daten (z. B. wenn die Klasse virtuelle Funktionen hat). Während also der Standard das Mitglied als "initialisiert" betrachten könnte, würde es durch keine vernünftige Bedeutung des Wortes initialisiert werden. (Aber 'vector' hat einen benutzerdefinierten ctor, der das Richtige tut.) –

Verwandte Themen