【问题标题】:Adding functions into class but avoid recompilation将函数添加到类中但避免重新编译
【发布时间】:2018-09-21 16:01:08
【问题描述】:

目前我有一个

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 作为第一个参数传递,那就太好了。

谢谢。

【问题讨论】:

  • 如果你真的“拥有”它,那么你拥有的不是 C++。请使用复制和粘贴的方式发布真实代码。
  • 如果CreateModelC是一个公共函数,你无能为力,如果它是私有的,那么你可以使用pimpl idiom从头文件中隐藏函数
  • 尝试将指针传递给函数或函数对象。
  • @NeilButterworth 该代码属于一个大项目,很难发布所有实现。您实际上“拥有”它是什么意思?你的意思是修复解决方案不存在?
  • 不确定 Neil 指的是什么,但作为一个例子,Class 不是 c++ 中的关键字,你也不能在没有编译器向你抛出错误的情况下在签名中写 a list of arguments。这似乎是次要的挑剔,但在讨论代码时,查看代码而不是几乎看起来像代码的东西会有所帮助

标签: c++ design-patterns


【解决方案1】:

只需向您的ModelFac 类添加一个新的general 方法CreateModel(我假设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 类。

【讨论】:

  • 谢谢!我们是否也可以向ModelFac 添加一个映射并将我们在CCreator.cc 中创建的新模型注册到映射中,这样我什至不需要将CCreator.h 包含到调用ModelFac::Instance().CreateModel( CCreator(true, "haha", 777) ) 的文件中?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-08
  • 1970-01-01
  • 2019-05-24
  • 2022-10-24
  • 1970-01-01
  • 2011-11-11
  • 1970-01-01
相关资源
最近更新 更多