代码之家  ›  专栏  ›  技术社区  ›  Danny

将两个类合并为公共基类(模板?混入?)

  •  1
  • Danny  · 技术社区  · 6 年前

    我们使用第三方库来控制专用PCI卡。供应商发布了一个新的卡,它使用一个新的类来控制它,但是新的类与旧的类有相同的方法。

    我想这是一个 混合 但我不确定。下面的代码显示了这种情况。

    在template类中重新定义每个方法是可能的,但是在template类中有很多方法 APIClass1 APIClass2 . (方法具有相同的名称和签名)。我的意思是: void one() { TBase::one(); }

    C++中有没有一种方法可以复制很多代码呢?

    #include <stdio.h>
    
    class APIClass1
    {
    public:
        void one() { printf("APIClass1 ONE\n"); }
        void two() { printf("APIClass1 TWO\n"); }
    };
    
    class APIClass2
    {
    public:
        void one() { printf("APIClass2 ONE\n"); }
        void two() { printf("APIClass2 TWO\n"); }
    };
    
    class MasterClassBC
    { };
    
    template <class T>
    class MasterClass : public T, public MasterClassBC
    {
    public:
        typedef T TBase;
    };
    
    int main(int argc, char *argv[])
    {
        // Use pointer to base class object
        MasterClassBC *pBc;
        if (isNewCard())
            pBc = new MasterClass<APIClass2>;
        else
            pBc = new MasterClass<APIClass1>;
    
        pBc->two(); // error:‘class MasterClassBC’ has no member named ‘two’
    }
    

    编辑I

    顶端类1 顶端类2 .

    在下面的例子中,我们有 void three() void three(int n) .

    我试着创造 newThree() 它在运行时调用相应的函数,但由于TBase缺少一个或另一个函数,因此它不会编译 three 方法取决于它的专业化程度。

    class APIClass1
    {
    public:
        void one() { printf("APIClass1 ONE\n"); }
        void two() { printf("APIClass1 TWO\n"); }
        void three() { printf("APIClass1 THREE\n"); }
    };
    
    class APIClass2
    {
    public:
        void one() { printf("APIClass2 ONE\n"); }
        void two() { printf("APIClass2 TWO\n"); }
        void three(int n) { printf("APIClass2 THREE: %d\n", n); }
    };
    
    class MasterClassBC
    {
        virtual void one() = 0;
        virtual void two() = 0;
        virtual void newThree() = 0
    };
    
    template <class T>
    class MasterClass : public T, public MasterClassBC
    {
    public:
        typedef T TBase;
        MasterClass(bool useApi1 = true) : mUseApi1(useApi1) {}
    
        void setTheNumber(int n) { mTheNumber = n; }
    
        void one() { TBase::one(); }
        void two() { TBase::two(); }
    
        void newThree()
        {
            if (mUseApi1)
                TBase::three();
            else
                TBase::three(mTheNumber);
        }
    
    private:
        bool mUseApi1;
        int  mTheNumber;
    };
    
    0 回复  |  直到 6 年前