C++ 在标头中声明动态分配的二维数组而不知道其维度

C++ 在标头中声明动态分配的二维数组而不知道其维度,c++,dynamic-allocation,C++,Dynamic Allocation,我需要在头中声明一个动态分配的二维数组,而不知道它的维度,它将在函数中建立 在标题中,我要放置: #define MAX_BARS_ALLOWED 20000 extern int Gregorian[][MAX_LINES_ALLOWED]; //it works 在.cpp文件中,函数内部: int **Gregorian=new int*[NumLastItem+1][MAX_LINES_ALLOWED]; //this does NOT work, why ? 。。。既然我在一个

我需要在头中声明一个动态分配的二维数组,而不知道它的维度,它将在函数中建立

在标题中,我要放置:

#define MAX_BARS_ALLOWED 20000
extern int Gregorian[][MAX_LINES_ALLOWED];  //it works
.cpp
文件中,函数内部:

int **Gregorian=new int*[NumLastItem+1][MAX_LINES_ALLOWED];  //this does NOT work, why ?
。。。既然我在一个函数中初始化它,它真的是全局的吗


有人能教我做这件事的正确方法吗?提前谢谢你

这是我最喜欢的在堆上声明可变大小矩阵的方法:在每行末尾分配一个额外的元素,以便知道边界在哪里(有点像C样式的字符串)

在cpp中:


若在函数中创建具有相同数组名称的新实例,它将覆盖并隐藏上面的实例。您可以分配外部数组,但不要创建同名的新变量。

在头文件中,对实现源有一个特殊的定义。像这样:

#ifndef ARRAY_HEADER_HPP
#define ARRAY_HEADER_HPP 1

#ifdef ARRAY_IMPL
#define extern // remove extern for implementation
#endif

#define MAX_LINES_ALLOWED 20000
extern int **Georgian;

#ifdef ARRAY_IMPL
#undef extern
#endif

#endif // ARRAY_HEADER_HPP
然后,在分配数组的位置包括如下所示的头

#define ARRAY_IMPL
#include "array_header.hpp"

void alloc_array(){
    Georgian = new int*[var+1];
    for(size_t n = 0; n < (var+1); n++)
        Georgian[n] = new int[MAX_LINES_ALLOWED];
}

void dealloc_array(){
    for(size_t n = 0; n < (var+1); n++)
        delete[] Georgian[n];
    delete[] Georgian;
}
#定义数组\u IMPL
#包括“array_header.hpp”
void alloc_数组(){
格鲁吉亚语=新整数*[var+1];
对于(大小n=0;n<(变量+1);n++)
格鲁吉亚语[n]=新整数[MAX_LINES_ALLOWED];
}
void dealoc_数组(){
对于(大小n=0;n<(变量+1);n++)
删除[]格鲁吉亚文[n];
删除[]格鲁吉亚语;
}

不,它不是一个可变大小的矩阵,我必须在其中添加元素。我想:在标题中将其声明为全局,一旦进入函数,函数将一次性计算其第一个维度并对其进行初始化(解决方案1)。有可能吗?是的,或者我可以在头文件和.cpp文件中用假维度声明它,然后在函数中调整它的大小(解决方案2),但首先我想了解解决方案1是否可行。无论如何,谢谢@georgesl谢谢你的回答,但是,为了完成我在这个主题上的教育,我应该怎么做才能调整一个已经声明并以动态方式分配的二维数组的大小?@alwaysstudent:调整一个动态分配的矩阵的大小确实很痛苦(您不能像任何1D数组那样只是realloc,因为它将覆盖下一行的值)。为此,您必须对新数组进行malloc,将旧数组中的值复制到新数组中,并修改每个指针以指向新数组。最好使用诸如vector、valarray或Boost::MatrixIt之类的STL容器。如果投反对票的人也会对原因发表评论,那就太好了。
Gregorian = read_matrix(NumLastItem+1,MAX_LINES_ALLOWED);
#ifndef ARRAY_HEADER_HPP
#define ARRAY_HEADER_HPP 1

#ifdef ARRAY_IMPL
#define extern // remove extern for implementation
#endif

#define MAX_LINES_ALLOWED 20000
extern int **Georgian;

#ifdef ARRAY_IMPL
#undef extern
#endif

#endif // ARRAY_HEADER_HPP
#define ARRAY_IMPL
#include "array_header.hpp"

void alloc_array(){
    Georgian = new int*[var+1];
    for(size_t n = 0; n < (var+1); n++)
        Georgian[n] = new int[MAX_LINES_ALLOWED];
}

void dealloc_array(){
    for(size_t n = 0; n < (var+1); n++)
        delete[] Georgian[n];
    delete[] Georgian;
}