gpt4 book ai didi

c++ - 初始化结构数组

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:18:40 24 4
gpt4 key购买 nike

我有这样一个类:

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 恐怕我的一些 friend 没有,我需要将我的代码传递给他们。

有很多类似的问题,但除了切换到 vector 或使用一些我不想要的复杂代码之外,它们似乎都没有解决方案,正如您从类名中可以理解的那样,不需要 Wall一个 vector (它只有 6 个面所以为什么是 vector )。

真的没有希望了吗?有什么办法吗?

附言

无论是在构造函数体中还是在初始化列表中,都没有关系。

更改为动态数组 (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];
};

另一种选择是使用 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];
};

关于c++ - 初始化结构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29779956/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com