初始化作为复杂类/结构实例的常量(C++)
我经常想要定义几个常量,这些常量是常见的class
或struct
的实例。当类包含指向其他结构或动态数组的指针时,我没有想到如何做到这一点。初始化作为复杂类/结构实例的常量(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
甲指针阵列(像&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)
类型名称在聚合初始化器之前。
哦,愚蠢的错误。谢谢! –
你为什么把你的计数乘以2和3?数组大小指定“Vec2i”或“Vec3i”等元素的数量,而不是用于创建它们的整数。所以这实际上是将不需要的默认构造向量放在数组的末尾。 – aschepler
aschepler - aha对不起,我的实现有些不同(它是'int *'not'Vec *'),当我为这个问题编写代码时,我忘了这个'* 2'和'* 3'。我现在纠正它 –