gpt4 book ai didi

c++ - 是否可以在 C++ 中创建类型声明数组?

转载 作者:行者123 更新时间:2023-11-27 23:35:55 25 4
gpt4 key购买 nike

我想知道是否有一种方法可以创建一个包含类型声明的数组,以便更轻松、更灵活地声明大量不同类型的变量。

例如,我想要做的是有一个父类的数组,我想声明一个父类的子类的动态指针数组。

这是一个类声明示例:

class parent {
private:
int x;
}

class child1 : public parent {
private:
int y;
}

class child2 : public parent {
private:
int z;
}

这是我手动执行的操作:

parent *array[100];
int count = 0;
int child1_num = 25, child2_num = 75;
for (int i = 0; i < child1_num; i++) {
parent[count++] = new child1;
}
for (int i = 0; i < child2_num; i++) {
parent[count++] = new child2;
}

我希望我能以类似于以下的形式得到它:

parent *array[100];
child_type type[2] = {child1, child2};
int child_num[2] = {25, 75};
int count = 0;
for (int i = 0; i < 2; i++) {
for (int j = 0; j < child_num[i]; j++) {
array[count++] = new type[i];
}
}

是否有更好的方法来解决这个问题?我想不出其他任何东西。

最佳答案

是的,这是可能的,但你不需要类型列表。还有其他方法可以改进您的代码。首先使用基本的 c++11 功能,例如,std::vector 而不是数组,std::unique_ptr 而不是裸指针。

#include <memory>
#include <vector>

int main()
{
std::vector<std::unique_ptr<parent>> v;
int child1_num = 25, child2_num = 75;
for (int i = 0; i < child1_num; i++) {
v.emplace_back(new child1);
}
for (int i = 0; i < child2_num; i++) {
v.emplace_back(new child2);
}

return 0;
}

然后你可以更进一步,创建一个像这样的函数

template<typename T, typename Vector>
void fill(Vector& v, size_t count)
{
for (int i = 0; i < count; i++) {
v.emplace_back(new T);
}
}

并简化你的主要代码

    std::vector<std::unique_ptr<parent>> v;
int child1_num = 25, child2_num = 75;
fill<child1>(v, child1_num);
fill<child2>(v, child2_num);

到此为止。够了。你不需要类型列表。并且不要忘记 parent 中的虚拟析构函数。

关于c++ - 是否可以在 C++ 中创建类型声明数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59206028/

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