В моем приложении я должен получить некоторые классы из базового, проблема в том, что я хочу, чтобы принудительно применяла производную классификацию для реализации 3 конкретных конструкторов. Поскольку у C++ нет виртуального чистого конструктора, он казался довольно отчаянным (мне пришлось вручную проверять каждую реализацию класса, чтобы убедиться, что конкретные ctors реализованы, а не забавно делать).имитировать виртуальный конструктор в C++
Вчера я нашел сумасшедший способ имитировать поведение виртуального CTOR:
template <class T>
class AbstractEnforcer{
protected:
AbstractEnforcer(){}
private:
static void Enforcer(){
delete new T();
delete new T(*(new unsigned int));
delete new T(*(new unsigned int, *(new QString));
}
}
class AbstractClass : private AbstractEnforcer<AbstractClass>{
}
единственное неудобство этого подхода заключается в том, что я должен объявить все производный класс с синтаксисом:
class X : private AbstractEnforcer<X>
И даже если это не проблема; потому что метод Enforcer() никогда не называется (и даже так он ничего не делает [надеюсь, что так !!!])
Мой вопрос: «есть ли какое-либо среднее значение (не с макросами), чтобы заставить производный класс использовать этот механизм не parametrazing в AbstractClass (потому что это будет работать только один уровень вывода»
template <class T>
class AbstractClass : private AbstractEnforcer<T>{
}
В действительности я определил функцию принудительного выполнения в другом файле cpp, и проверка статического конструктора работает неплохо, но я признаю, что это лучший способ сделать это (я использую gcc-4.x) t знать, работает ли это с другими компиляторами. – chedi
Проблема заключается в том, когда я хочу получить класс a из AbstractClass, компилятор не применяет проверку прототипа, поскольку AbstractClass наследует AbstractEnforcer :: Enforcer(), и нет автоматического средства для проверки на AbstractEnforcer –
chedi
Вам придется наследовать каждый новый класс, которого я боюсь, поскольку эта функция должна пытаться вызвать конструкторы каждого класса, а не только конструкторы непосредственно наследуемого от него. Но все будет хорошо. – rmn