题
我有一个带有指向接口对象(让我们称之为 pInterface)的(非智能)指针的类,并且我正在构建一个也需要访问该接口的嵌套类。我将通过将接口的指针传递给嵌套类的构造函数来解决这个问题,如下所示:
CNestedClass someClass( pInterface, ... );
但是我不确定将此指针存储在嵌套类中的最佳方法。我可以使用:
1) A scoped (or other smart) pointer (to the original object)
2) A pointer to a pointer
你们有什么建议,为什么?
编辑:我应该澄清 - 嵌套类需要调用接口对象上的方法,但是它不会创建它(或修改“指向”的对象),父类负责这一点。
解决方案
如果任一类都可以更改指针的值,则使用指向指针的指针 - 例如通过删除现有对象并用新对象替换它。这允许两个类通过取消引用指针到指针来仍然使用同一对象。
如果不是,您关心的是确保该对象在两个类的整个生命周期中保持有效。
- 如果嵌套类的寿命较短,您不必担心。
- 如果是相同的,只要您按照正确的顺序进行清理(例如首先是嵌套类,然后是对象)然后再说一次,你不必担心
- 如果嵌套类在所有者被销毁后仍能持续存在,那么您必须实现一种方法来确保该对象也持续存在。
如果您需要确保对象的生命周期,可以通过手动或通过智能指针接口通过引用计数语义来完成。
对于智能指针来说 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);
}
其他提示
您可能想要使用指针指针的另一个原因是外部代码可能会更改原始指针值(例如,使其指向新对象,或将其设置为NULL释放它指向的对象后)。但是,IMO在将指针交给其他人之后更改指针是非常糟糕的做法。
因此,如果外部代码和嵌套类都没有更改指针,只需将它作为原始指针的副本存储在嵌套类中作为成员变量(字段)。
传入指向接口的指针的地址(IMyInterface ** ppInterface),并填写指针,如果它是由类实现的。
该类可以将其this指针强制转换为该接口并填充指针* ppInterface。 如果该类没有实现此接口,则可以将* ppInterface设置为NULL。
基本上,您在两个不同对象之间共享指向同一对象的指针。如果您没有使用任何智能指针,只需将指针存储到共享对象即可。您必须小心共享对象的所有权,即哪个对象负责释放共享对象并通知其他对象它已经消失。
class Outer
{
class Inner
{
};
};
由于 Outer 对象仅保存指向 pInterface 对象的 RAW 指针,这意味着 Outer 对象不拥有或无法控制 pInterface 对象的生命周期。因此,我们希望能够保证 pInterface 对象的生存时间与外部对象一样长;在这种情况下,甚至没有理由使用指针,您可以只使用引用(假设不存在 pInterface 为 NULL 的情况)。
Inner 如何保存其“引用”(不是 C++ 引用)取决于我们确实需要有关所涉及对象之间关系的更多信息!
- 内部对象和外部对象之间的关系是什么?
- 内部对象相对于它继承 pInterface 指针的外部对象的生命周期是多少?
- 如何保证 Outer 对象的生命周期比 pInterface 对象短。
ETC。