0

このメッシュクラスは2つのファイル(mesh.hとmesh.cpp)に分散しています。これで、(Vector2dタイプの)位置変数を追加するまで完全に機能しました。変数を追加しても通常どおり実行されましたが、関数の1つで使用するとすぐに、変数の束が宣言されていないというエラーが発生しました。私がしたことを正確に示しましょう:

class Mesh{
  public:
  Mesh() {
     Rectangle;
     position = Vector2d(0,0);
  }

  Mesh(Vector2dVector Vertices) {
    Set(Vertices);
    position = Vector2d(0,0);
  };

  Vector2dVector GetVetices() { return vertices; };
  Vector2d SetPosition(Vector2d p) { position = p; }
  float GetVertexCount() { return vertexCount; };
  float GetTriangleCount() { return triangleCount; }

  void  Set(Vector2dVector Vertices){
    Triangulate::Process(Vertices,vertices);
    vertexCount = vertices.size();
    triangleCount = vertexCount/3;
  };

  void Render();
  static Mesh Circle();
  static Mesh Rectangle();
  static Mesh Triangle();

  private:
  Vector2dVector vertices;
  Vector2d position;
  int triangleCount;
  int vertexCount;
};

これは問題なく実行されましたが、これをファイルmesh.cppの関数renderに追加すると、エラーが発生しました

#include "mesh.h"

void Mesh::Render() {
 glBegin (GL_TRIANGLES); 
     for (int i=0; i<GetTriangleCount(); i++) {
         const Vector2d &p1 = vertices[i*3+0];
         const Vector2d &p2 = vertices[i*3+1];
         const Vector2d &p3 = vertices[i*3+2];
         glVertex2f(position.GetX() + p1.GetX(),position.GetY() + p1.GetY());
         glVertex2f(position.GetX() + p2.GetX(),position.GetY() + p2.GetY());
         glVertex2f(position.GetX() + p3.GetX(),position.GetY() + p3.GetY());
     }
 glEnd ();
}

これがエラーメッセージです

In file included from main.cpp:3:
mesh.h: In constructor `Mesh::Mesh()':
mesh.h:5: error: no matching function for call to `Vector2d::Vector2d()'
triangulation.h:43: note: candidates are: Vector2d::Vector2d(const Vector2d&)
triangulation.h:46: note:                 Vector2d::Vector2d(float, float)
mesh.h: In constructor `Mesh::Mesh(Vector2dVector)':
mesh.h:10: error: no matching function for call to `Vector2d::Vector2d()'

そのため、関数からすべてのposition.Get ..メソッド呼び出しを削除した後でも、追加して削除する前はエラーが発生しませんでしたが、同じエラーが発生しました。私は約4年間コンピューターを使用してきましたが、コンピューターがこのように動作するのを見たことがありません。誰かが私が間違っていることを私に説明してくれるなら、それは非常に役に立ちます。ところで、私はDevC ++バージョン4.9.9.2を使用しているので、これと関係があると思います。

読んでくれてありがとう、すみません、すっごく長いです。

4

2 に答える 2

5

Mesh::Mesh()コンストラクターがあります。Vector2dコンパイラは、クラス(positionインスタンス変数)の適切なコンストラクタ(引数なし)を呼び出すことができないと文句を言っています。次のいずれかを行う必要があります。

  • Vector2d::Vector2d()コンストラクターを提供する、または
  • 次のように、から適切なパラメータを使用して、の既存のVector2dコンストラクタの1つを呼び出します。positionMesh::Mesh()

    Mesh(): position(0, 0) {
    }
    

    (書かれているように効果がないので取り出しました。おそらくその関数をで呼び出しRectangle;たいですか?)Rectangle();

于 2012-10-08T18:58:47.747 に答える
4

コンストラクター本体ではなく、コンストラクターの初期化子リストでベクトルを初期化する必要があります。

Mesh(): position(0,0) {
   Rectangle;
}

Mesh(Vector2dVector Vertices) : position(0,0) {
  Set(Vertices);
};

それ以外の場合positionはデフォルトで構築されますが、デフォルトのコンストラクターを定義しなかったため失敗します。

于 2012-10-08T18:58:42.450 に答える