将所有方法放在类定义中

时间:2010-12-23 09:32:02

标签: c++ inline pimpl-idiom

当我使用pimpl习语时,将所有方法定义放在类定义中是否是个好主意?例如:

// in A.h

class A {
   class impl;
   boost::scoped_ptr<impl> pimpl;
public:
   A();
   int foo();
}

// in A.cpp

class A::impl {
   // method defined in class
   int foo() {
       return 42;
   }

   // as opposed to only declaring the method, and defining elsewhere:
   float bar();
};

A::A() : pimpl(new impl) { }
int A::foo() {
   return pimpl->foo();
}

据我所知,将方法定义放在类定义中的唯一问题是 (1)实现在包含类定义的文件中可见,并且 (2)编译器可以使该方法内联。

在这种情况下,这些不是问题,因为类是在私有文件中定义的,并且内联没有任何效果,因为只在一个地方调用方法。

将定义放在类中的优点是您不必重复方法签名。

所以,这样可以吗?还有其他问题需要注意吗?

4 个答案:

答案 0 :(得分:3)

我认为你回答了自己的问题:两种解决方案都是等价的。

但是,我不太确定'内联没有效果,因为只在一个地方调用方法':当函数没有内联时,另外一个调用可以存在。但很有可能编译器足够智能,可以远离外层的单行转发调用进行优化。

最后,我认为这只是一个品味问题。

答案 1 :(得分:2)

优点:

  • 该类的所有代码都已本地化

缺点:

  • 对于较大的类:当需要滚动时,更难以知道函数属于哪个类。
  • 当函数驻留在所有类声明之后时,
  • 依赖关系更容易解决。否则,可能需要将某些类声明移到其他类之后,并且在内部类相互依赖时,仍然必须在类声明之后移动某些函数。

答案 2 :(得分:1)

通常我不会向Impl内部类添加方法,但如果您定义内联方法,我看不出任何问题。在我看来,它比单独的声明和定义更具可读性。

答案 3 :(得分:0)

编译器是否内联方法取决于编译器和传递的参数。

在pimpl习语的情况下,我认为这些方法是否在Imp的体内定义并不重要。我个人喜欢在外面定义它们,因为很容易看出什么是真正重要的(比如成员变量和方法列表)。