Метод суперкласса со списком аргументов <superclass>, используемый со специализированными списками - PullRequest
0 голосов
/ 18 декабря 2018

Я новичок в C ++ и пытаюсь разработать 2D-симуляцию, в которой каждый представленный элемент является подклассом Point.У меня есть несколько списков для каждого подкласса (listA, listB ...).

Я пытаюсь реализовать функцию, которая находит ближайшую точку к текущей точке, например, какой экземпляр B является ближайшим ктекущий экземпляр.Для меня имеет смысл поместить эту функцию в класс 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 вместо списков специализированных элементов, это будет работать, но я был бы вынужден приводить элементы этих списков каждый раз, когда мне нужно использовать метод, специфичный для класса (например, update() для класса A).

Есть ли способ, которыймой список A можно интерпретировать как список Point?

Спасибо за помощь!

1 Ответ

0 голосов
/ 18 декабря 2018

Вы не можете сделать это таким образом, потому что list<B*> не наследуется от list<Point*>.

В вашем случае вам, вероятно, придется работать, используя только list<Point*> и создавая каждый Point какA или B: пусть виртуальные функции Point сделают за вас разделение.Хотя, в общем, я не рекомендую такой дизайн по разным причинам (он будет иметь медленное время выполнения из-за слишком большого количества выделений и освобождений, что вызовет проблемы фрагментации памяти; также будет слишком много вызовов для виртуальных функций; не забывайтеутечки памяти в случае, если вы забыли освободить)

Если вы действительно хотите передать list<B*> для произвольных классов, вам придется работать с шаблонами, но я считаю, что это слишком рано для вас.

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