gpt4 book ai didi

c++ - 设置二维矩阵时避免段错误

转载 作者:行者123 更新时间:2023-11-30 02:29:15 26 4
gpt4 key购买 nike

我有一个存储从通用 ListAsArray 类继承的 vector 的类,但是当我尝试创建由这些 vector 类组成的矩阵时,出现段错误。下面给出了我的问题的一个通用示例:

#include <iostream>
#include <vector>
using namespace std;

class ListAsArray
{
public:
virtual void addToEnd(int i) = 0;
virtual int operator[](int i) = 0;
};

class ListAsVector : public ListAsArray
{
public:
void addToEnd(int i)
{
vec.push_back(i);
}
int operator[](int i)
{
return vec[i];
}
private:
vector<int> vec;
};

class FixedSizeMatrix
{
public:
FixedSizeMatrix(int rows, int columns)
{
int count = 0;
this->rows = rows;
this->columns = columns;
matrix = new ListAsVector[rows];
for (int i = 0; i < rows; ++i)
{
for (int j = 0; j < columns; ++j)
{
matrix[i].addToEnd(count++);
}
}
}
ListAsArray& operator[](int i)
{
return matrix[i];
}
private:
ListAsArray* matrix;
int rows;
int columns;
};

int main() {
FixedSizeMatrix m(1,2);
cout<<m[0][0]<<endl;

return 0;
}

只有当我尝试创建一个多行矩阵时才会出现此问题。当我将矩阵类型从 ListAsArray* 更改为 ListAsVector* 时,问题就消失了,因此需要进行某种类型转换,但我几乎尝试了所有方法,但都没有成功。

因为这是一项作业,所以我不得不使用 ListAsArray* 类型的矩阵。

提前感谢您的帮助。

最佳答案

您正在切割您的对象。当您分配 ListAsVector 的数组时,每个对象都包含 std::vector<>成员。但是,您使用 ListAsArray*用于访问序列。因此,matrix[i]其中 i大于零对指针类型执行常规指针算术 ListAsArray* (它非常小,因为它没有成员,但确实包含一个 vtable)。

只需更改 matrix 的类型即可成为ListAsVector* . (更好的是,使用智能指针,或者只使用 std::vector<ListAsVector> )。 ListAsArray引用仍适用于 operator[] , 指针数学将再次与世界同在。

关于c++ - 设置二维矩阵时避免段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39764605/

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