我是C ++的新手,我正在尝试开发一个2D模拟,在该模拟上每个表示的元素都是Point的子类。每个子类都有一个列表(listA,listB ...)。
我正在尝试实现一个查找与当前点最近的点的函数,例如,哪个B实例与当前A实例最近。将这个函数放在Point类中对我来说很有意义,因为每个子类都可以使用它,但是由于我的程序使用了专用项列表(std::list<A>
而不是std::list<Point>
),所以出现了一个错误使用以下代码:
class Point
{
Point* findClosest(std::list<Point*>&);
};
class A : public Point
{
void update(std::list<B*>&);
};
class B : public Point
{
};
void A::update(std::list<B*>& blist)
{
B* closest = this->findClosest(blist); //bug
// do something...
}
错误消息:
error: no matching function for call to ‘A::findClosest(std::__cxx11::list<A*>&)’
note: no known conversion for argument 1 from ‘std::__cxx11::list<A*>’ to ‘std::__cxx11::list<Point*, std::allocator<Point*> >&’
如果我使用Point列表而不是专用元素列表,则可以使用,但是每次我需要使用特定于该类的方法(例如{{1 }}用于A类。
有什么办法可以将我的A列表解释为Point列表吗?
感谢帮助!
答案 0 :(得分:1)
您不能这样做,因为list<B*>
不继承自list<Point*>
。
在您的情况下,您可能只需要使用list<Point*>
并将每个Point
实例化为A
或B
即可工作:让{{1}的虚函数}为您做分离。尽管总的来说,出于各种原因,我不建议这样的设计(由于使用过多的分配和释放会导致运行缓慢,这会导致内存碎片问题;对虚拟函数的调用也太多;请不要忘记内存泄漏以防万一您忘记取消分配)
如果您真的想为任意类传递Point
,则必须使用模板,但是我认为这些模板对您来说还为时过早。
list<B*>