C++ 指向指针问题的指针

C++ 指向指针问题的指针,c++,pointers,smart-pointers,C++,Pointers,Smart Pointers,我有一个类,带有指向接口对象的(非智能)指针(我们称之为pInterface),我正在构建一个嵌套类,该类还需要访问该接口。我将通过将指向接口的指针传递到嵌套类的构造函数中来解决这个问题,如下所示: CNestedClass someClass( pInterface, ... ); 但是,我不确定在嵌套类中存储此指针的最佳方式。我可以使用: 1) A scoped (or other smart) pointer (to the original object) 2) A pointer t

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

CNestedClass someClass( pInterface, ... );
但是,我不确定在嵌套类中存储此指针的最佳方式。我可以使用:

1) A scoped (or other smart) pointer (to the original object)
2) A pointer to a pointer 
你们有什么建议?为什么


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

传入指向接口的指针地址(IMyInterface**ppInterface),并填充指针(如果指针是由类实现的)

该类可以将其this指针强制转换到该接口,并填充指针*p接口。
如果类未实现此接口,则可以将*p接口设置为NULL。

如果任何一个类可以更改指针的值,则可以使用指向指针的指针-例如,通过删除现有对象并替换为新对象。这允许两个类通过取消对指针的引用,仍然使用相同的对象

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

  • 如果嵌套类的寿命更短,您就不必担心了
  • 如果是相同的,只要您按照正确的顺序(例如,首先是嵌套类,然后是对象)进行清理,那么您就不必担心了
  • 如果嵌套类可以在所有者被销毁后继续存在,那么必须实现一种方法来确保对象也继续存在
如果需要确保对象的生命周期,可以通过引用计数语义手动或通过智能指针接口来完成

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

(注意,auto_ptr的情况并非如此,在auto_ptr中,对象是专有的)

注意事项

  • 使用boost::shared_ptr时,请确保嵌套类具有共享_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);
    }
    
    typedef boost::shared_ptr shared_接口;
    类嵌套类
    {
    共享接口mInterface;//空指针
    }
    void NestedClass::setInterface(共享接口&foo)
    {
    mInterface=foo;//复制foo。
    }
    void ParentClass::init(void)
    {
    //mInterface也被声明为共享接口
    mInterface=新接口();
    mNestedClass->setInterface(mInterface);
    }
    
    基本上,您是在两个不同的对象之间共享指向同一对象的指针。如果没有使用任何智能指针,只需存储指向共享对象的指针即可。您必须注意共享对象的所有权,即哪个对象负责解除分配共享对象并通知其他人它已消失。

    使用指针指向指针的另一个原因是外部代码可能会更改原始指针值(例如,使指针指向一个新对象,或在释放指针指向的对象后将其设置为NULL)。然而,在我看来,在将指针交给其他人后更改指针是一种非常糟糕的做法

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

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

    内部如何保持它的“引用”(而不是C++引用)依赖于我们确实需要更多关于所涉及对象之间的关系的信息!

    • 内部和外部对象之间的关系是什么
    • 内部对象相对于从中继承pInterface指针的外部对象的寿命是多少
    • 如何保证外部对象的寿命短于pInterface对象

    等等。

    您能进一步说明吗?如果我使用智能指针,那么在父类和嵌套类中使用共享指针可能是个好主意。我同意唯一的问题是它应该保持有效。但是其他方法也可以使用,具体取决于子类的使用方式。(示例:如果保证孩子的寿命比父母短(然后传递参考)).1引用。许多其他答案都涉及引用更适合的指针指向指针。为什么引用更适合?它们基本上是带有甜言蜜语语法的指针。它们也有可能使它们不适合的限制-例如,如果OP希望NULL是接口的有效值。
    class Outer
    {
        class Inner
        {
        };
    };