Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 初始化结构数组_C++_Arrays_Struct_Initialization - Fatal编程技术网

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++的,它包含新的和全部的布局。