C++ c++;工厂模式

C++ c++;工厂模式,c++,factory-pattern,C++,Factory Pattern,很抱歉,我的文章太长,但我想提出我试图解决的问题以及实际问题。也许我会被指向另一个,可能更好的方法 我想创建一个eventtriggerred处理程序系统。我将有几个处理程序模块。基本思想是,在初始化期间,这些模块将在事件列表中注册它们处理的事件(register(module,eventItGetsCalledFor))。在触发事件的情况下,将在事件列表中查找该事件,并创建并运行其中列出的所有模块。为了实现这一点,所有模块都有一个接口 我的两个问题是: 因为我只想在实际事件中实例化模块,所以我

很抱歉,我的文章太长,但我想提出我试图解决的问题以及实际问题。也许我会被指向另一个,可能更好的方法

我想创建一个eventtriggerred处理程序系统。我将有几个处理程序模块。基本思想是,在初始化期间,这些模块将在事件列表中注册它们处理的事件(register(module,eventItGetsCalledFor))。在触发事件的情况下,将在事件列表中查找该事件,并创建并运行其中列出的所有模块。为了实现这一点,所有模块都有一个接口

我的两个问题是:

  • 因为我只想在实际事件中实例化模块,所以我需要一种方法来存储指向构造函数的指针(“虚拟构造函数”),因为据我所知,没有虚拟构造函数,所以我使用一种工厂方法,我想将其添加到接口中。我所知道的经典方法是:

    class myInterface {
    public:
       ...
       static virtual *myInterface builder() = 0; //is static (pure) virtual possible?
    };
    
    class example : public myInterface {
    public:
       ...
       static virtual *myInterface builder() { return new example(); }
    };
    
    然后,我必须在事件列表中存储指向builder()函数的指针,并在事件发生时执行这些函数来创建对象。我想知道是否有办法为每个示例模块编写
    static virtual*myInterface builder(){return new example();}
    。 一种模板方法是如下所示:

    模板 静态虚拟*myInterface builder(){返回新的T();}

    但是,我不太喜欢它,因为我必须编写以下内容来注册事件的模块:

    注册(eventName,builder())

    考虑到我只想在每个模块中创建一个静态寄存器函数,如下所示:

    class example: public myInterface {
        static void registerMe {
            register(event1,builder<example>());
            register(event2,builder<example>());
            ...
            register(eventn,builder<example>());
        }
    };
    
    (builder模板实例化参数各不相同),将其作为模板本身也不是一件好事,因为这会让我反复编写
    register()

    那么有没有更方便的方法呢? (在思考和撰写本文的过程中,我想到了从模板类继承。如果polimorphism与具有不同实例化参数的模板类一起工作。否则,我必须使用接口类,将其包装在模板中并从中继承)

  • 第二个问题是我从接口类派生了不同的类。但是,它们有接口中未定义的成员。我想存储一个指向成员函数的函数指针,我该怎么做?类型必须接受不同的基类,但函数签名的其余部分是相同的(参见下面的示例)

  • //静态(纯)虚拟可能吗

    没有

    营救

    template <class Derived>
    class myInterface {
    public:
        ...
        virtual *myInterface builder() = 0; 
    
        Derived* buildDerived() 
        { 
             return dynamic_cast<Derived*>(builder());
        }
    
    };
    
    模板
    类myInterface{
    公众:
    ...
    虚拟*myInterface builder()=0;
    派生*buildDerived()
    { 
    返回动态_cast(builder());
    }
    };
    
    //静态(纯)虚拟可能吗

    没有

    营救

    template <class Derived>
    class myInterface {
    public:
        ...
        virtual *myInterface builder() = 0; 
    
        Derived* buildDerived() 
        { 
             return dynamic_cast<Derived*>(builder());
        }
    
    };
    
    模板
    类myInterface{
    公众:
    ...
    虚拟*myInterface builder()=0;
    派生*buildDerived()
    { 
    返回动态_cast(builder());
    }
    };
    
  • 静态成员函数不将指针作为第一个参数,而非静态成员函数作为第一个参数,因此静态成员函数可以被视为特定命名空间中的全局函数。这就是为什么你不能这样写:

    静态虚拟*myInterface builder()=0

  • 没有办法定义这样的函数类型。如果在不同的类中有相同的签名,那么考虑一个新的接口继承了您的第一个接口,并将虚拟成员添加到新的接口。获取基本接口指针时,使用dynamic_cast从基本接口指针获取原始类型指针,然后调用新成员函数。或者你可以试试。这对你的处境似乎很有帮助

  • 静态成员函数不将指针作为第一个参数,而非静态成员函数作为第一个参数,因此静态成员函数可以被视为特定命名空间中的全局函数。这就是为什么你不能这样写:

    静态虚拟*myInterface builder()=0

  • 没有办法定义这样的函数类型。如果在不同的类中有相同的签名,那么考虑一个新的接口继承了您的第一个接口,并将虚拟成员添加到新的接口。获取基本接口指针时,使用dynamic_cast从基本接口指针获取原始类型指针,然后调用新成员函数。或者你可以试试。这对你的处境似乎很有帮助


  • 请一次问一个问题。每个SO帖子都是一个问题。很抱歉,第二个问题与第一个问题密切相关。我需要这些指针,以便一个模块可以处理多个与之相关的事件(该接口仅用于一个)。但是,如果有人对eventhandler问题提供了不同的方法,我可能没有理由找到第二个问题的解决方案。因为这个解释很弱,耦合也不是我将来会问的问题,但问题是问的。请一次问一个问题。每个SO帖子都是一个问题。很抱歉,第二个问题与第一个问题密切相关。我需要这些指针,以便一个模块可以处理多个与之相关的事件(该接口仅用于一个)。但是,如果有人对eventhandler问题提供了不同的方法,我可能没有理由找到第二个问题的解决方案。因为这个解释很弱,耦合也不是我将来会问的问题,但是这个问题是问的。非常感谢。现在我知道了要读的名字,知道我猜的是c
    template <class Derived>
    class myInterface {
    public:
        ...
        virtual *myInterface builder() = 0; 
    
        Derived* buildDerived() 
        { 
             return dynamic_cast<Derived*>(builder());
        }
    
    };