Когда я использую идиому 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) компилятор может сделать метод встроенным.
В этом случае это не проблема, поскольку класс определен в частном файле, а встраивание не имеет никакого эффекта, поскольку методы вызываются только в одном месте.
Преимущество помещения определения внутри класса состоит в том, что вам не нужно повторять подпись метода.
Итак, это нормально? Есть ли другие проблемы, о которых следует знать?