我认为了解声明变量时得到的结果非常重要。如在内存中实际创建的内容。
那么让我们来看看SomeClass*** world;
。这对你有什么好处?它会给你一个指针矩阵SomeClass
吗?不,它没有。事实上,您可能会惊讶地发现,这只会为您带来一件事而且只有一件事 - 一个指针。是的,没错,只有一个指针。您已经定义了这个world
变量,它是一个指针,这就是您从中得到的全部。那个单指针。
然后,该指针应用于指向其他指针,这些指针又指向指向 的指针SomeClass
。但是,它指向的那些东西还不存在。因此,当您迭代最多 20 次并做i
时,您正在尝试访问一个根本不存在的指针矩阵。j
world[i][j]
现在要使您编写的内容起作用,同时仍在使用SomeClass***
,您需要分配指针矩阵:
world = new SomeClass**[20];
for (int i = 0; i < 20; i++) {
world[i] = new SomeClass*[20];
}
所以首先我们分配一个 20 的数组SomeClass**
,然后我们让每个指针指向一个分配的 20 数组SomeClass*
。这给了你你想要的...
但坚持住- 这很难看。这不是 C++ 的编写方式。这么多的动态分配根本没有理由。这也意味着delete
当你完成所有事情时,你必须记住它——这也很丑陋。如果您不依赖动态分配,这一切都会变得容易得多。您可以只创建一个多维数组而不是使用指针,并且您的生活已经变得容易多了:
SomeClass* world[20][20];
所以现在world
是一个 20 x 20 的指针数组SomeClass
。你实际上在记忆中得到了它。你不会像以前那样得到一个指针。你得到一个完整的多维指针数组!幸运的你。
现在,您可以通过根本不使用指针来使它变得更好。目前,您需要动态分配SomeClass
对象并将指向它们的指针粘贴到数组中。但是为什么不使用数组来SomeClass
代替呢?
SomeClass world[20][20];
现在你有了一个多维SomeClass
对象数组!生活没有比这更好的了。您不必手动分配或删除任何东西。您在内存中获得了一个完整的多维数组,其中每个元素已经是一个SomeClass
对象,可以为您的服务做好准备。
我们甚至可以通过使用标准库中的容器来进一步提高安全性。如果您使用的是 C++03,则可以使用 astd::vector<std::vector<SomeObject> >
但这可能有点矫枉过正。但是,C++11 引入了一种巧妙地替代传统数组的类型,并使其更加安全:std::array
. 你可以像这样使用它:
std::array<std::array<SomeObject, 20>, 20> world;