抽象类类型的无效new-expression

hGe*_*Gen 22 c++ abstract-class compiler-errors

我目前正在为大学班写一个光线跟踪器.为了从文件加载场景,我写了一个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]));
                                                      ^
Run Code Online (Sandbox Code Playgroud)

我试图找到一个解决方案,但失败了.

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_;
};
Run Code Online (Sandbox Code Playgroud)

在我的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]));
    }
Run Code Online (Sandbox Code Playgroud)

而对于其他每个形状都是相同的.

我的代码中的问题在哪里?我真的没有看到它

g++-4.9 - std=c++0x用来编译和链接一切

nvo*_*igt 49

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

关于错误消息没有什么不清楚的.您的类box至少有一个未实现的成员,这意味着它是抽象的.您无法实例化抽象类.

如果这是一个错误,请通过实现缺少的成员来修复您的box类.

如果它是设计的,派生自框,实现缺少的成员并使用派生类.

  • @BhawinParkeria看起来更难.你错过了一个. (7认同)
  • 您的类可能派生自另一个具有纯虚函数的类(那些定义为= 0的类),您应该在类中实现它们. (3认同)

小智 10

如果使用C++ 11,则可以使用说明符"override",如果未正确覆盖抽象方法,则会出现编译器错误.您可能有一个方法与基类中的抽象方法不完全匹配,因此您实际上并没有覆盖它.

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


小智 10

对于其他人摸不着头脑,我遇到了这个错误,因为我对基类中的方法没有任何const限定的参数,所以派生类成员函数并没有超越它.所以要确保你没有类似的东西

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

  • 这就是为什么你应该使用“override”关键字。 (4认同)

Jon*_*rum 5

未来谷歌员工的另一个可能原因

我遇到这个问题是因为我试图实现的方法需要 astd::unique_ptr<Queue>(myQueue)作为参数,但该类Queue是抽象的。我通过使用QueuePtr(myQueue)像这样的构造函数解决了这个问题:

using QueuePtr = std::unique_ptr<Queue>;
Run Code Online (Sandbox Code Playgroud)

并在参数列表中使用它。Queue这可以解决这个问题,因为初始化程序会在您创建其类型时尝试创建一个副本std::unique_ptr,但这是不可能发生的。