方法中对象所有权的命名约定

时间:2011-04-01 07:21:07

标签: c++ oop naming-conventions

有没有办法对代码的签名进行编码,对象所有者是否会发生变化?在获取或返回指针的Getter()和Setter()中,您永远不知道对象所有权是否发生了变化。

您如何看待:

// Uses pConfiguration or creates its own copy - the ownership is un-touched
void ContainerClass:SetConfiguration( const Configuration* pConfiguration ) {}
// Takes the ownership of pConfiguration (and deletes it in the destructor)
void ContainerClass:PutConfiguration( Configuration* pConfiguration ) {}
// Returns a 'reference' and keeps the ownership (you must not delete it)
const Configuration* ContainerClass::GetConfiguration() {}
// Returns a _new_ object and transfers the ownership to you
Configuration* ContainerClass::TakeConfiguration() {}

Set()和Put()以及Get()和Take()是一种编码方式,或者你会使用类型(const与非const) - 或者你是否从中知道它上下文

最诚挚的问候,

查理

3 个答案:

答案 0 :(得分:5)

在接口中识别所有权未更改的最佳方法是不使用指针。更喜欢引用指针:

// Does not take ownership
void ContainerClass::SetConfiguration( const Configuration& config ) {}

// Does not release ownership
const Configuration& ContainerClass::getConfiguration() const {}

当您需要实际转移内存的所有权时,最好通过名称进行记录。如果您真的感到渴望在签名中明确表达,请使用古老的std::auto_ptr

void ContainerClass::SetConfiguration( std::auto_ptr<Configuration> cfg );
std::auto_ptr<Configuration> ContainerClass::CopyConfiguration() const;

std::auto_ptr具有奇怪的属性, copy 实际上意味着转移所有权

答案 1 :(得分:2)

  1. 写好文档和评论(可以使用doxygen)
  2. 在Qt中,函数通常使用所谓的所有权方法itemAttakeAt以及addXXX,并始终转移所有权,这反映在文档中。因此,您可以使用get() / take()set() / put()。无论如何,好的文档总是有用的,甚至你的函数名都是自我解释的。

答案 2 :(得分:0)

大多数情况下,使用指针时,没有“所有权”可以开始 有,所以没有变化的问题。但设计是关键;该 类的作用应该明确它与对象的关系 指着。比所有权或其他更高的水平。然后 反过来,关系决定了它对象的作用。

对于所有权相关的特殊情况,std::auto_ptr 是表达转移的标准方式。这是绝对的转移, 虽然;如果参数的类型为std::auto_ptr,则调用者 一旦他被称为函数,甚至无法访问该对象。 (我有 发现这在线程场景中非常有效。它确实有意义 对于某个对象在任何给定时间由特定线程拥有,以及 没有其他线程可以访问它,std::auto_ptr表达了这一点 非常清楚有效。)