Динамическое выделение массива класса «Вектор» - PullRequest
0 голосов
/ 21 апреля 2020

Так что мне нужно реализовать абстрактный класс Matrix, который использует массив указателей на Vector в качестве своего содержимого.
'Square_matrix' - это фактическая реализация Matrix.

class Vector
{
    int dim;  // dimension
    int* a;   // actual array
public:
    Vector(int n)
    {
        dim = n;
        a = new int[n];
    }

};

class Matrix     //it will be an abstract class
{
protected:
    Vector* v;
public:
    Matrix(int col, int lin)
    {
        //here is my problem
    }
};

class Square_matrix : public Matrix
{
    int dim;
public:
    Square_matrix(int dim) 
        : Matrix(dim, dim) { this-> dim = dim; }
};

Как я могу сделать что-то подобное этой работе?

Matrix(int lin, int col)
{
   v = new (Vector*)[lin];
   for(int i = 0; i < lin; i++)
   {
       v[i] = new Vector(col);
   }
}

1 Ответ

0 голосов
/ 21 апреля 2020

Конечно, использование std::vector<std::vector<int>>, вероятно, не то, что вы хотите; D.

Что касается проблемы в вашем коде - вы сохраняете целые числа в Vector:

int* a; // int a[];

и Вы сохраняете Векторы в Матрице

Vector* v; // Vector v[]

, но в своем конструкторе вы пытаетесь каждый раз выделять новый вектор, поэтому для согласованности вы должны добавить одну звезду в объявлении v:

Vector** v; // Vector* v[];
...
Matrix(int lin, int col)
{
   v = new Vector*[lin];
   for(int i = 0; i < lin; i++)
   {
       v[i] = new Vector(col);
   }
}

В качестве альтернативы вы можете использовать немного более сложное решение, оставить объявление v в том виде, в каком оно есть сейчас, и использовать новое размещение:

Vector* v; // Vector v[]
...
Matrix(int col, int lin) // what if somebody mixes order of col and lin?
{
        // watch out for alignment if you do such tricks!!!
        v = reinterpret_cast<Vector*>(new char[sizeof(Vector)*lin]);
        for(int i = 0; i < lin; i++)
        {
                new (v+i) Vector(col);
        }
}

Конечно, не забывайте о деструкторах, безопасности исключений и и так далее ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...