将函数添加到类中,但避免重新编译

时间:2018-09-21 16:01:08

标签: c++ design-patterns

当前我有

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 :(得分:0)

只需在您的.Length -1类中添加一个新的 general 方法Public Sub ListVideosOnPage(ByVal VidCatName As String, ByVal VidCatURL As String) Dim XMLReq As New MSXML2.XMLHTTP60 Dim HTMLDoc As New MSHTML.HTMLDocument XMLReq.Open "GET", VidCatURL, False XMLReq.send If XMLReq.Status <> 200 Then MsgBox "Problem" & vbNewLine & XMLReq.Status & " - " & XMLReq.statusText Exit Sub End If HTMLDoc.body.innerHTML = XMLReq.responseText Dim aNodeList As Object, link As Long Set aNodeList = HTMLDoc.querySelectorAll(".bpTable a") For link = 0 To aNodeList.Length - 1 Debug.Print aNodeList(link).innerText, aNodeList(link).href Next End Sub (我假设类型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类。