指向指针问题的指针

Posted

技术标签:

【中文标题】指向指针问题的指针【英文标题】:Pointer to a Pointer question 【发布时间】:2009-03-04 17:52:17 【问题描述】:

我有一个带有指向接口对象的(非智能)指针的类(我们称之为 pInterface),我正在构建一个嵌套类,它也需要访问该接口。我将通过将指向接口的指针传递给嵌套类的构造函数来解决这个问题,如下所示:

CNestedClass someClass( pInterface, ... );

但是我不确定将此指针存储在嵌套类中的最佳方式。我可以使用:

1) A scoped (or other smart) pointer (to the original object)
2) A pointer to a pointer 

你们有什么建议,为什么?

编辑:我应该澄清一下 - 嵌套类将需要调用接口对象上的方法,但是它不会创建它(或修改“指向”的对象),父类对此负责。

【问题讨论】:

【参考方案1】:

使用指向指针的指针是指任何一个类都可以改变指针的值 - 例如通过删除现有对象并用新对象替换它。这允许两个类通过解除对指针的引用仍然使用同一个对象。

如果不是,您关心的是确保对象在两个类的整个生命周期内保持有效。

如果嵌套类的寿命较短,您不必担心。 如果相同,只要您按照正确的顺序进行清理(例如,先嵌套类,然后再清理对象),然后再一次,您不必担心 如果嵌套类在所有者被销毁后仍然存在,那么您必须实现一种方法来确保对象也存在。

如果您需要确保对象的生命周期,可以通过引用计数语义来完成,手动或通过智能指针接口。

对于智能指针, boost::shared_ptr 将是一个不错的选择。 shared_ptr 允许一个对象的所有权被多个指针共享。当最后一个 shared_ptr 超出范围时,该对象被删除。

(注意 auto_ptr 不是这种情况,对象是独占的)。

注意事项;

    使用 boost::shared_ptr 时,请确保嵌套类具有 shared_ptr 的副本,而不是引用/指针。 std::auto_ptr 的行为完全不同,对象是独占而不是共享的 boost::shared_ptr 只能用于堆对象,例如从调用“new”返回的指针

例子:

typedef boost::shared_ptr<Interface> shared_interface;

class NestedClass

  shared_interface mInterface; // empty pointer


void NestedClass::setInterface(shared_interface& foo)

  mInterface= foo; // take a copy of foo.


void ParentClass::init( void )

  // mInterface is also declared as shared_interface
  mInterface = new Interface();
  mNestedClass->setInterface(mInterface);

【讨论】:

您能详细说明一下吗?如果我使用智能指针,大概在父类和嵌套类中使用共享指针是个好主意? 我同意唯一的问题是它应该保持有效。但是根据孩子的使用方式,也可以使用其他方法。 (例如:如果保证孩子的寿命比父母短(然后传递参考)。 +1 参考。许多其他答案涉及指向更适合引用的指针的指针。 为什么引用更适合?它们基本上是具有含糖语法的指针。它们也有可能使它们不适合的限制 - 例如,如果 OP 希望 NULL 成为接口的有效值。【参考方案2】:

您可能希望使用指向指针的指针的另一个原因是,如果 outer 代码可能会更改原始指针值(例如,使其指向新对象,或将其设置为 NULL释放它指向的对象后)。但是,IMO 在将指针交给其他人后更改指针是非常糟糕的做法。

所以,如果外部代码和嵌套类都没有改变指针,只需将其作为原始指针的副本作为成员变量(字段)存储在嵌套类中即可。

【讨论】:

【参考方案3】:

传入一个指向你的接口的指针的地址(IMyInterface**ppInterface),如果它是由类实现的,则填充指针。

该类可以将其 this 指针转换为该接口并填充指针 *ppInterface。 如果类没有实现这个接口,它可以将 *ppInterface 设置为 NULL。

【讨论】:

【参考方案4】:

基本上,您在两个不同的对象之间共享指向同一个对象的指针。如果您不使用任何智能指针,只需将指针存储到共享对象即可。您必须注意共享对象的所有权,即哪个对象负责解除分配共享对象并通知其他对象它已经消失。

【讨论】:

【参考方案5】:
class Outer

    class Inner
    
    ;
;

由于 Outer 的对象仅持有指向 pInterface 对象的 RAW 指针,这意味着 Outer 对象不拥有或无法控制 pInterface 对象的生命周期。因此,我们希望可以保证 pInterface 对象与外部对象一样长;在这种情况下,甚至没有理由使用指针,您可以只使用引用(假设不存在 pInterface 为 NULL 的情况)。

Inner 如何持有它的“引用”(不是 C++ 引用)取决于我们确实需要有关所涉及对象之间关系的更多信息!

内部和外部对象之间的关系是什么。 相对于从其继承 pInterface 指针的 Outer 对象而言,Inner 对象的生命周期是多少? 什么是 Outer 对象的生命周期比 pInterface 对象短的保证。

等等

【讨论】:

以上是关于指向指针问题的指针的主要内容,如果未能解决你的问题,请参考以下文章

指向指针数组和指针数组的指针之间的区别[重复]

指向 const 指针(或指向 const 的指针)

指向 char 指针数组的指针与指向 char 指针的指针(或 char** argv 与 char* (*argv)[])

在 C++ 中使用指针和指向指针的指针读取和存储序列化对象的快速方法

53 指向指针的指针(多重指针)

为啥指向成员函数的指针不像数据指针那样只是内存地址