C ++泛型类&遗产

时间:2009-11-14 15:28:00

标签: c++ inheritance function generics

我是通用类编程的新手,所以也许我的问题很愚蠢 - 对不起。我想知道以下事情是否可行 - 如果是,那该怎么做

我有一个简单的泛型类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的实际实现是非泛型的!例如,我想实现IntegerProvider,它返回Integer类型

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

也许是StringProvider:

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

现在 - 如何编写整个内容,以便我可以使用

void setSubProvider(ISubProvider* subProvider)

类Provider的功能只有一个与Provider的泛型类型相对应的子提供者?

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

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

那么就可以打电话了

myProvider.setSubProvider(new IntegerProvider());

但是无法调用

myProvider.setSubProvider(new StringProvider());

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

谢谢!

3 个答案:

答案 0 :(得分:3)

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;
};

现在,您已经实现了所需的功能,您必须为与ISubProvider类模板相同的模板类型参数提供Provider即时指针。

但请注意,在这种情况下,通过使用模板化类型的基类,您还没有真正获得任何东西。

答案 1 :(得分:1)

您需要以下列方式从您的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;
};

答案 2 :(得分:0)

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

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;
};