类中的常量数组大小
Constant array size in class
我在构造函数中创建数组时遇到问题。看看我的代码:
class foo
{
private:
const int size;
double *tab;
public:
foo(int s);
};
foo::foo(int s):size(s)
{
tab = new double[size][size];
}
构造函数无法创建新数组,因为数组的大小不是常数值。。。怎么了?我打赌这真的很容易。
第页。S我为我糟糕的英语道歉。
tab
需要是双指针,并且需要在循环中单独分配第二个维度。
class foo
{
private:
const int size;
double **tab;
public:
foo(int s);
~foo();
};
foo::foo(int s) : size(s)
{
tab = new double*[size];
for (int i = 0; i < size; ++i)
tab[i] = new double[size];
}
foo::~foo()
{
for (int i = 0; i < size; ++i)
delete [] tab[i];
delete [] tab;
}
只有第一个维度可以是可变的。后面的必须是编译时间常数。
tab=新双[大小][10];//例如
在这种情况下,选项卡需要是指向数组的指针:
double(*tab)[10];
如果你需要第二个维度也是可变的,那么你需要做一些事情,比如其他答案。
问题是,在C++中,数组维度需要在编译时已知,可能除了第一个维度,您可以在运行时将其提供给数组new[]
运算符。
有几种方法可以修复您的代码:
- 使CCD_ 3成为CCD_
- 将
tab
设为double**
,分配new double*[size]
,然后分配循环中的各个行,或者 - 保持
tab
为double*
,分配new double[size*size]
,并在访问值时进行自己的索引转换
我认为第一种方法是最好的,因为它可以在不写太多代码的情况下避免潜在的泄漏:
class foo
{
private:
// const int size; <<== You don't need it - tab.size() gives you the size
vector<vector<double>> tab;
public:
foo(int size);
};
foo::foo(int size)
: tab( vector<vector<double> >(size, vector<double>(size, 0.0) ) )
{
}
如果你决定采用第二种或第三种方法,请记住遵循三条规则。
您需要首先分配一个数组指针数组,然后分配每个单独的数组。如需更深入的讨论,请参阅本文。这是我推荐的代码。不要忘记包括析构函数,正如我在这里展示的那样。
class foo
{
private:
const int size;
double **tab;
public:
foo(int s);
~foo();
};
foo::foo(int s):size(s)
{
tab = new double*[size];
for (int i = 0; i < size; i++)
{
tab[i] = new double[size];
}
}
foo::~foo()
{
for (int i = 0; i < size; i++)
{
delete [] tab[i];
}
delete [] tab;
}
使用std::vector of std::vector of double:
typedef std::vector< double > double_vector;
typedef std::vector< double_vector > double_2d_vector;
[狙击]
double_2d_vector tab;
[狙击]
foo::foo(int s)
: size(s), tab( s, double_vector( s, 0.0 ) )
{
}
[狙击]
tab[ x ][ y ] = 4.57;
你真的不应该使用原始指针。
相关文章:
- 是默认情况下分配给char数组常量的值
- 如何创建长度由常量参数指定的数组
- C++常量数组的编译时间较长
- 从另一个静态常量数组初始化静态常量数组(只需少量计算)
- 使用双指针传递 2D 常量数组
- 将字符串数组传递给接受常量字符**的函数
- 检查输入 std::array 指针数据是否等于某个常量数组
- 为什么不能用常量表达式声明数组?
- 如何在可执行文件中存储常量数组?
- 无法在声明时使用初始值设定项列表初始化常量字符*/字符串数组的向量
- 初始化常量字符* 数组
- C++将常量字符* 指针数组传递给对象
- 初始化不是整数的巨大常量多维数组的最佳方法是什么?
- 常量数组如何在每个元素中只能包含字符,而 char* 数组能够指向每个元素中的字符串?
- 为什么不建议使用宏符号常量定义一个固定长度的数组呢
- 我可以使用常量定义数组的长度,那么为什么 int d[b] 不起作用呢?
- 如何为包含另一个类实例的数组制作常量 getter?
- LLVM 无法将数组类型强制转换为常量数组
- 如何删除#define使用在c++数组常量
- 静态数组常量是否会影响共享库布局