我正在写一个绘图程序。我遇到了模板和继承的问题,我不知道如何继续。我不知道如何设计我的代码以使我能够做我想做的事情。 (以下说明。)
我有一个模板类,代表“数据”。它看起来像下面这样:
template<typename T>
class GraphData
{
std::vector<T> data_x;
std::vector<T> data_y; // x and y should be held in separate vectors
}
此类是涉及多个类的继承层次结构的一部分。
层次结构看起来像这样...(对不起,这是我的笔记,图表很糟糕。)
说明的
std::string
和获取/设置功能。</ li>
= 0
成员。 void Draw(...)
。这是为了强制在所有可绘制的继承对象中进行重载。Draw()
。)void Draw()
)。此类还可用于调用Get()
/ Set()
方法,以便在图例中使用std::string
。void Draw()
函数重载。此代码确切地指定了应如何绘制数据,具体取决于我们是否有直方图或一般数据点集。目前,我正在使用模板类型。数据点/直方图箱值的数据类型使用模板指定。
例如,可以有HistogramData<double
,HistogramData_Drawable<double>
,HistogramData_Drawable<int>
等...同样,可以有GraphData<double>
,GraphData<float>,
GraphData_Drawable`等等......
所以希望在没有上传我的~10000行代码的情况下,这里发生的事情应该是相当明显的......
是的,所以,另外我有一些class Graph
,其中包含std::vector<GraphData_Generic_Drawable*>
,因此使用基类指针,如上所述。
BUT!必须决定应该使用什么类型的数据作为基础类型。我必须选择std::vector<GraphData_Generic_Drawable<double>*>
或std::vector<GraphData_Generic_Drawable<float>*>
。
由于显而易见的原因,这没用! (我可以选择double
并强制用户手动转换所有值,但这只是一个简单的方法,可以在以后创建更多工作。)
(非常)丑陋的解决方案是为每种可能的类型设置std::vector<>
... int
long
unsigned long long
double
{{1} } float
......等......
显然这将是可怕的,并且基本上重复加载代码..
所以,我打算实现一个unsigned char
方法,将数据添加到该向量,我目前也有以下方法:
AddData
迭代向量并为其中的每组数据调用// In class Graph
void DrawAll()
{
for(std::vector<GraphData_Drawable*>::iterator it = m_data.begin(); it != m_data.end(); ++ it)
(*iterator)->Draw(arguments);
} // Draw function takes arguments including a canvas to draw to, but this isn't directly relevant to the question
。
我目前的想法是这样的;我需要为底层数据类实现某种接口,它可以独立于底层类型检索值。但这只是一个非常模糊的初步想法,我不确定如何实现这个,因此问题......我不确定这甚至是我应该做的......
如果不清楚,请问我一个问题,我会更新详情。