Как объявить глобальную переменную 2d 3d 4d ... array (heap version), которая может использоваться во всей программе? - PullRequest
0 голосов
/ 25 октября 2018

class1.cpp

int a=10; int b=5; int c=2;
//for this array[a][b][c]

int*** array=new int**[a];


for(int i =0; i<a; i++)
{ 
    array[i] = new int*[b];        
    for(int k =0; k<b; k++) 
    {
       array[i][k] = new int[c];
    }  
}

как я могу использовать этот массив в других файлах .cpp?

Ответы [ 3 ]

0 голосов
/ 25 октября 2018

Предпочитают std::array или std::vector необработанным массивам.У вас были постоянные размеры, поэтому используйте std::array.Объявите его в заголовочном файле:

// header.h
#pragma once  // or use multiple inclusion guards with preprocessor
#include <array>

const int a = 10;
const int b = 5;
const int c = 2;

using Array3D = std::array<std::array<std::array<int,c>,b>,a>;

extern Array3D array3d;  // extern indicates it is global

Определите его в файле cpp:

// class1.cpp
#include "header.h"

Array3D array3d;

Затем включите заголовок, где бы вы ни хотели его использовать.

// main.cpp
#include "header.h"

int main()
{
    array3d[3][2][1] = 42; 
} 
0 голосов
/ 25 октября 2018

Я не уверен, что понял, что именно вы имеете в виду, но просто:

class1 obj1;
obj1.array[i][j][k] // assuming you make the array public and already initialized in the constructor(and dont forget to delete it in the destructor)
0 голосов
/ 25 октября 2018

Вместо того, чтобы вручную выделять массив, вы должны по крайней мере использовать std::vector.То, что вам нужно сделать, это иметь заголовочный файл, содержащий

extern std::vector<std::vector<std::vector<int>>> data;

, который вы включите во все файлы cpp, с которыми вы хотите поделиться вектором, а затем в одном файле cpp иметь

std::vector<std::vector<std::vector<int>>> data = std::vector<std::vector<std::vector<int>(a, std::vector<std::vector<int>>(b, std::vector<int>(c)));

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


Вы не должны использовать вложенный вектор.Он может разбрасывать данные в памяти, поэтому он не очень удобен для кэша.Вы должны использовать класс с одним вектором измерения и делать вид, что он имеет несколько измерений с использованием математики.Очень простой пример этого будет выглядеть как

class matrix
{
    std::vector<int> data;
    int row; // this really isn't needed as data.size() will give you rows
    int col;
    int depth;
public:
    matrix(int x, int y, int z) : data(x * y * z), row(x), col(y), depth(z) {}
    int& operator()(int x, int y, int z) { return data[x + (y * col) + (z * col * depth)]; }
};

, тогда заголовочный файл будет

extern matrix data;

, а один файл cpp будет содержать

matrix data(a, b, c);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...