Включение всех методов в определение класса

Когда я использую идиому 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) компилятор может сделать метод встроенным.

В этом случае это не проблема, поскольку класс определен в частном файле, а встраивание не имеет никакого эффекта, поскольку методы вызываются только в одном месте.

Преимущество помещения определения внутри класса состоит в том, что вам не нужно повторять подпись метода.

Итак, это нормально? Есть ли другие проблемы, о которых следует знать?

6
задан Amnon 23 December 2010 в 09:32
поделиться