我想知道如何准确地为多维数组做一个吸气剂。我有一个类(称为Figure),它的属性之一是二维数组(矩阵),我想从另一个包含Figure对象的类读取该矩阵。
我认为使用 getter 返回指向矩阵的常量指针是一个不错的选择,但是,尽管我知道如何在普通数组中执行此操作,IDE 警告我不能这样做,因为我正在返回它不是指针的东西:
const int SIZE = 5;
class Figure
{
public:
...
const int* getMatrix() const {return m_matrix;};
...
private:
...
int m_matrix[SIZE][SIZE];
...
}
我猜这里的问题是,使用矩阵需要知道矩阵有多少列(据我所知),因为编译器需要知道第二行从哪里开始,所以我猜“m_matrix”不仅是指向数组开头的指针,但它也包含列数信息(我不确定,我只是想理解错误)。无论如何,我不知道如果我想要的话我将如何返回那种类型的指针(我不想要,正如我接下来要解释的那样,但我很想知道我会怎么做:))
此外,我担心返回指针会违反数据封装(我看过一些帖子谈论这一点),我的意思是,如果我提供对存储矩阵的内存的确切部分的访问权限,矩阵可以在类 Figure 之外更改,但这种情况不应该发生。
所以,我想到的唯一一件事就是使用 getter 仅返回矩阵的一个位置,然后使用 for 循环来制作矩阵的副本。
const int SIZE = 5;
class Figure
{
public:
...
int getMatrix(int i, int j) const {return m_matrix[i][j];};
...
private:
...
int m_matrix[SIZE][SIZE];
...
}
有什么更好的办法可以解决吗?
如果要复制整个矩阵,请实现复制构造函数和复制赋值运算符。
constexpr size_t SIZE = 5;
class Matrix
{
public:
Matrix(const Matrix& other) {
for (size_t row = 0; row < SIZE; row++)
for (size_t col = 0; col < SIZE; col++)
m_matrix[row][col] = other.m_matrix[row][col];
}
Matrix& operator=(Matrix&& other) {
if (this == &other) return *this;
for (size_t row = 0; row < SIZE; row++)
for (size_t col = 0; col < SIZE; col++)
m_matrix[row][col] = other.m_matrix[row][col];
return *this;
}
private:
int m_matrix[SIZE][SIZE];
};