我目前正在为大学课程编写光线跟踪器。 为了从文件加载场景,我写了一个sdfloader来读取sdf文件并为其创建场景。
如果我现在要编译加载程序,我会收到以下错误:
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]));
^
我试图找到一个解决方案,但失败了。
sdf_loader类如下所示:
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_;
};
在我的sdf加载器实现中我编写了方法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]));
}
并且对于每个其他形状都进行相同的调用。
我的代码中的问题在哪里?我真的没有看到它
我正在使用g++-4.9 - std=c++0x
来编译和链接所有内容
答案 0 :(得分:46)
抽象类类型'box'的无效new-expression
关于错误消息,没有什么不清楚的。您的班级box
至少有一个未实现的成员,这意味着它是抽象的。您无法实例化抽象类。
如果这是一个错误,请通过实现缺少的成员来修复您的box类。
如果是设计,从框中派生,实现缺少的成员并使用派生类。
答案 1 :(得分:8)
如果你使用C ++ 11,你可以使用说明符" override",如果你没有正确地覆盖抽象方法,它会给你一个编译器错误。您可能有一个方法与基类中的抽象方法不完全匹配,因此您实际上并没有覆盖它。
答案 2 :(得分:6)
对于其他人摸不着头脑,我遇到了这个错误,因为我对基类中的方法有一个不合格的const限定参数,所以派生类成员函数并没有超越它。所以请确保你没有像
这样的东西class Base
{
public:
virtual void foo(int a, const int b) = 0;
}
class D: public Base
{
public:
void foo(int a, int b){};
}
答案 3 :(得分:2)
我遇到了这个问题,因为我尝试实现的方法需要std::unique_ptr<Queue>(myQueue)
作为参数,但Queue
类是抽象的。我通过使用像这样的QueuePtr(myQueue)
构造函数来解决这个问题:
using QueuePtr = std::unique_ptr<Queue>;
并在参数列表中使用它。这样可以解决问题,因为初始化程序在您创建Queue
类型时会尝试创建std::unique_ptr
的副本,而这种情况不会发生。