我有一个用于存储从通用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 *类型的矩阵。

预先感谢您的任何帮助。

最佳答案

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

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

10-06 15:12