2009-11-14 153 views
1

我是新来的泛型类编程,所以也许我的问题是愚蠢的 - 对不起。我想知道以后的事是否是可能的 - 如果是这样,该怎么办呢C++泛型类和继承

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

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

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

所以subprovider必须是通用型的,但我却创造它作为一个抽象类没有实现:

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

现在我想ISubProvider的实际实现作为非通用!比如我要实现IntegerProvider返回整数类型

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

,也许StringProvider:

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

- 我怎么可以编写整个事情,这样我可以使用

void setSubProvider(ISubProvider* subProvider) 

类的提供者的功能仅与提供者的通用类型对应的子提供者有关吗?

例如,如果我实例化一个int类型的供应商:

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

那么它必须能够调用

myProvider.setSubProvider(new IntegerProvider()); 

,但它必须是不可能打电话

myProvider.setSubProvider(new StringProvider()); 

我希望你明白我的问题,并可以告诉我如何正确创建该代码:)

谢谢!

回答

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 instantation为同一模板类型参数作为Provider类模板。

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

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