2015-11-19 115 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