1. ホーム
  2. c++

[解決済み】抽象クラス型の無効なnew-expression

2022-01-20 17:50:42

質問

現在、大学の授業でレイトレーサーを書いています。 ファイルからシーンをロードするために、私はsdfファイルを読み込んでシーンを作成するsdfloaderを書きました。

このローダーをコンパイルしようとすると、次のようなエラーが発生します。

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 は、実装されていないメンバが少なくとも1つあり、それは抽象的であることを意味します。抽象クラスはインスタンス化できません。

もしこれがバグであれば、足りないメンバーを実装してボックスクラスを修正します。

設計上の問題であれば、box から派生して、不足するメンバを実装し、その派生クラスを使用します。