Рубрики

Как создать динамический 2D-массив внутри класса в C ++?

Предположим, мы хотим создать класс для Graph. Класс хранит матричное представление графа смежности. Следовательно, наша структура классов будет выглядеть примерно так:

class Graph 

{

  int V; 

  int adj[V][V];  // Эта строка не работает

    

  / * Остальные участники * /

};

  

int main()

{
}

Выход :

error: invalid use of non-static data
       member 'Graph::V'.

Даже если мы сделаем V статическим, мы получим ошибку «привязка массива не является целочисленной константой»

C ++ не позволяет создавать выделенный в стеке массив в классе, размер которого не постоянен. Поэтому нам нужно динамически распределять память. Ниже приведена простая программа, демонстрирующая, как динамически размещать двумерный массив в классе C ++, используя класс для Graph с представлением матрицы смежности.

// C ++ программа, показывающая, как выделить динамический 2D
// массив в классе, используя пример Graph.
#include<bits/stdc++.h>

using namespace std;

  
// Класс для представления ориентированного графа

class Graph

{

    int V;    // Количество вершин

  

    // adj [u] [v] будет true, если есть ребро

    // от u до v, иначе false

    bool **adj;

  

public:

    Graph(int V);   // Конструктор

  

    // функция для добавления ребра на график

    void addEdge(int u, int v)  { adj[u][v] = true; }

    void print();

};

  

Graph::Graph(int V)

{

    this->V = V;

  

    // Создать динамический массив указателей

    adj = new bool* [V];

  

    // Создать строку для каждого указателя

    for (int i=0; i<V; i++)

    {

       // Примечание: строки не могут быть смежными

       adj[i] = new bool[V];

  

       // Инициализируем все записи как ложные для указания

       // изначально нет ребер

       memset(adj[i], false, V*sizeof(bool));

    }

}

  
// Утилита для вывода матрицы смежности

void Graph::print()

{

   for (int u=0; u<V; u++)

   {

      for (int v=0; v<V; v++)

         cout << adj[u][v] << " ";

      cout << endl;

   }

}

  
// Метод драйвера

int main()

{

    // Создать график, приведенный на диаграмме выше

    Graph g(4);

    g.addEdge(0, 1);

    g.addEdge(0, 2);

    g.addEdge(1, 2);

    g.addEdge(2, 0);

    g.addEdge(2, 3);

    g.addEdge(3, 3);

  

    g.print();

  

    return 0;

}

Выход :

0 1 1 0 
0 0 1 0 
1 0 0 1 
0 0 0 1 

Примечание по вызову memset ():
memset () используется отдельно для отдельных строк. Мы не можем заменить эти вызовы одним вызовом, потому что строки расположены по разным адресам, и выполнение вызова memset, как показано ниже, было бы катастрофическим.

       // Wrong!! (Rows of matrix at different addresses)
       memset(adj, false, V*V*sizeof(bool));

Эта статья предоставлена Dheeraj Gupta . Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме

Рекомендуемые посты:

Как создать динамический 2D-массив внутри класса в C ++?

0.00 (0%) 0 votes