【发布时间】:2013-02-28 01:14:08
【问题描述】:
我正在尝试创建一个可以存储模板值的 C++ Template 类。但是,我需要在知道模板值的类型之前创建指向此类的指针。为此,我创建了模板类继承自的抽象 Base 类。我创建了指向Base 的指针,当它们被分配时,我使用basePtr = new Template<TYPE>。
这里的问题是给Template 赋值。我能想到的每一种方法(我想使用重载的赋值运算符)都需要一个带有模板数据类型的方法作为形式参数。因为Template对象只能通过Base指针访问,所以我要在Base中做一个虚函数。但是虚方法不能包含模板数据类型,Base的签名中的虚方法必须与Template的方法一致。
这是我想要的一个例子:
class Base {
public:
/* THIS IS ILLEGAL - can't have template virtual method
template <class V>
virtual void operator =(const V& newValue) = 0;
*/
};
template <class ValueType>
class Template : public Base {
private:
ValueType *value;
public:
void operator =(const ValueType& newValue) {
*value = newValue;
}
};
int main() {
Base *theObject; // Datatype for template not known
theObject = new Template<string>; // At this point, it will be known
// NOW, THIS DOESN'T WORK - no virtual assignment overload in Base
*theObject = "Hello, world!";
return 0;
}
如果我以完全错误的方式处理此问题,并且我的方法很愚蠢,我深表歉意——这是我第一次尝试真正的 OOD。有没有办法解决我没有看到的这个问题?我知道我可以在Base 中创建一长串纯虚函数,这些函数使用不同的输入类型重载赋值运算符,如下所示:
virtual void operator =(const string& newValue) = 0;
virtual void operator =(const int& newValue) = 0;
virtual void operator =(const long& newValue) = 0;
...
但是,我希望用户能够将自定义类对象(或者,更有可能是指向这些对象的指针)插入到 Template::value,而我无法使用上述方法来完成。
【问题讨论】:
-
当不兼容类型的值分配给
Template<>类的对象时,您希望发生什么?例如。当我执行Base* pObj = new Template<int>(); *pObj = "Hello"时会发生什么? -
理想情况下,
delete pObj; pObj = new Template<string>; *pObj = "Hello";。当我需要开始为Base指针重置模板数据类型时,我还没有达到这一点,所以我还不完全确定该怎么做。这是将数据存储在表中的类的一部分。Table由Rows 组成,Rows 由Cells 组成,Template是我的单元格对象。 -
好的,但是这个任务
*pObj = "Hello"不能做所有这些事情。是不是抛出异常,让client代码可以做到? -
应该是,老实说我在学习中还没有接触过异常处理。如果我不能直接在单元格上使用赋值运算符,那也没关系。我可以在
Row中创建一个函数,该函数采用单元格的索引和要插入的新值,并将其插入cell[idx]。 -
Row将包含Cell指针 (Base **cell) 的动态数组,并根据需要使用new分配内存。
标签: c++ templates inheritance polymorphism virtual