指向C++对象的双指针

double pointers to C++ objects

本文关键字:指针 对象 C++ 指向      更新时间:2023-10-16

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

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

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

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

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

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

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

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

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

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

很难知道你的情况发生了什么,但你可能想看看是否有类似的内存优化正在进行。

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

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

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

不管怎样,就像我说的,双指针并不总是意味着双列表。

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