我目前正在处理电子表格应用程序,但我遇到了模板问题。 模板的每个单元格都可以包含一个可以是任何标准类型的变量。C++模板:从基类中调用派生模板类的成员函数
相关分类是SpreadSheet
,其最重要的成员变量是SheetCells
,它有 类型vector< vector<CellBase*> >
。 CellBase
类是一个抽象类,从中导出CellField<T>
为 ,后者为存储与电子表格的一个单元格 相对应的一段数据的模板类。
我有另一个课程,SheetView
,最终必须显示电子表格。 (为了简单起见, 假设这个类可以完全访问其他类。)这个类并不关心每个单元格的值是什么类型,因为它会将所有内容都转换为字符串。但是,我的问题是编写 成员函数SpreadSheet
,它返回一个包含数据的字符串。我最初的想法是写一个函数 std::string SpreadSheet::getDataFromSheet(int row, int column)
这SheetView
会叫,然后该函数会做 return (std::to_string(SheetCells[row][column] -> getData()))
,其中getData()
是CellField<T>
成员函数,returing 东西T
型。 然而,由于SheetCells
包含指向CellBase
班,我必须做出getData
的CellBase
, 成员,但是这是不可能的,因为我想getData()
返回T
类型的变量,同类型的模板类 CellField
。
所有类定义的相关部分如下。
//SpreadSheet
class Spreadsheet
{
private:
int _height, _width;
public:
Spreadsheet(int newHeight, int newWidth);
~Spreadsheet();
string getData(int row, int column);
vector< vector<CellBase*> > SheetCells;
};
//CellBase
class CellBase
{
public:
CellBase();
virtual ~CellBase();
};
//CellField
template<typename T>
class CellField : public CellBase
{
public:
CellField(T newValue);
virtual ~CellField();
T getData();
T _value;
};
因此,在短期,我希望能够调用getData()
从SpreadSheet
,但后者 的成员变量只包含指向CellBase
类(但这些类实际上CellField<T>
类型)。
我已经看过类似的问题,但他们都没有解决调用模板的基类成员函数class<T>
函数,后者和前者需要返回类型为T
的变量。也许void*
指针将工作?
很多可能的答案......我会用纯虚拟函数“的getData”,它会返回一个boost ::任何,它允许你存储许多不同类型 – Garf365