将私有变量添加到类[C ++]时为什么会出错?

时间:2012-10-08 18:55:06

标签: c++ oop class

我有这个网格类,它分布在两个文件(mesh.h和mesh.cpp)上。现在它工作得很好,直到我为它添加了一个位置变量(Vector2d类型)。当我添加变量时,它仍然正常运行,但是当我在其中一个函数中使用它时,它给了我一个错误,说我的一些变量没有被声明。让我告诉你我到底做了什么:

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的函数渲染时它给了我一个错误

#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所以我认为它与它有关。

感谢阅读,对不起,太久了。

2 个答案:

答案 0 :(得分:5)

你有一个Mesh::Mesh()构造函数。编译器抱怨它不能为Vector2d类(对于position实例变量)调用适当的构造函数(没有参数)。你必须:

  • 提供Vector2d::Vector2d()构造函数或
  • 使用Vector2d中的适当参数调用position的{​​{1}}个现有Mesh::Mesh()构造函数之一,如下所示:

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

    (我拿出了Rectangle;,因为写完了会产生影响。你是否想要用Rectangle(); 调用该函数?)

答案 1 :(得分:4)

您必须在构造函数的初始化列表中初始化向量,而不是在构造函数体中:

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

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

否则position将被默认构造,由于您没有定义默认构造函数,因此会失败。