2013-02-27 24 views
6

Jak zainicjować std :: vector w konstruktorze klasy w C++?Jak zainicjować std :: vector w konstruktorze klasy w 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

W jaki sposób chcesz zainicjować swój 'std :: vector'? (Jaka konkretna forma jego konstruktorów chcesz użyć?) –

+1

To zależy. Co masz na myśli przez "zainicjować"? W stosunku do której wersji standardu C++ pracujesz? – Johnsyweb

+0

@ Mark Garcia z int * p_Vector – CLearner

Odpowiedz

10

Najpierw myVector zostanie zainicjowany, nawet jeśli nic, ponieważ ma niebanalną konstruktorzy zrobić. Jeśli chcesz zainicjować go podając wskaźnik do sekwencji int, musisz również znać długość. Jeśli masz zarówno wskaźnik i długości, można zrobić:

: myVector(pInitialValues, pInitialValues + length) 

Alternatywnie (i więcej idiomatically), musisz pozwolić rozmówcy zrobić dodatek i mieć konstruktor ma dwa wskaźniki, się początek i koniec: (. Jeśli rozmówca używa C++ 11, może on uzyskać je od tablica C styl używając std::begin() i std::end())

: myVector(pBegin, pEnd) 

EDYTOWANIE:

Po prostu, aby było idealnie jasne: tylko int* nie zapewnia wystarczającej informacji, aby zrobić cokolwiek. int* wskazuje na pierwszy element tablicy w stylu C; potrzebujesz również jakiegoś sposobu na znalezienie końca: liczby elementów, wskaźnika końcowego itp. W specjalnych przypadkach można użyć innych technik; to jest, jeśli tablica w stylu C zawiera tylko liczby nieujemne, można użyć -1 jako znacznika i coś w rodzaju : myVector(pVector, std::find( pVector, NULL, -1)). Są to jednak przypadki szczególne.

+1

* ponieważ ma ona nietrywialnych konstruktorów *? Czy nie powinno to być *, ponieważ ma domyślny konstruktor *? I jest tam konstruktor kopii :) –

+0

@ BЈовић Nie wiem, co dokładnie powinno tam być. Formalnie jest to nietrywialny konstruktor, który można wywołać z podanymi argumentami (lub nietrywialnym domyślnym konstruktorem, jeśli nie określono żadnej inicjalizacji). Praktycznie jednak istnieją nietrywialne konstruktory, które nie mogą inicjować elementów danych, w tym generowanych przez kompilator (np. Jeśli klasa ma funkcje wirtualne). Więc podczas gdy standard może uważać członka za "zainicjowany", nie zostanie on zainicjalizowany przez jakiekolwiek sensowne znaczenie tego słowa. (Ale 'vector' ma zdefiniowany przez użytkownika ctor, który robi to, co trzeba). –

Powiązane problemy