【发布时间】:2016-03-17 22:20:52
【问题描述】:
我正在尝试基于已经存在的数据结构(我无法修改并且它本身不是图形)构建一个图形数据结构。 我想我对如何构建与图形本身有关的大部分结构有所了解,但现在我必须参考原始数据结构来获取一个小的“比较”功能,并且很难对其建模妥妥的……
我的顶点代表原始数据结构的两个不同的类 A 和 B,它们具有不同的成员变量并且没有共同的祖先。对于算法,我必须检查两个顶点是否兼容。 规则是:A-Vertex 和 B-Vertex 总是不兼容的,但是如果两个顶点代表相同的类型,我必须检查各自类型的一些细节。 所以基本思路大致是这样的:
bool isCompatible(const Vertex& other){
// if this->data is of other type than other->data
// return false;
// else return compareFunction(this->data, other->data)
// where maybe one could overload that compare-function
// or make a template out of it
}
但我真的不知道如何存储对数据的引用而不使其变得非常丑陋。
想法 1) 对数据使用 void 指针,有一些变量来存储类型,然后将 void 指针转换为相应的类型
-> 可能会起作用,但看起来非常危险(类型安全?)而且非常丑陋(如果您想在其他数据上使用 Graph 结构,基本上没有可重用性)。看起来有点像蛮力方法。
想法 2) 创建一个抽象数据类,提供一些“isCompatible(data)”函数,并分别为 A 和 B 提供封装类,它们从抽象类继承并覆盖该函数。在被覆盖的函数内部,可以使用 dynamic_cast 然后比较对象。
-> 看起来仍然不是很好的设计,但应该也可以吗?
想法 3) 使模板工作?这是我第一次使用 C++,所以我在正确解决这个问题时遇到了一些问题。 我认为以下内容应该可以进行比较:
template<typename T1, typename T2>
bool compare(T1 object1, T2 object2){
return false;
}
然后有 (A,A) 和 (B,B) 的实例覆盖它。对我来说,这似乎是比较本身的方式。但是我真的不知道如何在不丢失类型的情况下管理从顶点到对象的引用。有什么建议吗?
当然,我也愿意接受任何其他建议。
编辑:如果相关的话,我正在使用 C++11。
【问题讨论】:
标签: c++ data-structures