2017-07-16 96 views
0

我经常想要定义几个常量,这些常量是常见的classstruct的实例。当类包含指向其他结构或动态数组的指针时,我没有想到如何做到这一点。初始化作为复杂类/结构实例的常量(C++)

实施例:

我想要写头文件Solids.h定义一般class Solid和比限定等Tetrahedron, Cube, Octahedron, Icosahedron几个常数的实例。

下述溶液不起作用:编译器抱怨说,它是无法初始化指针在Solid Tetrahedron

Solids.h|45|error: cannot convert ‘Vec3d (*)[4] {aka Vec3TYPE<double> (*)[4]}’ to ‘Vec3d* {aka Vec3TYPE<double>*}’ in initialization|

#ifndef Solids_h 
#define Solids_h 

#include "Vec2.h" 
#include "Vec3.h" 

class Solid{ public: 
    int nvert; 
    int nedge; 
    int ntri; 
    Vec3d * verts; 
    Vec2i * edges; 
    Vec3i * tris; 
}; 

namespace Solids{ 

    // ==== Tetrahedron 
    const static int Tetrahedron_nverts = 4; 
    const static int Tetrahedron_nedges = 6; 
    const static int Tetrahedron_ntris = 4; 
    static Vec3d  Tetrahedron_verts [Tetrahedron_nverts] = { {-1.0d,-1.0d,-1.0d}, {+1.0d,+1.0d,-1.0d}, {-1.0d,+1.0d,+1.0d}, {+1.0d,-1.0d,+1.0d} }; 
    static Vec2i  Tetrahedron_edges [Tetrahedron_nedges] = { {0,1},{0,2},{0,3},{1,2},{1,3},{2,3}}; 
    static Vec3i  Tetrahedron_tris [Tetrahedron_ntris] = { {0,2,1},{0,1,3},{0,3,2},{1,2,3} }; 

    const static Solid Tetrahedron = (Solid){Tetrahedron_nverts,Tetrahedron_nedges,Tetrahedron_ntris, &Tetrahedron_verts,&Tetrahedron_edges,&Tetrahedron_tris}; 
}; 

#endif 
+0

你为什么把你的计数乘以2和3?数组大小指定“Vec2i”或“Vec3i”等元素的数量,而不是用于创建它们的整数。所以这实际上是将不需要的默认构造向量放在数组的末尾。 – aschepler

+0

aschepler - aha对不起,我的实现有些不同(它是'int *'not'Vec *'),当我为这个问题编写代码时,我忘了这个'* 2'和'* 3'。我现在纠正它 –

回答

0

甲指针阵列(像&Tetrahedron_verts)是从一个指针到元件不同(如Vec3d * verts )。您可能希望指针verts指向数组的第一个元素,这可以让您执行诸如Tetrahedron.verts[k]之类的操作。

所以你可以做&Tetrahedron_verts[0],这将是有效的。

但你并不需要,因为大多数的数组名自动衰减到指针的第一个元素时:

const static Solid Tetrahedron = { 
    Tetrahedron_nverts, Tetrahedron_nedges, Tetrahedron_ntris, 
    Tetrahedron_verts, Tetrahedron_edges, Tetrahedron_tris 
}; 

注意你也不需要(Solid)类型名称在聚合初始化器之前。

+0

哦,愚蠢的错误。谢谢! –