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

标签 c++ arrays c++11 inheritance

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

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

这是一个类声明示例:

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/

相关文章:

javascript - 获取数组的所有(数量)组合

java - 数组上的递归插入排序的数组越界

c++ - 如何显式查看auto类型推断的结果?

c++ - 过滤 STL 容器的现代方法?

c++ - 静态对象的私有(private)析构函数是如何调用的?

c++ - 如何制作 C++ 程序循环的一部分?

java - 将 Java 转换为 C++ : Templates vs. 泛型

php - 未定义索引 : usersJSON on line 6 []

c++ - 如何一起使用 C++ 和 C 可变参数?

c++ - 我在 Clang 中发现错误了吗?