2014-02-04 7 views
2

Моя проблема об ошибке компилятора Qt: «QVector2D *: неизвестен размер»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

Вам нужен '# include' файл с определением' QVector2D'. –

ответ

5
  1. Ваш конструктор по умолчанию не нужен. Члены будут построены по умолчанию с помощью конструктора по умолчанию, созданного компилятором. Даже если у вас есть свой собственный конструктор, вам не нужно создавать по умолчанию любые члены, не являющиеся членами POD. Члены POD представляют собой простые старые типы данных, такие как int или bool[5]. Все, что является классом или структурой, будет по умолчанию построено для вас, поэтому нет необходимости делать это явно.

  2. Конструктор копирования не требуется. Компилятор будет генерировать один для вас. То же самое касается оператора присваивания и деструктора. Это преимущество использования правильно разработанных классов C++. Вы просто используете их, компилятор делает для вас все генерирование кода шаблонов.

  3. Если вы предоставляете любой в big three: деструктор, конструктор копирования, оператор присваивания, вы должны предоставить все из них. При использовании C++ 11 большая тройка становится большой четверкой с добавлением конструктора перемещения.

  4. Если вы не хотите, чтобы класс был доступен для копирования (у вас есть деструктор не по умолчанию, но вы не хотите писать конструкторы copy/move или оператор присваивания), есть макрос, предоставленный Qt для что:

    class MyClass { 
        Q_DISABLE_COPY(MyClass) // no semicolon! 
        ... 
    }; 
    
  5. Вы забыли #include <QVector2D> в файле .cpp.

Кстати, ваш код выглядит как 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(...); 
} 
+0

Да, включая QVector2D, решена моя проблема. Я часто забываю об этом. Кстати, что это за конструктор движений, я буду искать его. Я делаю такие методы доступа к данным. "inline QVector GetColors() const {return m_colors;}" –

+0

@ CahitBurakKüçüksütcü Ваши методы 'Get' возвращают копии данных, это лишние накладные расходы. Вместо этого вы должны вернуть ссылку. В стиле Qt возвращающий ссылку получатель не имеет префикса 'get', так как вы можете использовать его для обоих * get * и * set * значение. –

+0

@ CahitBurakKüçüksütcü Если вам нужна копия данных, вы можете явно назначить из ссылки, возвращаемой getter, локальной переменной. Я продемонстрировал код примера, чтобы продемонстрировать это. –

Смежные вопросы