QVector2D *未知大小

时间:2014-02-04 17:29:08

标签: c++ qt

我的问题是关于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。代码有什么问题?

1 个答案:

答案 0 :(得分:5)

  1. 不需要您的默认构造函数。成员将由编译器生成的默认构造函数默认构造。即使你有自己的构造函数,也不需要默认构造任何非POD成员。 POD成员是普通的旧数据类型,如intbool[5]。任何类或结构都将默认为您构建,因此无需明确地进行。

  2. 不需要复制构造函数。编译器将为您生成一个。赋值运算符和析构函数也是如此。这是使用正确设计的C ++类的好处。您只需使用它们,编译器就会为您生成所有样板代码。

  3. 如果您提供big three任何:析构函数,复制构造函数,赋值运算符,则必须提供所有这些。当使用C ++ 11时,除了移动构造函数之外,三巨头变成了四大。

  4. 如果您不希望该类是可复制的(您有一个非默认的析构函数,但您不想编写复制/移动构造函数或赋值运算符),那么就有一个Qt提供的宏为此:

    class MyClass {
      Q_DISABLE_COPY(MyClass)  // no semicolon!
      ...
    };
    
  5. 您忘记了.cpp文件中的#include <QVector2D>

  6. 顺便提一下,你的代码读起来像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(...);
    }