C++ 一个“系统”的各种接口;“数据承载”;班
我试图实现一系列类,这些类为三角矩阵或对称矩阵提供(公共)接口,但我希望避免复制内存(即进行大量就地操作) < >我在C++中想这样做是为了实现一个类或结构,它只是一个包含矩阵数据的向量(因为我只关心三角矩阵,我只需要存储矩阵的大约一半)。让我们称之为“数据承载”类C++ 一个“系统”的各种接口;“数据承载”;班,c++,oop,design-patterns,C++,Oop,Design Patterns,我试图实现一系列类,这些类为三角矩阵或对称矩阵提供(公共)接口,但我希望避免复制内存(即进行大量就地操作) < >我在C++中想这样做是为了实现一个类或结构,它只是一个包含矩阵数据的向量(因为我只关心三角矩阵,我只需要存储矩阵的大约一半)。让我们称之为“数据承载”类SquareTriangularMatrix。现在,根据数据是否应被视为上三角形、下三角形甚至对称,可以对该矩阵中的数据进行不同的访问 我不认为多态性可以应用于我的情况,因为我希望squaretangularmatrix的相同对象根据
SquareTriangularMatrix
。现在,根据数据是否应被视为上三角形、下三角形甚至对称,可以对该矩阵中的数据进行不同的访问
我不认为多态性可以应用于我的情况,因为我希望squaretangularmatrix
的相同对象根据上下文具有不同的接口。有时,正方形三角矩阵
可以被视为下三角矩阵,但另一些可能是它的转置:上三角矩阵,等等
有没有解决这个问题的设计模式?在此背景下,任何提示或指导都将不胜感激
非常感谢您可以为存储类创建适配器类,如下所示:
struct SquareTriangularMatrix {
// constructor, maybe operator[], etc
int* values;
int nrows;
int ncolumns;
};
struct UpperTriangleMatrix {
UpperTriangleMatrix (SquareTriangularMatrix& data): data(data) {}
int at (unsigned row, unsigned column) const {
if (row > column) return 0;
return data.values [row * data.ncolumns + column];
}
private:
SquareTriangularMatrix& data;
};
然后,您可以将该类UpperTriangleMatrix
嵌套在SquareTriangularMatrix
中,并添加一个类似于SquareTriangularMatrix::as_upper()
的函数,该函数将返回使用该矩阵构造的适配器
另一种方法是在SquareTriangularMatrix
中创建一个函数as
,该函数允许以后添加自定义适配器,如下所示:
struct SquareTriangularMatrix {
//...
template <class T> T
as () { return T(*this); }
};
//usage:
SquareTriangularMatrix m;
auto upper = m.as <UpperTriangleMatrix>();
它的工作方式与上一个示例中的函数
的工作方式相同,这只是一个品味问题。只是一些想法:我会选择组合而不是继承。如果不同的矩阵类型真的应该有不同的接口,那么公开基类接口可能会让人更加困惑,而不是有帮助。另一方面,你可能想对不同类型的矩阵使用相同的算法,如果它们共享相同的接口,这会更容易。这听起来像是一个错误。
template <typename T> T& matrix_cast (SquareTriangularMatrix& m) { return T(m); }
SquareTriangularMatrix m;
auto upper = matrix_cast <UpperTriangleMatrix>(m);