如何声明一个可以在整个程序中使用的全局2d 3d 4d ...数组(堆版本)变量?

时间:2018-10-25 13:28:12

标签: c++ heap

class1.cpp

scanner.skip()

如何在其他.cpp文件中使用此数组?

3 个答案:

答案 0 :(得分:5)

至少应使用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);

答案 1 :(得分:3)

首选std::arraystd::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; 
} 

答案 2 :(得分:1)

我不确定我是否理解您的意思,而只是:

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)