2010-09-21 4 views
0

У меня есть проблема с оператором <, что я писал:Проблема с оператором <

в 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; 
} 
} 

в автомобиль. h:

bool operator< (const Vehicle& otherVehicle) const; 

в Vehi cle.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(); 
. 
.. 

Почему это не делает компанию? с opeartor <, обратите внимание: он передает компилятор.

+0

Просьба присылать код как можно меньше. Если вы укажете свою проблему _above_ всего кода, это поможет прочитать много. –

ответ

1

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

+0

Но я должен использовать Автомобиль *. –

+0

Как я могу заставить его работать (этот оператор <работать) с Vehicle *? –

+1

Создайте класс оболочки для транспортного средства * и сохраните/сравните их. –

0

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

+0

Я должен создать кучу плиты команды ... –

+0

Если это ваша домашняя работа, добавьте параметр предиката в кучу, например std :: priority_queue (посмотрите документацию).В противном случае нет причин использовать свою собственную кучу. – ybungalobill

0

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

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

Хорошо ... Теперь это сделать C662 ошибки: 'Узел :: GetData': не может преобразовать 'это' указатель формы 'константный Узел ' до 'Node &' –

+0

объявить GetData с сопзЬ => «сопзЬ T & Node : : GetData() const " – aeh

+0

Большое спасибо !!!!!! –

3

m_heap представляет собой контейнер указателей. В этом случае вы должны разыменовываниями узловых указателей:

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

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

0

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

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

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

Смежные вопросы