Я столкнулся с ситуацией, где я бы хотел вызвать виртуальный метод из конструктора. Это, конечно, невозможно (или, по крайней мере, это не приводит к желаемому поведению). In this answer в качестве рабочего порядка предлагается использовать заводской метод. Я написал примерно следующее:Как скрыть конструктор при использовании фабрики?
#include <iostream>
class Base {
public:
Base(){}
~Base(){}
// private: ??
virtual void afterConstruction()=0;
};
class Derived : public Base {
public:
Derived() : Base() {}
//private: ??
void afterConstruction(){std::cout<<"construct"<<std::endl;}
};
template <typename T> T MyFactory(){
T t = T();
T* p = &t;
p->afterConstruction();
return t;
}
int main(int argc, char** argv) {
Derived d = MyFactory<Derived>();
return 0;
}
Это своего рода шаблон шаблона метода. Каждый производный класс может настроить способ его построения. Однако вся эта конструкция имеет смысл, когда пользователь этих классов не может напрямую вызвать конструктор или afterConstruction()
. Поэтому я хотел бы, чтобы они были частными. Возможно, это глупый вопрос, и я просто не вижу очевидного. Возможно, я могу достичь этого, используя дружбу или что-то в этом роде, но я не уверен, что это лучший способ. Какой хороший и чистый способ скрыть эти два метода и разрешить создание объекта только с помощью фабричного метода?
EDIT: Ka7Im1011 Я понял, что на самом деле не совсем понятно, о чем я прошу. Таким образом, я попытаюсь прояснить:
Я хочу написать базовый класс, из которого придется вывести другие. Построение производных объектов связано со специфическими вещами, которые я хотел бы оставить вне базового класса. При поиске в Интернете для виртуального конструктора я нашел вышеупомянутый q & a, и я думаю, что заводский подход может работать хорошо. Тем не менее, я не знаю, как достичь следующих целей:
- Необходимо создать экземпляры Derived с завода. В противном случае производный объект может быть создан в несогласованном состоянии. (Я полагаю, что только в базовом классе я не могу обеспечить это, но просить каждого кодера из Derived, чтобы сделать конструктор private/protected достаточным.)
- Если возможно, Derived должен реализовывать только чистые виртуальные методы Base, потому что то писать производный вполне удобные (IDE/компиляторы точно сказать, что должно быть реализовано в противоположность громоздким, а иногда сообщения загадочная ошибка, когда, например, интерфейс параметра шаблона должен быть реализован)
защищены, может быть? – MichaelCMS
... и изготовление фабричного метода 'friend'. –
Смотрите, мой ответ. добавьте комментарий, если вы застряли. –