我正在尝试打印在类初始值设定项中创建的数组。我尝试了多种方法,但我的发现是我必须使用指针来解决这个问题。编码:
#include <iostream>
// arr.h
class Arr
{
private:
const int sizeVertical;
const int sizeHorizontal;
int *ptr;
public:
Arr(int sizeVertical, int sizeHorizontal);
void Init();
void Print();
};
// arr.cpp
Arr::Arr(int _sizeVertical, int _sizeHorizontal)
: sizeVertical(_sizeVertical),
sizeHorizontal(_sizeHorizontal)
{
int arr2d[sizeVertical][sizeHorizontal];
ptr = &arr2d[0][0];
}
void Arr::Init()
{
for(int i=0; i<sizeVertical; i++)
{
for(int j=0; j<sizeHorizontal; j++)
{
*(ptr + i * sizeHorizontal + j) = i+j;
}
}
}
void Arr::Print()
{
for(int i=0; i<sizeVertical; i++)
{
for(int j=0; j<sizeHorizontal; j++)
{
std::cout<<*(ptr + i * sizeHorizontal + j)<<std::endl;
}
}
}
// main.cpp
int main()
{
Arr test(4,3);
test.Init();
test.Print();
}
在我定义数组的方法 (Init) 中,我还可以按照方法 (Print) 中使用的相同方式打印数组。但是当尝试以不同的方法打印数组时,输出看起来很奇怪。输出:
0
22025
955388640
32767
10
0
-1247975061
32668
1
3
-1549041632
22025
有任何想法吗?
您创建本地数组并将其第一个元素的地址分配给指针。但是当构造函数完成时数组就消失了,因此存储在指针中的地址已经失效。
在 Undefined Behaviour 中访问此地址,这意味着当您运行该代码时,任何事情都可能发生。
处理此问题的最佳方法是使用std::vector<std::vector<int>>
,如评论中所建议:
#include <vector>
class Arr
{
private:
const int sizeVertical;
const int sizeHorizontal;
std::vector<std::vector<int>> arr2d;
public:
Arr(int sizeVertical, int sizeHorizontal);
void Init();
void Print();
};
// arr.cpp
Arr::Arr(int _sizeVertical, int _sizeHorizontal)
: sizeVertical(_sizeVertical),
sizeHorizontal(_sizeHorizontal),
arr2d(_sizeVertical, std::vector<int>(_sizeHorizontal))
{
}
Init
可以[][]
用于轻松访问而不是指针运算。
请注意,您不再需要sizeVertical
and sizeHorizontal
,您可以使用arr2d.size()
andarr2d[0].size()
代替:
for(int i=0; i<arr2d.size(); i++)
{
for(int j=0; j<arr2d[0].size(); j++)
{
}
}
我个人认为命名常量比这更易读,但它们要求你永远不要改变向量的大小。如评论中所述,您还可以在需要它们的函数中在本地创建此类常量。
您也可以使用动态内存分配,但我不建议这样做。很难正确管理内存,您必须遵循三/五规则
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句