studio reales proyectos programacion libro introducción incluye herramientas fundamentos fuente español código con avanzado aplicaciones c++ segmentation-fault new-operator derived-class dynamic-memory-allocation

c++ - reales - Problema al asignar el conjunto de clases derivado con el nuevo



libro de android studio en español pdf (3)

Tengo un programa simple

$ cat a.cpp #include <iostream> class MyClass { public: virtual void check() { std::cout << "Inside MyClass/n"; } }; class MyClass2: public MyClass { public: int* a; virtual void check() { std::cout << "Inside MyClass2/n"; } }; int main() { MyClass *w, *v; w = new MyClass2[2]; v = new MyClass2; std::cout << "Calling w[0].check/n"; w[0].check(); std::cout << "Calling v->check/n"; v->check(); std::cout << "Calling w[1].check/n"; w[1].check(); } $ g++ a.cpp $ ./a.out Calling w[0].check Inside MyClass2 Calling v->check Inside MyClass2 Calling w[1].check Segmentation fault

Pensé que es posible usar algo nuevo para asignar objetos de clase derivados. Además, v-> check () parece funcionar bien.


Como parece que James desaparece, creo que debería publicar la solución correcta:

MyClass** w = new MyClass*[2]; //Note the difference from James solution! w[0] = new MyClass2; w[1] = new MyClass2; std::cout << "Calling w[0].check/n"; w[0].check(); std::cout << "Calling w[1].check/n"; w[1].check();

¡Esto debería funcionar!


Como una extensión de las soluciones propuestas por @James McNellis y @Nawaz (que son correctas), puede evitar mucha confusión al usar clases de contenedores que tiene disponibles para usted y punteros inteligentes. A saber, std::vector y std::array (dependiendo de su versión del compilador, esto puede estar en el espacio de nombres tr1 o puede necesitar descargar la biblioteca de impulso para usarlo) y shared_ptr (hay otros que también puede elegir, aunque).


w = new MyClass2[2];

Esto crea una matriz de dos objetos MyClass2 . Es del tipo MyClass2[2] . La nueva expresión devuelve un puntero al elemento inicial de esta matriz y usted asigna ese puntero a w .

w[1].check();

Esto trata w como un puntero a una matriz de objetos MyClass , no como una matriz de objetos MyClass2 .

No puede tratar una matriz de objetos de clase derivados como si fuera una matriz de objetos de clase base. Si desea poder utilizar los objetos de clase derivada, necesita una matriz de punteros:

MyClass** w = new MyClass*[2]; w[0] = new MyClass2; w[1] = new MyClass2;