Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 一个“系统”的各种接口;“数据承载”;班_C++_Oop_Design Patterns - Fatal编程技术网

C++ 一个“系统”的各种接口;“数据承载”;班

C++ 一个“系统”的各种接口;“数据承载”;班,c++,oop,design-patterns,C++,Oop,Design Patterns,我试图实现一系列类,这些类为三角矩阵或对称矩阵提供(公共)接口,但我希望避免复制内存(即进行大量就地操作) < >我在C++中想这样做是为了实现一个类或结构,它只是一个包含矩阵数据的向量(因为我只关心三角矩阵,我只需要存储矩阵的大约一半)。让我们称之为“数据承载”类SquareTriangularMatrix。现在,根据数据是否应被视为上三角形、下三角形甚至对称,可以对该矩阵中的数据进行不同的访问 我不认为多态性可以应用于我的情况,因为我希望squaretangularmatrix的相同对象根据

我试图实现一系列类,这些类为三角矩阵或对称矩阵提供(公共)接口,但我希望避免复制内存(即进行大量就地操作)

< >我在C++中想这样做是为了实现一个类或结构,它只是一个包含矩阵数据的向量(因为我只关心三角矩阵,我只需要存储矩阵的大约一半)。让我们称之为“数据承载”类
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);