c++ 在一个类成员数组中存储任意数量的不同类

Posted

技术标签:

【中文标题】c++ 在一个类成员数组中存储任意数量的不同类【英文标题】:c++ storing arbitrary number of different classes in one class-member-array 【发布时间】:2017-09-13 14:45:37 【问题描述】:

假设我有一个这样的类模板(你不能改变网格,它代表一个更困难的对象,我不喜欢改变):

template<int x, int y>
class grid
public:
double S[x][y];
grid();
~grid();;

现在我希望有一个新的类模板(名为 multi_grid),它拥有一个数组 my_grids。我喜欢将不同的网格存储到 my_grids 中,例如(伪代码):

my_grids[0]=grid<x*1,y*1>,
my_grids[1]=grid<x*2,y*2>
my_grids[n]=grid<(x<<n),(y<<n)>

我的想法是为 my_grids 使用 void* 并通过构造函数设置它。我的麻烦从构造函数开始:

template<int x, int y, int degree>
class multi_grid
public:
void* my_grids[degree];

~multi_grid();
multi_grid()
    create_grid<degree-1>();
    

template<int grid_number>
void create_grid(void)
    my_grid[grid_number]=new grid<(x<<grid_number), (y<<grid_number)>;
    create_grid<grid_number-1>();
    

;

template<int x, int y, int degree>
template<int grid_number>
void multi_grid<x, y, degree>::create_grid<-1>()

我有两个问题:

    这个想法的概念可能吗? 如果第一个答案是真的,怎么办? 我从一个简单的 for_loop 开始,这会导致麻烦,因为 i++ 不是静态的。 所以我尝试了模板递归,而不是遇到不同的问题,例如: “shadows template parm”或“function template partial specialization ‘create_grid’ is not allowed”等麻烦多了。

我尝试了整体来解决它,但无法弄清楚。提前致谢。

【问题讨论】:

“我的想法是使用 void*” 一个非常糟糕的想法。 @user0042 我知道,有更好的主意吗? 有像 Boost.TypeErasuredyno 这样的库可以很好地处理这个问题,或者传统的基类。 相关/欺骗:***.com/questions/3348936/… 这不值得麻烦。使用std::vector 【参考方案1】:

大小是您类型的一部分。通过诉诸void *,您可以在一定程度上对其进行核对。

另一种方法是只使用向量。 这仍然允许您在容器中拥有不同大小的网格并获取或设置数据。

#include <vector>

class grid

public:
    grid(int x, int y)
    
        data.resize(x);
        //and each y
    
//private: //maybe - up to you
    std::vector<std::vector<double>>data;
;

int main()

    std::vector<grid> my_grids;
    my_grids.emplace_back(1, 3);

【讨论】:

你的答案是写,我的问题错了。所以我编辑它:(你不能改变网格,它代表一个更困难的对象,我不喜欢改变): 您最好开始另一个问题并更具体地了解您拥有的网格类。

以上是关于c++ 在一个类成员数组中存储任意数量的不同类的主要内容,如果未能解决你的问题,请参考以下文章

什么类型可以保存 C++ 中不同类的成员函数指针?

C++ 通过分配其他构造函数初始化的类成员来初始化类成员是一个坏主意吗?

不同类的成员函数指针的C++映射

C++ 固定数量的向量大小作为类成员

传递一个二维数组并作为类成员存储

用另一个类成员 C++ 初始化一个类成员