Проблема с оператором - PullRequest
       2

Проблема с оператором

0 голосов
/ 21 сентября 2010

У меня проблема с оператором <, который я написал: </p>

в Node.h:

.
..
bool operator<(const Node<T>& other) const;
const T& GetData ();
.
..
template <class T>
const T& Node<T>::GetData () {
 return m_data;
}

template <class T>
bool Node<T>:: operator<(const Node<T>& other) const
{
 return (*(this->GetData()) < *(other.GetData()));
}

в Heap.h:

template<class T>
void Heap<T>::Insert(Node<T>* newNode) {
 if (m_heap.size() == 0) {
  m_heap.push_back(newNode);
 }
 else
  DecreaseKey(newNode);  
}

template<class T>
void Heap<T>::DecreaseKey(Node<T>* newNode) {
 m_heap.push_back(newNode);
 int index = m_heap.size();
 while ((index > 1) && (m_heap[(index/2)-1] < (m_heap[index-1]))) { // doen't do the operator < !
  Exchange(index,index/2);
  index = index/2;
 }
}

вVehicle.h:

bool operator< (const Vehicle& otherVehicle) const;

в Vehicle.cpp:

bool Vehicle::operator<(const Vehicle& otherVehicle) const {
 return (GetDistance() > otherVehicle.GetDistance());
}

в main.cpp:.

..
 Node<Vehicle*> a(car1);
 Node<Vehicle*> b(car2);
 Heap<Vehicle*> heap;
 Node<Vehicle*>* p = &a;
 Node<Vehicle*>* q = &b;
 heap.Insert(p);
 heap.Insert(q);
 heap.ExtractMin()->GetData()->Show();
.
..

Почему это не делает конкурент?с оператором <, примечание: он проходит компилятор. </p>

Ответы [ 5 ]

3 голосов
/ 21 сентября 2010

m_heap - это контейнер указателей.В этом случае вам следует разыменовать указатели узлов:

while ((index > 1) && (*m_heap[(index/2)-1] < (*m_heap[index-1])))

Теперь это должно вызвать operator< для узлов, что, в свою очередь, вызывает operator< для транспортных средств.

1 голос
/ 21 сентября 2010

Потому что вы использовали Автомобиль *, а не Автомобиль.

0 голосов
/ 21 сентября 2010

Краткий ответ: не используйте указатели. Возможно, они вам не нужны.

Если возможно, гораздо проще получить правильный код такого типа, если вы используете простые объекты,Если вам нужно использовать концепцию указателя, используйте класс контейнера-указателя, то есть оболочку, которая передается как простой объект с семантикой значений и потенциально настраиваемыми перегрузками, такими как оператор <вы используете, но который скрываетвнутренний указатель реализации. </p>

Таким образом, вам не нужно иметь дело с указателями во всем приложении, а только там, где это семантически актуально.

0 голосов
/ 21 сентября 2010

Из того, что я вижу, m_heap хранит указатель на Node

 while ((index > 1) && (m_heap[(index/2)-1] < (m_heap[index-1]))) { // doen't do the operator < 

Я думаю, это должно сделать

while ((index > 1) && (*(m_heap[(index/2)-1]) < *(m_heap[index-1]))) {
0 голосов
/ 21 сентября 2010

Используйте std :: priority_queue вместо Heap или любую другую кучу, которая позволяет определять пользовательский предикат сравнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...