运算符 + 重载 C++
Posted
技术标签:
【中文标题】运算符 + 重载 C++【英文标题】:operator + overload c++ 【发布时间】:2015-11-19 21:45:39 【问题描述】:我正在尝试使用地图、修道院队列和列表编写小型 Dijktra 算法。我知道这段代码有很多问题,但目前我主要关心的是重载 + 运算符以添加到对象。我不熟悉重载,任何帮助将不胜感激。我正在尝试根据私有成员成本(整数)添加两个对象(节点)。
这是我的代码:
#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()constcout<<"name = "<<name<<" cost = "<<cost<<"\n";
char getName()constreturn 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>::top >()'中没有匹配到 'operator*'
【问题讨论】:
que.top()
返回一个引用,而不是一个指针。问题在于尝试取消引用它。
Edited ... 去掉了一些不必要的代码。我想我真正知道的是如何将 P 队列中第一个元素的成本添加到解决方案的成本中?
【参考方案1】:
你得到错误的真正原因是你试图取消引用que.top()
。 que.top()
已经通过 const 引用返回了最高值。解决方法是将(*que.top())
替换为que.top()
。
您还需要创建另一个节点来放置结果,因为top
返回一个常量引用。所以将其更改为node n = queue.top() + *nptr;
因为您将结果添加到列表中,您也可以执行solution.push_back(que.top() + *nptr);
。把operator+
也改成const成员函数
【讨论】:
删除取消引用运算符并不能修复错误,我在想 que.top()= que.top()+ *nptr;但这给了我一个“将 'const value_type 作为 'this' 传递......丢弃限定符 [-fpermissive] 错误 对,top
返回一个常量引用。您需要将其复制到另一个节点。我会更新我的答案。
非常感谢您的帮助,我尝试了您的建议。我将 operator+ 设为 const 函数,并更改了 push_back 语句。现在我收到“对'node::node()'的未定义引用构建失败:1 个错误、0 个警告等等等。有什么想法吗?
这些只是已经存在的多个错误。在这种情况下,您从未实现 node
的默认构造函数。你刚刚宣布了。我建议您花一些时间尝试了解错误消息的含义。他们中的大多数人都非常清楚缺少什么。【参考方案2】:
运算符+代码的变化:
node operator+(const node& n)
node N1;N1.cost = this->cost + N1.cost; return N1;
N1.cost by n.cost
【讨论】:
以上是关于运算符 + 重载 C++的主要内容,如果未能解决你的问题,请参考以下文章