C++泛型类和继承
问题描述:
我是新来的泛型类编程,所以也许我的问题是愚蠢的 - 对不起。我想知道以后的事是否是可能的 - 如果是这样,该怎么办呢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());
我希望你明白我的问题,并可以告诉我如何正确创建该代码:)
谢谢!
答
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
类模板。
但是请注意,在这种情况下,您没有真正获得任何使用基类模板的基类。
答
您需要从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;
};
答
如果您放弃提供者/子提供者的独立思想,只创建一个提供者,那么问题就解决了。
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;
};