【问题标题】:C++ generic classes & inheritanceC++ 泛型类和继承
【发布时间】:2009-11-14 15:28:00
【问题描述】:

我是泛型类编程的新手,所以我的问题可能很愚蠢 - 很抱歉。我想知道以下事情是否可行,如果可以,该怎么做

我有一个简单的泛型类 Provider,它提供泛型类型的值:

template <class A_Type> class Provider{
public:
A_Type getValue();
    void setSubProvider(ISubProvider* subProvider)
private:
A_Type m_value;
ISubProvider* m_subProvider;
};

如果 m_subProvider 为 NULL,getValue 函数应返回 m_value。但如果 SubProvider 不为 Null,则该值由 SubProvider 类计算。

所以 subprovider 也必须是泛型类型,但我将其创建为没有实现的抽象类:

template <class A_Type> class ISubProvider{
public:
virtual A_Type getValue() = 0;
};

现在我希望 ISubProvider 的实际实现是非泛型的!例如,我想实现返回 Integer 类型的 IntegerProvider

class IntegerProvider : public ISubProvider{
   int getValue(){return 123;}
};

也许是一个 StringProvider:

class StringProvider : public ISubProvider{
  string getValue(){return "asdf";}
};

现在 - 我如何编码整个事情,以便我可以使用

void setSubProvider(ISubProvider* subProvider)

Provider 类的功能只有与 Provider 的泛型类型对应的 subprovider 吗?

例如,如果我实例化一个 int 类型的提供者:

Provider<int> myProvider = new Provider<int>();

那么应该可以调用

myProvider.setSubProvider(new IntegerProvider());

但一定不能调用

myProvider.setSubProvider(new StringProvider());

我希望你能理解我的问题并告诉我如何正确地创建代码:)

谢谢!

【问题讨论】:

    标签: c++ inheritance function generics


    【解决方案1】:

    C++ 有模板(类模板和函数模板),而不是泛型。

    鉴于此声明:

    template <class A_Type> class ISubProvider;
    

    你不能这样做:

    class IntegerProvider : public ISubProvider{
        int getValue(){return 123;}
    };
    

    因为 ISubProvider 不是一个类,它是一个类模板。

    你可以这样做。

    class IntegerProvider : public ISubProvider<int> {
        int getValue(){return 123;}
    };
    

    无论如何,我认为这就是你想要做的。

    出于同样的原因,这也不起作用。

    template <class A_Type> class Provider {
    public:
        A_Type getValue();
        void setSubProvider(ISubProvider* subProvider)
    private:
        A_Type m_value;
        ISubProvider* m_subProvider;
    };
    

    你必须这样做。

    template <class A_Type> class Provider {
    public:
        A_Type getValue();
        void setSubProvider(ISubProvider<A_Type>* subProvider);
    private:
        A_Type m_value;
        ISubProvider<A_Type>* m_subProvider;
    };
    

    现在您已经实现了您想要的,因为您必须为与 Provider 类模板相同的模板类型参数提供指向 ISubProvider 实例化的指针。

    但是请注意,在这种情况下,使用模板化类型的基类并没有真正获得任何好处。

    【讨论】:

      【解决方案2】:

      您需要通过以下方式从您的 ISubProvider 派生

      class IntegerProvider : public ISubProvider<int>
      class StringProvider : public ISubProvider<string>
      

      等等

      同时改变你的类声明

      template <class A_Type> class Provider{
      public:
      A_Type getValue();
          void setSubProvider(ISubProvider<A_Type>* subProvider)
      private:
      A_Type m_value;
      ISubProvider<A_Type>* m_subProvider;
      };
      

      【讨论】:

        【解决方案3】:

        如果您放弃提供者/子提供者的单独想法而只创建一个提供者,您的问题就会自行解决。

        template <class A_Type> class Provider{
          typedef Provider< A_Type > my_type;
        
        public:
          A_Type getValue();
          void setSubProvider(my_type* subProvider)
        private:
          A_Type m_value;
          my_type* m_subProvider;
        };
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-01
          • 2018-09-27
          • 2015-09-15
          相关资源
          最近更新 更多