我有以下类(class)
class CItem
{
public:
CItem(CRegistry &Registry) _Registry(Registry) {Registry.Register();}
~CItem() {_Registry.Unregister()};
private:
CRegistry &_Registry;
}
一段时间后,事实证明并非所有CItem对象都需要注册,因此我需要一个CItem版本,该版本不需要构造函数中的Registry(当然也不需要注册代码)。我该如何实现?
我在这里看到的唯一解决方案是获取并保留Registry作为指针。是否有更优雅的解决方案,例如使用模板等(我不喜欢从引用切换为指针)?
最佳答案
如果要保留单个类,只需将属性更改为原始指针,然后将其设置为null。正如尼尔指出的那样,针对原始指针存在着广泛的,没有充分理由的圣战,这是没有充分理由的。使用原始指针并清楚地记录(注释)该对象不拥有指向内存的所有权,这样以后就不会有人想在析构函数中添加delete
了。
所有其他解决方案都比内部使用指针更糟糕。这是一个实现细节。还要考虑是否有意义。您的代码将不再能够假定该指针是有效的,它将使类内部的逻辑变得复杂。
class CItem
{
public:
CItem(CRegistry &Registry) : _Registry(&Registry) {Registry->Register();}
CItem() : _Registry(0) {}
~CItem() { if ( _Registry ) _Registry->Unregister(); }
private:
CRegistry *_Registry; // Pointer is not owned. Do not delete!
};
最后一点:不要为属性加上单个下划线前缀,因为标准为C++实现保留了这些属性(编译器和标准库)