1

我需要修改一个由另一个程序员编写的非常长的程序。通过他的代码,您可以看到指向 C++ 对象的双指针。我不明白为什么在这种情况下使用双指针,我认为单指针会做同样的事情。一个例子可以更清楚地说明:

class A {
...
public:
   static B** b; //why double pointers here?
   ...
}


Class B {
...
public: 
   B(...)
   func1();
   func2();
}

我们需要有许多来自B类的对象,比如说 5 个对象(不是2D 对象数组)。一旦我们创建b,代码就不会篡改 *b。仅调用 B 的函数b[i]->func1()。所以,既然我们不改变指针,我想我们可以通过定义static B* b;. 我忽略了什么吗?

4

5 回答 5

2

如果您想要一个(原始)指针的动态(原始)数组,那么您确实需要一个指向指针的指针。

当然,C++ 方式将是智能指针的向量,或类似的东西。

如果没有看到完整的上下文,很难说更多。

于 2012-02-14T23:26:09.820 回答
2

在旧版本的 Mac OS 上,这些被称为句柄。使用它们是为了让操作系统可以在不破坏指针的情况下重新排列内存。(也就是说,只要您只保留指向指针的指针,操作系统就可以移动您的对象并更改指向它们的指针。)

很难知道你的情况发生了什么,但你可能想检查一下是否正在进行某种类似的内存优化。

于 2012-02-14T23:28:07.443 回答
2

也许程序员需要一组 B 类型的对象或从 B 派生的对象(或者根本不阻止未来程序中的这种能力)?因为从 B 派生的对象可以具有不同的大小,所以您不能简单地将它们一个接一个地放在一个数组中 - 因此增加了额外的引用级别。

在 C++ 中,如果您使用的是 boost 库,则可以通过boost::ptr_vectoror相对干净地实现此行为,boost::ptr_array这将隐藏双指针的丑陋并防止您犯其他意外错误。

于 2012-02-14T23:39:57.900 回答
1

如果它是单个指针,那么您是对的,它将是指向 B 对象实例的指针列表。

有双指针的事实并不一定意味着他试图创建一个 B 对象的二维数组。也许他试图使 B 对象列表不是 B 对象列表,而是一个对 B 对象的引用列表(例如指向 B 对象的指针)。

也许在您的应用程序的上下文中存储指向 B 对象而不是对象本身的指针听起来是个好主意?

无论如何,就像我说的,双指针并不总是意味着双列表。

于 2012-02-14T23:45:24.397 回答
0

指向某物的指针用于告诉代码在哪里可以找到该某物或将该某物放在哪里。因此,当您需要告诉代码在哪里找到指针或在哪里放置指针时,使用指向指针的指针。

于 2012-02-14T23:36:20.820 回答