web-dev-qa-db-ja.com

抽象クラス型の無効な新しい式

現在、大学のクラス用のレイトレーサーを書いています。ファイルからシーンを読み込むために、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すべてをコンパイルしてリンクする

21
hGen

抽象クラス型「box」の無効な新しい式

エラーメッセージについて不明な点はありません。クラスboxには、実装されていないメンバーが少なくとも1つあります。これは、抽象であることを意味します。抽象クラスをインスタンス化することはできません。

これがバグの場合は、不足しているメンバーを実装してボックスクラスを修正します。

仕様による場合、ボックスから派生し、欠落しているメンバーを実装し、派生クラスを使用します。

47
nvoigt

他の人が頭をかくと、このエラーに出くわしたのは、ベースクラスのメソッドの引数の1つを不適切にconst修飾したため、派生クラスのメンバー関数がオーバーライドしていなかったためです。のようなものを持っていないことを確認してください

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

C++ 11を使用している場合、指定子「オーバーライド」を使用できます。抽象メソッドを正しくオーバーライドしていない場合、コンパイラエラーが発生します。基本クラスの抽象メソッドと正確に一致しないメソッドがある可能性が高いため、実際にはオーバーライドしていません。

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

8
B. Roberts

将来のGoogle社員のもう1つの考えられる原因

この問題は、実装しようとしているメソッドがパラメーターとしてstd::unique_ptr<Queue>(myQueue)を必要としたが、Queueクラスが抽象的であるために発生しました。 QueuePtr(myQueue)コンストラクタを次のように使用することで解決しました。

using QueuePtr = std::unique_ptr<Queue>;

代わりにパラメータリストで使用しました。これは、そのタイプのstd::unique_ptrを作成するときにイニシャライザーがQueueのコピーを作成しようとするため、これを修正します。

3