【发布时间】:2013-07-09 14:03:02
【问题描述】:
我有一个模板节点,它返回 T 类型的数据。
template <class T> Node
{
public:
virtual const T& GetData() = 0;
};
我想要派生类 RefNode 和 ValueNode,它们包含指向数据的指针和实际数据。这样我就可以选择是使用数据副本还是使用节点中的实际数据。
template<class T> class RefNode : public Node<T>
{
public:
RefNode(T *_data) : data(_data) { }
const T& GetData() { return *data; }
protected:
DataType *data;
};
template<class T> class ValueNode : public Node<T>
{
public:
ValueNode(const T&_data) : data(_data) { }
const T& GetData() { return data; }
protected:
T data;
};
我知道模板不能有虚方法,但我只是想说明我想要得到的效果。我想要得到的效果是:
//对于类向量
Vector v, *c;
c = new Vector();
Node<Vector>* node = new RefNode<Vector>(c);
Node<Vector>* node2 = new ValueNode<Vector>(a);
node2->GetData(); //calls ValueNode<Vector>'s GetData();
node->GetData(); //calls RefNode<Vector>'s GetData();
C++ 中有什么方法可以实现这种行为吗?
编辑:
我会像这样使用 GetData():
Vector *vecarr[9];
Node<Vector>* nodes[10];
nodes[0] = new RefNode<Vector>(vecarr[0]);
nodes[1] = new ValueNode<Vector>(Vector(2,3)); //non reference vector
nodes[2] = new RefNode<Vector>(vecarr[1]);
nodes[3] = new RefNode<Vector>(vecarr[2]);
.....
void processPositionNodes(Node<Vector> **nodes, int n)
{
for(int i=0; i< n; i++) //iterate over all nodes
{
Vector vec = nodes[i]->GetData();
//do something with vec
}
}
我希望能够更改节点包含的数据类型,因为我想实现几种处理不同类型数据的图形算法,(向量、标量..)
【问题讨论】:
-
模板可以有虚函数。
-
“我知道模板不能有虚方法”——呃什么?您可能正在考虑 模板化 虚函数。
-
问题是:当你收到这种调用GetData()的结果时,你想如何使用它?我可能错了,但我不认为你真的想要一个基于多态的解决方案。您可能想要的是能够将策略“注入”到节点中,该策略应该能够更改与 GetData 成员的返回类型相关的行为。如果您确认这将是您的解决方案,我可以根据此得出答案。否则,请添加一个示例,说明您应该如何使用 GetData 的输出
-
顺便说一句,
RefNode既接受指针又存储指针有点用词不当。 C++ 既有引用又有指针。 -
我编辑了我的帖子,并举例说明了如何使用 GetData()。你说得对,我的意思是模板化的虚函数,它返回变量类型的参数。
标签: c++ templates polymorphism virtual-functions