【发布时间】:2011-05-18 18:33:08
【问题描述】:
我得到了斐波那契堆的代码。此代码使用以下函数来比较两个键:
int
cmp(void *x, void *y)
{
int a, b;
a = (int)x;
b = (int)y;
if (a < b)
return -1;
if (a == b)
return 0;
return 1;
}
这是可行的,因为 KEY 当前是一个 INT 数字。
我想修改此代码以使用我的名为“Node”的类。这个类已经实现了操作符、=。
我在代码中的改编是:
Node a, b // instead int a, b
a = (Node)x;
b = (Node)y;
但我得到了错误:
dijkstra.cpp:168: error: no matching function for call to 'Node::Node(void*&)'
graph.h:39: note: candidates are: Node::Node()
graph.h:39: note: Node::Node(const Node&)
我也试过了:
Node a, b // instead int a, b
a = (Node*)x;
b = (Node*)y;
并得到错误:
dijkstra.cpp:168: error: no match for 'operator=' in 'a = (Node*)x'
graph.h:39: note: candidates are: Node& Node::operator=(const Node&)
我放弃尝试设置值并解决问题如下:
int cmp(void *x, void *y)
{
if ((Node*)x < (Node*)y)
return -1;
if ((Node*)x == (Node*)x)
return 0;
return 1;
}
我想了解我在前面的示例中做错了什么。
提前致谢。
【问题讨论】:
-
cmp函数将指针转换为整数(显然假设它们的大小相同),然后比较指针。不是指向的值。这毫无意义! -
致downvoter:我不明白你为什么这样做,但指针是一个困难的概念,并且 void-pointer 与它值得的类混合。
-
@博人:初始代码我没有INT值??
-
我是反对者,我告诉过你原因。 :-) 使用
void*很糟糕,因为我们看不到它们应该是什么。转换为其他类型并没有帮助。你想做什么? -
@Bo Person:我知道 void* 不好。但是我得到了一段斐波那契堆的代码,代码用来抽象比较的方式就是这样。现在我必须交付这个,但将来我将使用模板进行修复。但是,感谢您提供的信息。
标签: c++ class void-pointers