C ++模板类,继承和编写图形绘制的通用代码

时间:2016-03-13 17:34:13

标签: c++ inheritance

背景信息

我正在写一个绘图程序。我遇到了模板和继承的问题,我不知道如何继续。我不知道如何设计我的代码以使我能够做我想做的事情。 (以下说明。)

目标

我有一个模板类,代表“数据”。它看起来像下面这样:

template<typename T>
class GraphData
{
    std::vector<T> data_x;
    std::vector<T> data_y; // x and y should be held in separate vectors
}

此类是涉及多个类的继承层次结构的一部分。

层次结构看起来像这样...(对不起,这是我的笔记,图表很糟糕。)Inheritance Diagram

说明

  • 有一个基类。现在没有真正的理由,但我希望以后再使用它。
  • Base_Legend为图例绘制添加功能。添加的新成员包括std::string和获取/设置功能。<​​/ li>
  • Base_Drawable添加了一个纯粹的抽象= 0成员。 void Draw(...)。这是为了强制在所有可绘制的继承对象中进行重载。
  • GraphData_Generic添加了向一组向量添加/删除数据点的功能。这些是纯抽象方法,必须由任何继承的数据类覆盖。
  • GraphData和HistogramData是2种数据类型,它们具有GraphData_Generic中的函数实现。 (没有实施Draw()。)
  • GraphData_GenericDrawable不执行任何操作。它将用作基类指针,以便这些对象的向量可以用作数据(添加/删除数据点)并可以绘制(使用void Draw())。此类还可用于调用Get() / Set()方法,以便在图例中使用std::string
  • 最后,底部是GraphData_Drawable和HistogramData_Drawable,它使void Draw()函数重载。此代码确切地指定了应如何绘制数据,具体取决于我们是否有直方图或一般数据点集。

问题

目前,我正在使用模板类型。数据点/直方图箱值的数据类型使用模板指定。

例如,可以有HistogramData<doubleHistogramData_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

如何解决?

我目前的想法是这样的;我需要为底层数据类实现某种接口,它可以独立于底层类型检索值。但这只是一个非常模糊的初步想法,我不确定如何实现这个,因此问题......我不确定这甚至是我应该做的......

如果不清楚,请问我一个问题,我会更新详情。

0 个答案:

没有答案