2015-11-19 159 views
-1

我正在嘗試使用映射,priory隊列和列表來編寫小規模的Dijktra算法。我知道這個代碼有很多問題,但目前我主要擔心重載+運算符以添加到對象。我不熟悉超載,任何幫助將不勝感激。我正在嘗試兩個基於私有成員成本(這是一個整數)添加兩個對象(節點)。運算符+超載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; 
} 

的錯誤信息是:

敵不過在「* que.std :: priorty_queue < _TP,_Sequence,_Compare 'opeerator *'> ::頂>()」在操作者+代碼

+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返回一個const引用。因此,將其更改爲node n = queue.top() + *nptr;既然您將結果添加到列表中,您也可以僅執行solution.push_back(que.top() + *nptr);。更改operator+也是一個const成員函數

+0

刪除解除引用操作符不會解決錯誤,我在想 que.top()= que.top()+ * nptr; 但是這給了我一個 「過客「常量VALUE_TYPE‘本次’......丟棄預選賽[-fpermissive]錯誤 – bryan

+0

啊對,'top'返回一個const引用。你需要將它複製到另一個節點。我會更新我的答案。 – Kevin

+0

我真的很感謝你的幫助,我想你的建議,我做了運營商+ const函數,並且也改變了的push_back聲明。現在我越來越 「未定義的引用「節點::節點()' 構建失敗:1個錯誤,0個警告等等等等。有什麼想法? – bryan