运算符 + 重载 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++的主要内容,如果未能解决你的问题,请参考以下文章

C++:使用类|| 运算符重载友元

C++ | 运算符重载

C++运算符重载

C++运算符重载时要遵循的规则

c++ 运算符重载问题

C++运算符重载