Actualmente estoy trabajando en un proyecto de C++, donde a menudo aparecen matrices dinámicas. Me preguntaba, ¿cuál podría ser la forma correcta de inicializar una matriz dinámica utilizando el operador nuevo? Un colega mío me dijo que es un no-no usar nuevas dentro del constructor, ya que un constructor es una construcción que no debería ser propensa a errores o no debería fallar en absoluto, respectivamente. Ahora consideremos el siguiente ejemplo: Tenemos dos clases, un estado de clase más o menos complejo y un StateContainer de clase, que debe explicarse por sí mismo.Forma correcta de inicializar la matriz dinámica en 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;
}
}
Ahora realidad, tengo dos preguntas:
1.) ¿Está bien, para llamar nueva dentro de un constructor, o es mejor para crear un init extra() - Método para el Estado- Matriz y por qué?
2.) ¿Cuál es la mejor manera de comprobar si el nuevo tuvo éxito:
if (!ptr) std::cerr << "new failed."
o
try { /*new*/ } catch (std::bad_alloc) { /*handling*/ }
3.) Ok sus tres cuestiones; o) bajo el capó, nuevo hace una especie de
ptr = (Struct *)malloc(N*sizeof(Struct));
Y luego llame al constructor, ¿verdad?
Supongo que no está permitido el uso de 'vector'? – GManNickG
Tu colega está equivocado. Es perfectamente aceptable usar 'new' en un constructor. –