指向指针问题的指针

时间:2009-03-04 17:52:18

标签: c++ pointers smart-pointers

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

CNestedClass someClass( pInterface, ... );

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

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

你们会建议什么?为什么?

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

5 个答案:

答案 0 :(得分:6)

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

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

  • 如果嵌套课程更短,你不必担心。
  • 如果它是相同的,只要你按照正确的顺序进行清理(例如先嵌套类,稍后是对象)然后再次,你不必担心
  • 如果嵌套类在所有者被销毁后仍然存在,那么您必须实现一种方法来确保该对象也会持续存在。

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

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

(请注意,auto_ptr不是这种情况,对象是专有的)。

要注意的事情;

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

    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 :(得分:2)

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

class Outer
{
    class Inner
    {
    };
};

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

Inner如何保持其'引用'(不是C ++引用)取决于并且我们真的需要有关所涉及对象之间关系的更多信息!

  • 内部和外部物体之间的关系是什么?
  • 内部对象相对于它继承了pInterface指针的外部对象的生命周期是什么?
  • 外部对象的寿命比pInterface对象短的保证是什么。