C++ 初始化结构数组
我有一门课是这样的:C++ 初始化结构数组,c++,arrays,struct,initialization,C++,Arrays,Struct,Initialization,我有一门课是这样的: class Wall { private : Quad faces[6]; }; 我有这样的构造函数: Wall::Wall(Quad f[], const float &mass, Vector3 center) 我想将面初始化为f(或将f复制到面),Quad是没有默认构造函数的结构 现在我通过在初始化列表中使用faces{f[0]、f[1]、f[2]、f[3]、f[4]、f[5]}解决了这个问题,但这需要c++11,我担心我的一些
class Wall
{
private :
Quad faces[6];
};
我有这样的构造函数:
Wall::Wall(Quad f[], const float &mass, Vector3 center)
我想将面初始化为f(或将f复制到面),Quad是没有默认构造函数的结构
现在我通过在初始化列表中使用faces{f[0]、f[1]、f[2]、f[3]、f[4]、f[5]}解决了这个问题,但这需要c++11,我担心我的一些朋友没有,我需要将代码传递给他们
有许多类似的问题,但所有这些问题似乎都没有解决方案,除了切换到向量或使用一些我不想要的复杂代码,正如您从类的名称可以理解的那样,墙不需要向量(它只有6个面,所以为什么是向量)
这真的没有希望吗?没有办法吗
附言
无论是在构造函数体中还是在初始值设定项列表中,这都无关紧要
更改为动态数组(Quad*)也没关系,但最好使用静态数组。有几个选项。最简单的方法可能是使用具有默认构造函数的东西对Quad进行子类化:
class Wall {
public:
Wall(Quad f[], ...) {
for (int i = 0; i < 6; ++i) faces[i] = f[i];
}
private:
class MyQuad : public Quad {
MyQuad() : Quad(...) {}
}
MyQuad faces[6];
};
类墙{
公众:
墙(四边形f[],…){
对于(inti=0;i<6;++i)面[i]=f[i];
}
私人:
类MyQuad:公共Quad{
MyQuad():Quad(…){}
}
MyQuad面[6];
};
另一种选择是使用placement new(新位置)-请注意,下面的代码不是开箱即用的,因为它没有进行适当的对齐/填充,并且没有处理一些别名问题,这些问题留给读者作为练习。但它应该给你一个起点
class Wall {
public:
Wall(Quad f[], ...) {
for (int i = 0; i < 6; i++) {
// TODO: take padding into account
new (&faces_data + sizeof(Quad) * i) Quad(f[i]);
}
}
~Wall() {
for (int i = 0; i < 6; i++) {
face(i).~Quad();
}
}
Quad& face(int idx) {
// TODO: take padding into account
return (reinterpret_cast<Quad*>(faces_data))[idx];
}
private:
// TODO: force proper alignment and take padding into account
char faces_data[sizeof(Quad) * 6];
};
类墙{
公众:
墙(四边形f[],…){
对于(int i=0;i<6;i++){
//TODO:考虑填充
新的(&faces_data+sizeof(Quad)*i)Quad(f[i]);
}
}
~Wall(){
对于(int i=0;i<6;i++){
脸(我)。~Quad();
}
}
四边形和面(整数idx){
//TODO:考虑填充
返回(重新解释投影(面数据))[idx];
}
私人:
//TODO:强制正确对齐并考虑填充
字符面_数据[sizeof(Quad)*6];
};
有什么原因不能为(inti=0;i<6;i++)面[i]=f[i]代码>和检查构造函数的f
长度?@Guvante我试过了,它说“Quad::Quad()不匹配”。你可能想验证C++11是否是非初学者,因为最小的搜索指向没有标准的方法。很遗憾,std::array
-编辑:现在看到你提到不能使用C++11.0。很抱歉,Aaronl,但是如果我想要一个默认构造函数,我不会定义一个新的子类型,而只是将它放在Quad类中。第二个解决方案是semms C-style?!!我假设您不能或不想修改Quad类。第二个解决方案是关于C++的,它包含新的和全部的布局。