我的问题与Qt编译器错误有关:“QVector2D *:未知大小”

我有一个Mesn类,其中包含一些用于网格定义的数据,如下所示。

class Mesh
{

public:

Mesh();
Mesh(const Mesh &other);
~Mesh();

private:

QVector<QVector3D> m_colors;
QVector<int> m_faces;
QVector<int> m_lines;
QVector<QVector3D> m_normals;
QVector<QVector2D> m_uvs;
QVector<QVector3D> m_vertices;
};

在cpp文件中,我已经拥有了。
Mesh::Mesh()
{
m_colors   = QVector<QVector3D>();
m_faces    = QVector<int>();
m_lines    = QVector<int>();
m_normals  = QVector<QVector3D>();
m_uvs      = QVector<QVector2D>();
m_vertices = QVector<QVector3D>();
}

Mesh::Mesh(const Mesh &other)
{
m_colors   = other.GetColors();
m_faces    = other.GetFaces();
m_lines    = other.GetLines();
m_normals  = other.GetNormals();
m_uvs      = other.GetUVs();
m_vertices = other.GetVertices();
}

Mesh::~Mesh()
{

}

但是我遇到了仅针对m_uvs提到的编译器错误。代码有什么问题?

最佳答案

  • 不需要您的默认构造函数。成员将由编译器生成的默认构造函数进行默认构造。即使您有自己的构造函数,也不需要默认构造任何非POD成员。 POD成员是普通的旧数据类型,例如intbool[5]。任何属于类或结构的东西都将默认为您构造,因此无需显式地执行。
  • 不需要复制构造函数。编译器将为您生成一个。赋值运算符和析构函数也是如此。这就是使用正确设计的C++类的好处。您只需要使用它们,编译器就会为您完成所有样板代码的生成。
  • 如果提供big three的任何一个:析构函数,复制构造函数,赋值运算符,则必须全部提供。当使用C++ 11时,三重功能通过添加move构造函数成为三重功能。
  • 如果您不希望类可复制(您有一个非默认的析构函数,但又不想编写复制/移动构造函数或赋值运算符),则可以使用Qt提供的宏:
    class MyClass {
      Q_DISABLE_COPY(MyClass)  // no semicolon!
      ...
    };
    
  • 您忘记了.cpp文件中的#include <QVector2D>

  • 顺便说一句,您的代码读起来就像Delphi / Borland Pascal代码一样,与C++相比,编译器几乎没有帮助。在C++中,如果您使用正确设计的C++类作为类的成员,则无需手动生成复制构造函数,赋值运算符或析构函数。

    本质上,您的Mesh类可以如下所示:
    // header
    
    class Mesh
    {
      QVector<QVector3D> m_colors;
      QVector<int> m_faces;
      QVector<int> m_lines;
      QVector<QVector3D> m_normals;
      QVector<QVector2D> m_uvs;
      QVector<QVector3D> m_vertices;
    public:
      Mesh();
      // You always need a const getter. The non-const getter is optional
      // if you allow modification of the member.
      QVector<QVector3D> & colors() { return m_colors; }
      const QVector<QVector3D> & colors() const { return m_colors; }
      // etc.
    };
    
    // implementation
    
    Mesh::Mesh()
    {}
    
    // example
    
    void test() {
      Mesh m;
      QVector<QVector3D> myColors;
      m.colors() = myColors; // works like a setter
      const Mesh cm;
      cm.colors() = myColors; // won't compile since cm is const
      QVector<QVector3D> colors = cm.colors(); // assigns to a local copy that can be changed
      colors << QVector3D(...);
    }
    

    08-18 13:34