繁体   English   中英

指向C ++对象的双指针

[英]double pointers to C++ objects

我需要修改另一个程序员编写的非常长的程序。 通过他的代码,您可以看到指向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;来做同样的事情static B* b; 我在忽略什么吗?

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

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

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

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

很难知道您的情况如何,但是您可能想检查一下是否正在进行某种类似的内存优化。

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM