具有参数列表<超类>的超类方法与专用列表一起使用

时间:2018-12-17 23:29:30

标签: c++ list c++11 stl

我是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列表吗?

感谢帮助!

1 个答案:

答案 0 :(得分:1)

您不能这样做,因为list<B*>不继承自list<Point*>

在您的情况下,您可能只需要使用list<Point*>并将每个Point实例化为AB即可工作:让{{1}的虚函数}为您做分离。尽管总的来说,出于各种原因,我不建议这样的设计(由于使用过多的分配和释放会导致运行缓慢,这会导致内存碎片问题;对虚拟函数的调用也太多;请不要忘记内存泄漏以防万一您忘记取消分配)

如果您真的想为任意类传递Point,则必须使用模板,但是我认为这些模板对您来说还为时过早。

list<B*>