抽象类类型的新表达式无效

invalid new-expression of abstract class type

本文关键字:表达式 无效 类型 抽象类      更新时间:2023-10-16

我目前正在为一个大学班级编写一个光线追踪器。为了从文件中加载场景,我编写了一个sdloader来读取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来编译和链接所有

抽象类类型'box'的new-expression无效

错误信息没有什么不清楚的。您的类box至少有一个成员没有实现,这意味着它是抽象的。不能实例化抽象类。

如果这是一个错误,通过实现丢失的成员来修复您的box类。

如果是设计的,则从box派生,实现缺少的成员并使用派生类

让其他人挠头,我遇到这个错误是因为我在基类中对方法的一个参数进行了不适当的const限定,因此派生类成员函数没有覆盖它。所以要确保没有像

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

如果你使用c++ 11,你可以使用说明符"override",如果你没有正确覆盖抽象方法,它会给你一个编译错误。你可能有一个方法与基类中的抽象方法不完全匹配,所以你实际上没有重写它。

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

另一个可能导致未来谷歌人的原因

我有这个问题,因为我试图实现的方法需要一个std::unique_ptr<Queue>(myQueue)作为参数,但Queue类是抽象的。我通过使用QueuePtr(myQueue)构造函数解决了这个问题,如下所示:

using QueuePtr = std::unique_ptr<Queue>;

并在参数列表中使用它。这修复了它,因为当您创建std::unique_ptr的类型时,初始化器试图创建Queue的副本,这是不可能发生的。