metodo interfaces implementación implementacion ejemplos ejemplo clases clase abstracto abstractas abstracta c++ compiler-errors abstract-class

c++ - interfaces - implementación de clases abstractas



nueva expresión no válida del tipo de clase abstracta (4)

Actualmente estoy escribiendo un rayo de rayos para una clase universitaria. Para cargar escenas desde archivos, escribí un sdfloader para leer archivos sdf y crear escenas para ellos.

si ahora quiero compilar el cargador obtengo el siguiente error:

rc/sdf_loader.cpp: In member function ''void SDFloader::add_shape(std::istringstream&)'': src/sdf_loader.cpp:95:58: error: invalid new-expression of abstract class type ''box'' &scene_.materials[mat])); ^

Intenté encontrar una solución pero fallé.

La clase sdf_loader se parece a lo siguiente:

class SDFloader { public: SDFloader(); ~SDFloader(); Scene const& scene() const; void read(std::string file); private: void add_material(std::istringstream&); void add_shape(std::istringstream&); void add_light(std::istringstream&); void add_camera(std::istringstream&); void apply_transformation(std::istringstream&); private: Scene scene_; };

en mi implementación del cargador sdf escribí el método read ():

void SDFloader::add_shape(std::istringstream& iss) { std::string name; iss >> name; if(name == "box") { double x1,y1,z1,x2,y2,z2; std::string mat; iss >> name >> x1 >> y1 >> z1 >> x2 >> y2 >> z2 >> mat; scene_.shapes.insert(new box(point(x1,y1,z1), point(x2,y2,z2), name, &scene_.materials[mat])); }

y para cualquier otra forma las mismas llamadas.

¿Dónde está el problema en mi código? Realmente no lo veo

Estoy usando g++-4.9 - std=c++0x para compilar y vincular todo


nueva expresión no válida del tipo de clase abstracta ''caja''

No hay nada claro sobre el mensaje de error. Su box clase tiene al menos un miembro que no está implementado, lo que significa que es abstracto. No puedes instanciar una clase abstracta.

Si esto es un error, arregle su clase de caja implementando los miembros faltantes.

Si es por diseño, derive de la caja, implemente los miembros faltantes y use la clase derivada.


Otra posible causa para futuros Googlers

Tuve este problema porque un método que estaba intentando implementar requería un std::unique_ptr<Queue>(myQueue) , pero la clase Queue es abstracta. QueuePtr(myQueue) eso usando un QueuePtr(myQueue) como este:

using QueuePtr = std::unique_ptr<Queue>;

y lo usé en la lista de parámetros en su lugar. Esto lo soluciona porque el inicializador intenta crear una copia de la Queue cuando std::unique_ptr un std::unique_ptr de su tipo, lo cual no puede suceder.


Si usa C ++ 11, puede usar el especificador "anular", y le dará un error de compilación si no está anulando correctamente un método abstracto. Probablemente tenga un método que no coincida exactamente con un método abstracto en la clase base, por lo que en realidad no lo está anulando.

http://en.cppreference.com/w/cpp/language/override


para otros que se rascaban la cabeza, me encontré con este error porque había calificado de forma inadecuada uno de los argumentos de un método en una clase base, por lo que las funciones de miembro de clase derivadas no lo superaban. así que asegúrate de no tener algo como

class Base { public: virtual void foo(int a, const int b) = 0; } class D: public Base { public: void foo(int a, int b){}; }