我的问题是关于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。代码有什么问题?
答案 0 :(得分:5)
不需要您的默认构造函数。成员将由编译器生成的默认构造函数默认构造。即使你有自己的构造函数,也不需要默认构造任何非POD成员。 POD成员是普通的旧数据类型,如int
或bool[5]
。任何类或结构都将默认为您构建,因此无需明确地进行。
不需要复制构造函数。编译器将为您生成一个。赋值运算符和析构函数也是如此。这是使用正确设计的C ++类的好处。您只需使用它们,编译器就会为您生成所有样板代码。
如果您提供big three的任何:析构函数,复制构造函数,赋值运算符,则必须提供所有这些。当使用C ++ 11时,除了移动构造函数之外,三巨头变成了四大。
如果您不希望该类是可复制的(您有一个非默认的析构函数,但您不想编写复制/移动构造函数或赋值运算符),那么就有一个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(...);
}