Attualmente sto lavorando a un progetto C++, dove appaiono spesso gli array dinamici. Mi chiedevo, quale potrebbe essere il modo corretto per inizializzare un array dinamico usando il nuovo operatore? Un mio collega mi ha detto che è un no-no usare new all'interno del costruttore, dal momento che un costruttore è un costrutto che non dovrebbe essere incline agli errori o non dovrebbe fallire del tutto, rispettivamente. Consideriamo ora il seguente esempio: Abbiamo due classi, uno stato di classe più o meno complesso e uno StateContainer di classe, che dovrebbe essere auto-spiegato.Modo corretto per inizializzare la matrice dinamica in C++
class State {
private:
unsigned smth;
public:
State();
State(unsigned s);
};
class StateContainer {
private:
unsigned long nStates;
State *states;
public:
StateContainer();
StateContainer(unsigned long n);
virtual ~StateContainer();
};
StateContainer::StateContainer() {
nStates = SOME_DEFINE_N_STATES;
states = new State[nStates];
if (!states) {
// Error handling
}
}
StateContainer::StateContainer(unsigned long n) {
nStates = n;
try {
states = new State[nStates]
} catch (std::bad_alloc &e) {
// Error handling
}
}
StateContainer::~StateContainer() {
if (states) {
delete[] states;
states = 0;
}
}
Ora in realtà, ho due domande:
1.) è ok, a indire nuove all'interno di un costruttore, o è meglio creare un init supplementare() - Metodo per la Stato- Matrice e perché?
2.) Che cosa è il modo migliore per verificare se il nuovo riuscito:
if (!ptr) std::cerr << "new failed."
o
try { /*new*/ } catch (std::bad_alloc) { /*handling*/ }
3.) Ok le sue tre questioni; o) sotto il cofano, nuova fa una sorta di
ptr = (Struct *)malloc(N*sizeof(Struct));
E quindi chiamare il costruttore, giusto?
Suppongo che tu non sia autorizzato a usare 'vector'? – GManNickG
Il tuo collega è sbagliato. È perfettamente accettabile usare 'new' in un costruttore. –