Здравствуйте, pastey, Вы писали:
P>Супер — спасибо большое — выглядит очень классно, особенно первое.
P>Второе тоже ничего, но на ран-тайм откладывать не хочется — пропустим какой-то редко используемы случай и кирдык.
P>Завтра испытаю — отпишусь, сейчас под рукой нет компилятора.
// Объект, который нельзя создать, иначе чем встроенной в него фабрикой...
class IDynCreatedObject {
public:
virtual ~IDynCreatedObject() {}
template<typename TDynCreatedObject> static TDynCreatedObject* CreateNew()
{ return new objectPlaceholder<TDynCreatedObject>; }
template<typename TDynCreatedObject> static TDynCreatedObject* CreateCopyOf( const TDynCreatedObject& toClone )
{ return new objectPlaceholder<TDynCreatedObject>( toClone ); }
template<typename TDynCreatedObject> static TDynCreatedObject* CreateNew( TDynCreatedObject*& toInit )
{ return toInit = CreateNew<TDynCreatedObject>(); }
private:
class secretSeed {};
virtual secretSeed checkSecretSeed( secretSeed ) = 0;
template<typename TDynCreatedObject>
struct objectPlaceholder : TDynCreatedObject {
objectPlaceholder() {}
objectPlaceholder( const TDynCreatedObject& other ) : TDynCreatedObject( other ) {}
secretSeed checkSecretSeed( secretSeed ss ) { return ss; }
};
};
#endif//!DynCreatedObject_h
это VC2008 типа.
пример использования:
struct testDCO : IDynCreatedObject {
// secretSeed checkSecretSeed( secretSeed ss ) { return ss; }
};
struct testTestDCO {
// testDCO forbiddenField;
};
void testIDynCreatedObject ()
{
// delete new testDCO;
// testDCO autoObj;
testDCO* obj = testDCO::CreateNew(obj); // Тут нет UB, так как возврат из функции -- точка следования!
delete obj->CreateCopyOf( *obj );
delete obj;
}
закомментированные строчки не компилируются...
В принципе, возможно, будет удобно сразу скрестить это с
этимАвтор: Erop
Дата: 26.04.08
...
Но это уже как приложится и что на самом деле нужно
Пиши в общем чего и в какой форме пригодилось...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском