gpt4 book ai didi

c++ - 创建基于堆的2D数组而不使用双指针语法?

转载 作者:行者123 更新时间:2023-12-02 10:10:26 26 4
gpt4 key购买 nike

我需要将2D数组声明为类的成员变量。我不能使用STL(因此,没有 vector ),并且要求我避免使用双/三重指针。我希望能够使用下标符号来引用此2D数组中的元素,例如arr[0][0]。由于数组的大小,还必须在堆上声明该数组。
由于我的要求,StackOverflow上的现有答案都无法满足我的需求。
我一直在尝试做的是:

class MyClass {
public:
MyClass() : arr(new int[1000][2]) {}

// other stuff here

private:
int arr[1000][2];
};
编译该类后,我得到的错误是“无法使用 int *类型的左值初始化 int[1000][2]类型的参数”。显然,我可以使用指针语法解决此问题,但是如上所述,为了代码清晰起见,我被要求使用“数组语法”。我希望对C++有更好理解的人可以解释如何使用“数组语法”。

最佳答案

当然,您可以在没有双/三指针的情况下执行此操作。您甚至可以在类声明中不使用任何指针的情况下执行此操作。但是首先让我们看一下更常见的方法。 2D数组是1D数组的简单扩展。
从标准方法开始,这是使用vector对1000个int的1D数组进行的。指针arr在堆栈上,但指向堆上1000个整数的数组。

class MyClass {
public:
MyClass() : arr(new int[1000]) {}

private:
int *arr;
};
元素以通常的方式访问。例如 arr[0]=42;将其扩展到堆中的2D数组是上面的简单扩展。
您需要将成员变量声明为指向1D数组的指针,而不是基本类型。
class MyClass {
public:
MyClass() : arr(new int[1000][2]) {}

private:
int (*arr)[2];
};
同样,您可以按通常方式引用2D数组的元素: arr[0][0]=42;最后,除了 new所需的指针之外,还有一种方法可以完全消除指针。在这里,我们初始化一个引用。诀窍是在新的 [1]中添加第三级,以便 *new返回一个对象,该对象是实际的2D int数组。从结构上讲,它与上面的指针版本没有什么不同,但是让我们直接初始化对2D int数组的引用。当然这不是一个常见的习惯用法,所以我会坚持使用ptr方法。
class MyClass {
public:
MyClass() : arr(*new int[1][1000][2]) {}
~MyClass() {delete[] arr;}
//private: // to test
int(&arr)[1000][2];
};


int main()
{
MyClass obj;
obj.arr[2][1] = 42;
}

关于c++ - 创建基于堆的2D数组而不使用双指针语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63813522/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com