定義嵌套結構體 Triangle3D 包含三個 Vertex3D 成員時,若 Vertex3D 只有帶參構造函數而無默認構造函數,Triangle3D 的構造函數必須在初始化列表中顯式初始化所有成員,否則編譯報錯:must explicitly initialise member 'v2' which does not have default constructor。
struct Vertex3D {
GLfloat x, y, z;
Vertex3D(GLfloat a, GLfloat b, GLfloat c) : x(a), y(b), z(c) {}
// 缺少默認構造函數 Vertex3D() {}
};
struct Triangle3D {
Vertex3D v1, v2, v3;
Triangle3D(Vertex3D vt1, Vertex3D vt2, Vertex3D vt3) {
// ❌ 未在初始化列表初始化 v1/v2/v3,編譯器嘗試默認構造失敗
}
};
struct Vertex3D {
GLfloat x, y, z;
Vertex3D() : x(0), y(0), z(0) {} // 添加默認構造
Vertex3D(GLfloat a, GLfloat b, GLfloat c) : x(a), y(b), z(c) {}
};
struct Triangle3D {
Vertex3D v1, v2, v3;
Triangle3D(Vertex3D vt1, Vertex3D vt2, Vertex3D vt3)
: v1(vt1), v2(vt2), v3(vt3) {} // 顯式調用拷貝構造
};
養成寫初始化列表的習慣,避免此類編譯錯誤並提升性能。