2013-02-27 8 views
6

Come inizializzare un vettore std :: in un costruttore di classi in C++?Come inizializzare un vettore std :: in un costruttore di classi 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

In che modo si desidera inizializzare 'std :: vector'? (Quale forma specifica dei suoi costruttori vuoi usare?) –

+1

Dipende. Cosa intendi con "inizializzare"? Contro quale versione di standard C++ stai lavorando? – Johnsyweb

+0

@Mark Garcia con int * p_Vector – CLearner

risposta

10

In primo luogo, myVector verrà inizializzato, anche se non fate niente, dal momento che ha costruttori non banali. Se si desidera inizializzare dato un puntatore a una sequenza di int, sarà necessario conoscere la lunghezza anche per . Se si dispone di un puntatore e la lunghezza, si può fare:

: myVector(pInitialValues, pInitialValues + length) 

In alternativa (e più idiomaticamente), si lascia che il chiamante fare l'aggiunta, e hanno il costruttore prendere due puntatori, un inizio e fine: (. Se il chiamante è usando C++ 11, si possono ottenere questi da una matrice stile C usando std::begin() e std::end())

: myVector(pBegin, pEnd) 

EDIT:

solo per rendere perfettamente chiaro: solo un int* non fornisce informazioni sufficienti per fare qualsiasi cosa. Un int* punta al primo elemento di una matrice di stili C; è anche necessario un modo per trovare alla fine: un conteggio di elementi, un puntatore finale, ecc. Nei casi speciali , è possibile utilizzare altre tecniche; Ad esempio, se l'array di stile C contiene solo numeri non negativi, è possibile utilizzare come sentinella, e . Questi sono casi speciali, comunque.

+1

* dal momento che ha costruttori non banali *? Non dovrebbe essere * dal momento che ha il costruttore predefinito *? E c'è un costruttore di copie :) –

+0

@ BЈовић Non sai esattamente cosa dovrebbe essere lì. Formalmente, è un costruttore non banale che può essere chiamato con gli argomenti forniti (o un costruttore di default non banale, se non è specificata alcuna inizializzazione). Praticamente, tuttavia, esistono costruttori non banali che non inizializzano i membri dei dati, compresi quelli generati dal compilatore (ad esempio se la classe ha funzioni virtuali). Quindi, mentre lo standard potrebbe considerare il membro "inizializzato", non sarebbe inizializzato da alcun significato ragionevole della parola. (Ma 'vector' ha un ctor definito dall'utente che fa la cosa giusta.) –

Problemi correlati