Это ужасный код из-за переменной protected
.
Я предлагаю изменить это. Во-первых, давайте удостоверимся, что вся логика владения изолирована, чтобы ее было легче доказать.
class Base
{
public:
Base(): some(0) {} // better initialize it...
virtual ~Base() { delete some; }
void init() { delete some; some = this->initImpl(); }
private:
Base(Base const&); // no copy
Base& operator=(Base const&); // no assignment
virtual SomeType* initImpl() { return new SomeType(); }
SomeType* some;
}; // class Base
class Derived: public Base
{
virtual SomeOtherType* initImpl() { return new SomeOtherType(); }
};
Это только первый шаг, потому что вы не должны пытаться манипулировать ресурсами напрямую, вы только собираетесь их утечь. Итак, теперь мы берем наш блестящий интерфейс и изменяем форму реализации:
// something that you should definitely have for your base classes
class noncopyable { protected: noncopyable() {} private: noncopyable(noncopyable const&); noncopyable& operator=(noncopyable const&); };
class Base: noncopyable
{
public:
Base() {}
virtual ~Base() {}
void init() { some.reset(this->initImpl()); }
private:
virtual SomeType* initImpl() { return new SomeType(); }
std::auto_ptr<SomeType> some;
}; // class Base
// same Derived class, that's the beauty of insulation :)
Разве это не намного лучше?