打印在类中创建的数组

吉尔斯

我正在尝试打印在类初始值设定项中创建的数组。我尝试了多种方法,但我的发现是我必须使用指针来解决这个问题。编码:

#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可以[][]用于轻松访问而不是指针运算。

请注意,您不再需要sizeVerticaland 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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在类中创建对象数组

来自分类Dev

在类PHP中创建数组

来自分类Dev

如何在Swift中创建类数组

来自分类Dev

如何从Matlab中的数组创建等效类

来自分类Dev

在dafny中创建类类型的数组

来自分类Dev

使用数组在类中创建对象

来自分类Dev

如何在Swift中创建类数组

来自分类Dev

在类中创建数组对象,ruby

来自分类Dev

在类成员函数中创建动态数组

来自分类Dev

在类构造函数中创建数组

来自分类Dev

问题:在类中创建动态数组

来自分类Dev

如何打印在PHP中的类函数内部创建的多个变量

来自分类Dev

使用Java从类数组中创建类的新实例

来自分类Dev

如何在用C ++创建的类中创建数组?

来自分类Dev

使用C中的指针创建/打印数组

来自分类Dev

创建数组并将其打印到TXT文件中

来自分类Dev

使用C中的指针创建/打印数组

来自分类Dev

在C ++中创建和打印2D数组

来自分类Dev

从类数组创建实例

来自分类Dev

无法从数组中打印信息时,无法找出如何遍历存储在类中的数组?

来自分类Dev

从类中打印矢量

来自分类Dev

在类C ++中创建数组而不声明其大小

来自分类Dev

在Java中创建类数组时的java.lang.ClassCastException

来自分类Dev

如何在C ++中创建抽象类的数组

来自分类Dev

使用列表而不是数组在类中创建对象

来自分类Dev

如何创建数组列表类并在Flutter中获取数据

来自分类Dev

在Python中创建2D类数组

来自分类Dev

在C ++中创建自定义类的本机数组

来自分类Dev

VB.net从类创建的数组中检索特定值?