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.
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){};
}