我目前正在處理電子表格應用程序,但我遇到了模板問題。 模板的每個單元格都可以包含一個可以是任何標準類型的變量。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