Добавление функций в класс, но избегать перекомпиляции - PullRequest
0 голосов
/ 21 сентября 2018

В настоящее время у меня есть

Class ModelFac: public Singleton <ModelFac>{ public: friend class Singleton <ModelFac>; ModelFacPtr CreateModelA (bool buy, std::string ccy, const std::string& str){ //some implementations here } ModelFacPtr CreateModelB (bool buy, std::string useful_ccy){ //other implementations } };

Когда я хочу вызвать функции, я позвоню ModelFac::Instance().CreateModelA(a,b,c).Эти функции вызываются в разных .cc файлах.Однако, когда я добавляю новую функцию CreateModelC, все файлы, которые вызывают ModelFac::Instance().CreateModelX(a,b,c,d,e), необходимо будет перекомпилировать, поскольку все они включают ModelFac.h, что действительно требует много времени.

Можно ли как-то исправить эту ситуацию, но все жеоставить ModelFac::Instance().CreateModelA(a,b,c) этот тип формата вызова для реализации?

Я не хочу создавать разные классы для разных функций CreateModel, что повлечет за собой множество исправлений во всей программе.Будет здорово, если я все еще смогу использовать ModelFac::Instance(), но затем передам CreateModelA в качестве первого аргумента.

Спасибо.

1 Ответ

0 голосов
/ 22 сентября 2018

Просто добавьте новый общий метод CreateModel к вашему ModelFac классу (я предполагаю, что тип ModelFacPtr должен быть ModelPtr для лучшего именования, но это не важно для моегорешение):

class ModelFac : public Singleton<ModelFac> {
public:
    ...
    ModelPtr CreateModelA(bool buy, std::string ccy, const std::string& str) {...}
    ModelPtr CreateModelB(bool buy, std::string useful_ccy) {...}

    ModelPtr CreateModel(Creator& creator) { return creator.Create(); }
};

Вот интерфейс Creator (конечно, вы должны объявить его перед классом ModelFac):

class Creator {
public:
    virtual ModelPtr Create() = 0;
};

Каждый раз, когда у вас есть новыйтип модели для создания, скажем, модель C, просто напишите новый Creator класс:

class CCreator : public Creator {
public:
    CCreator(bool buy, std::string foo, int bar)
        : m_buy(buy), m_foo(foo), m_bar(bar) {}
    ModelPtr Create() {
        // use m_buy, m_foo, and m_bar to create and return the model
    }
private:
    bool m_buy;
    std::string m_foo;
    int m_bar;
};

Теперь, чтобы создать модель C, напишите:

ModelFac::Instance().CreateModel( CCreator(true, "haha", 777) );

Как видите, класс ModelFac не изменяется каждый раз, когда у вас появляется новый тип Model.Вам нужно написать новый Creator класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...