Существуют ли какие-либо существующие трюки для создания шаблонов декораторов на C++, которые проще использовать в отношении управления памятью?Как сделать шаблоны декоратора C++ проще в управлении памятью?
Если я использую std :: auto_ptr внутри моего декоратора, я могу создать объект в стиле вложенного нового, и указатели будут удалены должным образом. Однако, если я использую стиль передачи указателей на объекты, связанные с стекем, мы неправильно удаляем эти объекты. Есть ли способ сделать эту работу должным образом или обеспечить соблюдение только одного стиля?
#if 0
T0 t0;
T1 t1(&t0);
T2 t2(&t1);
T3 t3(&t2);
#else
T3 t3(new T2(new T1(new T0)));
#endif
Я определил следующие простые классы испытаний.
#include <QDebug>
#include <memory>
class TI {
public:
virtual void test() = 0;
virtual ~TI() {}
};
class TD : public TI {
public:
TD(TI *ti) : _ti(ti) {}
virtual void test() { return _ti->test(); }
private:
std::auto_ptr<TI> _ti;
};
class T0 : public TI {
public:
T0() { qDebug("%s", __PRETTY_FUNCTION__); }
virtual void test() { qDebug("%s", __PRETTY_FUNCTION__); }
virtual ~T0() { qDebug("%s", __PRETTY_FUNCTION__); }
};
class T1 : public TD {
public:
T1(TI *ti) : TD(ti) { qDebug("%s", __PRETTY_FUNCTION__); }
virtual void test() { TD::test(); qDebug("%s", __PRETTY_FUNCTION__); }
virtual ~T1() { qDebug("%s", __PRETTY_FUNCTION__); }
};
class T2 : public TD {
public:
T2(TI *ti) : TD(ti) { qDebug("%s", __PRETTY_FUNCTION__); }
virtual void test() { TD::test(); qDebug("%s", __PRETTY_FUNCTION__); }
virtual ~T2() { qDebug("%s", __PRETTY_FUNCTION__); }
};
class T3 : public TD {
public:
T3(TI *ti) : TD(ti) { qDebug("%s", __PRETTY_FUNCTION__); }
virtual void test() { TD::test(); qDebug("%s", __PRETTY_FUNCTION__); }
virtual ~T3() { qDebug("%s", __PRETTY_FUNCTION__); }
};
C++ делает узор декоратора больным для использования, я избавился от всех из них в своем коде, я не рекомендую его, если только для существующего кода. – yngccc
Не используйте 'std :: auto_ptr', это устарело, потому что небезопасно обрабатывать то же самое, что' std :: shared_ptr' равно – Mgetz
@yngum: Это полезно для этого: 'ReadableKey (EncryptedKey (LicenseKey))' – Harvey