Другой вариант - использовать идиому Pimpl.
class Foo {
public:
Foo() : pImpl(new FooImpl) {}
// ... Foo's public interface, same as before
private:
Foo& operator=(const Foo& source); //- Foo's assignment operator is private
struct FooImpl;
boost::scoped_ptr<FooImpl> pImpl;
};
struct FooImpl {
// ... all the private data members that use to be in Foo
// Note: using the compiler generated copy assignment operator
};
Оператор назначения копирования является частным от клиентов POV Foo, но вы все равно можете использовать назначение копирования, созданное компилятором, через FooImpl.Компромисс приходит при реализации функций-членов Foo, так как теперь вам нужно обращаться к данным через указатель pImpl.