【发布时间】:2017-02-07 10:38:13
【问题描述】:
我有一个类,它存储一个从通用 ListAsArray 类继承的向量,但是当我尝试创建一个由这些向量类组成的矩阵时,我遇到了分段错误。下面给出了我的问题的一个通用示例:
#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* 类型的矩阵。
提前感谢您的帮助。
【问题讨论】:
-
你是 slicing 你的对象序列。
matrix[i]表示为ListAsArrayobject,而不是指向某个ListAsVector对象的引用或指针。因此,只有第一个位于适当的边界上。 -
@WhozCraig 那么我该如何解决这个问题?
-
@WhozCraig 如果我将其更改为 ListAsArray** 矩阵;并将初始化更改为 matrix = new ListAsVector*[rows];我收到一条错误消息:从 'ListAsVector**' 到 'ListAsArray**' 的无效转换
-
除非有人在我之前写,否则我会写出来。
标签: c++ inheritance matrix casting polymorphism