2015-11-19 4 views
-1

Я пытаюсь закодировать алгоритм Dijktra небольшого масштаба с использованием карты, очереди и списка. Я знаю много проблем с этим кодом, но на данный момент я в основном обеспокоен перегрузкой оператора + для добавления к объектам. Я не знаком с перегрузкой, и любая помощь будет очень признательна. Я пытаюсь добавить два объекта (узлы) на основе стоимости частного члена, которая является целым числом.operator + overload C++

Вот мой код:

#include<iostream> 
#include <map> 
#include <queue> 
#include <list> 

using namespace std; 

class node 
{ 
public: 
    node(); 
    node(char n, int l){ 
     name = n; cost =l;} 

    void display()const{cout<<"name = "<<name<<" cost = "<<cost<<"\n";} 
    char getName()const{return name;} 
    int getCost() {return cost;} 

    node operator+(const node& n){node N1;N1.cost = this->cost + N1.cost; return N1;} //<--- 

private: 
    char name; 
    int cost; 
}; 

bool operator<(node a, node b) 
{ 
    return a.getCost()> b.getCost(); 
} 

int main() 
{ 

    map<node,node>::iterator mapItr; 
    map<node,node> myMap; 
    priority_queue<node> que; 
    list<node> solution; 
    list<node>::iterator listItr; 
    list<node> checkList; 
    node * nptr; 

    myMap.insert(pair<node, node>(node('A',5),node('B',5))); 
    myMap.insert(pair<node, node>(node('A',6),node('C',6))); 
    myMap.insert(pair<node, node>(node('B',3),node('C',3))); 
    myMap.insert(pair<node, node>(node('B',7),node('E',7))); 
    myMap.insert(pair<node, node>(node('C',2),node('E',2))); 
    myMap.insert(pair<node, node>(node('C',4),node('D',4))); 
    myMap.insert(pair<node, node>(node('D',5),node('E',5))); 
    myMap.insert(pair<node, node>(node('D',10),node('G',10))); 
    myMap.insert(pair<node, node>(node('E',9),node('G',9))); 
    myMap.insert(pair<node, node>(node('E',4),node('F',4))); 
    myMap.insert(pair<node, node>(node('F',2),node('G',2))); 


    solution.push_back(node('A',0)); 

    do 
    { 

    listItr=solution.begin(); 

     do 
     { nptr = &*listItr; 

      for(mapItr=myMap.begin();mapItr!=myMap.end();mapItr++) 
      { 
       if(nptr->getName()==mapItr->first.getName()) 
       { 
        que.push(mapItr->second); 
       } 

      } 
      if(nptr->getName()!= que.top().getName()) 

       { 

        que.top()= (*que.top())+(*nptr);//<---- error here 
        solution.push_back(que.top()); 

        que.pop(); 
        listItr++; 
        solution.pop_front(); 

       } 
       else 
       {que.pop(); 
       listItr++;} 

     } 
     while(listItr!= solution.end()); 
    } 
    while (!que.empty()); 


return 0; 
} 

Сообщение об ошибке:

не подходит для 'opeerator *' в «* que.std :: priorty_queue < _Tp, _sequence, _Compare> :: топ>()»

+2

'que.top()' возвращает ссылку, а не указатель. Проблема заключается в попытке разыменовать его. – Kevin

+0

Отредактировано ... достал ненужный код. Я думаю, что мне действительно нужно знать, как добавить стоимость первого элемента в P-очереди к стоимости решения? – bryan

ответ

1

Изменение оператора + код:

node operator+(const node& n) 
{ 
    node N1;N1.cost = this->cost + N1.cost; return N1; 
} 

N1.cost по n.cost

2

Настоящая причина ошибки в том, что вы пытаетесь разыменовать que.top(). que.top() уже возвращает верхнее значение по ссылке const. Решение состоит в том, чтобы заменить (*que.top()) на que.top().

Вам также необходимо создать другой узел, чтобы поместить результат, так как top возвращает ссылку на константу. Поэтому измените его на node n = queue.top() + *nptr; Поскольку вы добавляете результат в список, вы можете просто сделать solution.push_back(que.top() + *nptr);. Измените operator+ как функцию-член константы

+0

Удаление оператора разыменования не исправляет ошибку, я думал que.top() = que.top() + * nptr; , но это дает мне «pass» const value_type as «this» ...... отбрасывает квалификаторы [-fpermissive] error – bryan

+0

Ах, right, 'top' возвращает ссылку const. Вам нужно скопировать ее на другой узел. Я обновляю свой ответ – Kevin

+0

Я очень ценю вашу помощь, я пробовал ваши предложения. Я сделал оператор + функцию const, а также изменил оператор push_back. Теперь я получаю «неопределенная ссылка на« узел :: узел »() ' Сбой сборки: 1 ошибка, 0 предупреждений и т. Д. И т. Д. Любые мысли? – bryan