Es ist hässlicher Code wegen der protected
variabel.
Ich schlage vor, dass wir sie umgestalten. Zunächst sollten wir dafür sorgen, dass die gesamte Eigentumslogik isoliert wird, damit sie leichter zu beweisen ist.
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(); }
};
Das ist aber nur ein erster Schritt, denn Sie sollten nicht versuchen, Ressourcen direkt zu manipulieren, denn das würde nur dazu führen, dass sie verloren gehen. Jetzt nehmen wir also unsere glänzende Schnittstelle und formen die Implementierung um:
// 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 :)
Ist das nicht viel besser?