gpt4 book ai didi

c++ - 具有不同数组实现的子类

转载 作者:行者123 更新时间:2023-11-28 01:08:21 27 4
gpt4 key购买 nike

假设我有一个基类模板 MyBase:

template <class T>
class MyBase{
private:
T data;
public:
MyBase(T _data);
};

我想将其子类化两次(至少现在):

  1. data 应该是动态二维数组:T **data
  2. data 应该是一个固定的二维数组:T data[rows][cols]

我对 C++ 还是有点新手,我不知道该怎么做。具体来说,我想制作一种矩阵库(主要作为学习项目)。我过去做过一些事情,让我的矩阵动态存储更有意义,反之亦然。因此,似乎一个好的解决方案是实现一个提供所有通用功能的基类(insert(T item, int i, int j),例如,应该使用 data [i][j] = item; 在任何一种情况下),然后子类化 DynamicMatrix 和 FixedMatrix。 DynamicMatrix 将有一个构造函数来执行

data = new T*[rows];
for (int i = 0; i < rows; i++)
{
data[i] = new T[cols];
}
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
data[i][j] = 0;
}
}

而 FixedMatrix 只是:

for (i=0; i < rows; i++)
{
for (j=0; j < cols; j++)
{
data[i][j] = 0;
}
}

在基类中创建一个成员变量 T data; 很容易。但是在子类中,如何将其转换为双指针?也许我做不到,我可以接受。但是我应该怎么做呢?

最佳答案

在这里你试图使用继承来重用代码,在我看来,这不是一个好的设计方法;继承是为了实现自由,而组合是为了代码重用。

在这种情况下,如果真的有必要支持这些不同的情况,我会形式化一个二维数组:

template<typename T> class Array2D {
public:
virtual const T* operator[](int row_index) const = 0;
virtual T* operator[](int row_index) = 0;
virtual size_t rows() const = 0;
virtual size_t cols() const = 0;
};

然后我将提供您指定的 Array2D 的实现:

template<typename T, int R, int C> class FixedArray2D : public Array2D {
public:
virtual const T* operator[](int row_index) const {
return &data_[row_index][0];
}
virtual T* operator[](int row_index) {
return &data_[row_index][0];
}
virtual size_t rows() const { return R; }
virtual size_t cols() const { return C; }
private:
T data_[R][C];
};

template<typename T> class DynamicArray2D : public Array2D {
public:
DynamicAray2D(int rows, int cols) {
// ...
}
// ...
};

此时,您可以使用任一格式实例化 Array2D。现在,无论您使用什么代码,都可以在需要处理此类对象的任何地方简单地使用 const Array2D&Array2D&

也就是说,我认为这可能是不必要的复杂性,因为动态大小的数组适用于任何一种情况,因此我会选择它,除非有令人信服的理由支持这两种类型。

关于c++ - 具有不同数组实现的子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4953777/

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