4

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

CNestedClass someClass( pInterface, ... );

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

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

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

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

4

5 回答 5

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”返回的指针

例子:

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);
}
于 2009-03-04T17:57:25.297 回答
2

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

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

于 2009-03-04T18:01:17.750 回答
1

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

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

于 2009-03-04T17:53:53.387 回答
0

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

于 2009-03-04T18:01:10.387 回答
0
class Outer
{
    class Inner
    {
    };
};

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

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

  • 内部对象和外部对象之间的关系是什么。
  • 与继承 pInterface 指针的 Outer 对象相比,Inner 对象的寿命是多少?
  • 什么是 Outer 对象的寿命比 pInterface 对象短的保证。

等等

于 2009-03-04T18:18:13.483 回答