У меня есть абстрактный базовый класс с именем Base
, для которого другие программисты должны написать реализацию. В какой-то другой части приложения я хочу перехватить все написанные реализации и создать по одному экземпляру каждой. Если бы это можно было сделать без каких-либо дополнительных инструкций для других, помимо «внедрить базу», это было бы прекрасно. Однако приведенный ниже код требует, чтобы каждая реализация регистрировала себя. Это также не работает.
#include <iostream>
#include <vector>
class Base;
std::vector<Base*>* registrationList = new std::vector<Base*>;
class Base {
public:
Base(){}
virtual void execute() = 0;
};
class ImplementationOne: public Base {
public:
ImplementationOne(){registrationList->push_back(this);}
void execute(){std::cout << "Implementation One." << std::endl;}
static int ID;
};
class ImplementationTwo: public Base {
public:
ImplementationTwo(){registrationList->push_back(this);}
void execute(){std::cout << "Implementation Two." << std::endl;}
static int ID;
};
int main(int argc, const char * argv[]){
std::cout << "Registration List size: " << registrationList->size() << std::endl;
for(auto it = registrationList->begin() ; it != registrationList->end() ; ++it){
(dynamic_cast<Base*>(*it))->execute();
}
return 0;
}
Я получаю вывод: Registration List size: 0
, поэтому ясно, что реализации никогда не создавались. Вероятно, очевидно, что этого не произойдет, но я новичок, и это лучшее, что я мог придумать. Я предполагал, что static int ID;
вызовет создание каждой реализации, которая затем зарегистрируется. Я вижу, что static
не приводит к созданию экземпляра. Я оставляю это в своем коде здесь, так как это показывает мое намерение.
Что я могу сделать, чтобы получить автоматическое создание каждой реализации? Является ли это возможным?