Config = LoadConfig("config.cfg");
assert(Config != NULL);
Config->GetValue(...)
Вот в таком случае явно не место assert-у. Как минимум -
throw std::exception("wtf w/config?")
Config = LoadConfig("config.cfg");
assert(Config != NULL);
Config->GetValue(...)
throw std::exception("wtf w/config?")
template <typename T>
class Vector { ... }
template <typename T>
class Deque { ... }
template <template <typename> class Container>
class SomeClass
{
Container<SomeDataType> Data;
}
SomeClass<Vector> VectorObject;
SomeClass<Deque> DequeObject;
delete this;
выглядит довольно необычно. Выглядит, как будто мы рубим сук, на котором сидим. Однако, все довольно безопасно, если выполнять меры предосторожности (мыть руки перед едой ;)).this
.void vector::remove(ItT it)
void ::remove(vector* this, ItT it)
int vector::size() const
int ::size(const vector* this)
.this
или как-то по-другому - это все равно. Главное, не пользоваться этим объектом после удаления. Причем (внимание!) нужно перестать им пользоваться совсем, то есть не только в этом методе после выполнения delete this;
, но и там, откуда этот метод вызван.delete this;
естественно надо убедиться, что объект создан через new, а не на стеке или еще как-то (каким-нибудь нестандартным аллокатором). Как убедиться в этом - вопрос дизайна (design). Можно просто написать в документации: "этот объект нужно создавать через new" или сделать конструкторы приватными и создат static-member-ов для создания объектов. Или вообще использовать boost:shared_ptr
, и тогда вместо delete this;
будет sp.release()
, который удалит объект как ему предписывает назначенный deleter.