【问题标题】:invalid new-expression of abstract class type抽象类类型的无效新表达式
【发布时间】:2014-07-12 16:22:59
【问题描述】:

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

【问题讨论】:

  • 或许box类有纯虚方法?
  • 显然,box 是抽象的,即它具有纯虚函数。您不能创建抽象类的实例。

标签: c++ compiler-errors abstract-class


【解决方案1】:

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

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

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

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

【讨论】:

  • 我已经定义并实现了我的类的所有方法,但仍然遇到相同的错误,请帮助
  • @BhawinParkeria 仔细看。你错过了一个。
  • 你的类可能派生自另一个具有纯虚函数的类(那些用 =0 定义的),你应该在你的类中实现它们。
【解决方案2】:

对于其他摸不着头脑的人来说,我遇到了这个错误,因为我对基类中的方法的参数之一进行了不适当的 const 限定,因此派生类成员函数没有覆盖它。所以确保你没有类似的东西

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

【讨论】:

  • 这就是为什么你应该使用override关键字。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

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

    using QueuePtr = std::unique_ptr<Queue>;
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-18
      • 1970-01-01
      相关资源
      最近更新 更多