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

Superclass method with argument list<superclass> used with specialized lists

本文关键字:列表 lt superclass gt 类方法 超类 一起 参数 专用      更新时间:2023-10-16

我是C 的新手,我正在尝试开发一个2D模拟,每个代表元素都是点的子类。我有每个子类的列表(Lista,ListB ...)。

我正在尝试实现一个函数,该函数可以找到最接近当前点的点,例如,哪个B实例是最接近当前的实例。将此函数放入点类是有意义的,因为每个子类可以使用它,但是由于我的程序使用了专用项目的列表(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*> >&’

如果我使用的是点列表而不是专业元素列表,则它将起作用,但是每次我需要使用特定于类的方法时,我都会被迫施放这些列表的元素(例如update()a)。

有什么方法可以将我的列表解释为点列表?

感谢您的帮助!

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

在您的情况下,您可能必须仅使用list<Point*>并将每个Point实例化为AB:让Point的虚拟功能为您进行分离。但是,总的来说,由于各种原因,我不建议这样的设计(运行时会缓慢使用过多的分配和交易,这会导致内存碎片问题;也会有太多的呼吁虚拟功能;不要忘记内存泄漏,以防您忘记要签约)

如果您真的想通过list<B*>进行任意课程,那么您必须使用模板,但我相信这些对您来说还为时过早。

class Point 
{
    template<class T>
    Point* findClosest(std::list<T*>&)
    {
      // write implementation here in .h; not in .cpp
    }
};