gpt4 book ai didi

C++二进制 '+';找不到类型为 'Pair' 的全局运算符

转载 作者:行者123 更新时间:2023-12-02 10:04:36 25 4
gpt4 key购买 nike

在 Main.cpp 为什么 p3 = p3 + 2;工作但 p3 = 2 + p3;给我标题中所述的错误?

对.h

#pragma once
class Pair
{
private:
int num1, num2;
public:
Pair();
Pair(int num1, int num2);
int get1();
int get2();
Pair operator+(const Pair& other);
Pair operator+(int otherNum);
};

对.cpp
#include "Pair.h"
Pair::Pair() : num1(0), num2(0)
{
}
Pair::Pair(int num1, int num2) : num1(num1), num2(num2)
{
}
int Pair::get1()
{
return num1;
}
int Pair::get2()
{
return num2;
}
// Return a new pair that adds the corresponding numbers
Pair Pair::operator+(const Pair& other)
{
Pair newPair(this->num1, this->num2);
newPair.num1 += other.num1;
newPair.num2 += other.num2;
return newPair;
}
// Return a new pair that adds otherNum to num1 and num2
Pair Pair::operator+(int otherNum)
{
Pair newPair(this->num1, this->num2);
newPair.num1 += otherNum;
newPair.num2 += otherNum;
return newPair;
}

主文件
#include <iostream>
#include <string>
#include "Pair.h"
using namespace std;
int main()
{
Pair p1(5, 10);
Pair p2(1, 2);
// Outputs 5 and 10
cout << p1.get1() << " " << p1.get2() << endl;
// Outputs 1 and 2
cout << p2.get1() << " " << p2.get2() << endl;
Pair p3 = p2 + p1;
// Outputs 6 and 12
cout << p3.get1() << " " << p3.get2() << endl;

p3 = p3 + 2;

// doesn't work
//p3 = 2 + p3;

// Outputs 8 and 14
cout << p3.get1() << " " << p3.get2() << endl;
}

最佳答案

您需要创建一个 operator+对于您要进行的操作。您已经有一个 operator+这需要 Pairint (以该顺序)。这个可以是Pair的成员函数, 因为一个类的每个非静态成员函数都有一个隐含的 this作为第一个参数。

你的函数原型(prototype)应该看起来像

Pair operator+(int num, const Pair& otherPair)

因为你想要一个不需要 Pair 的函数作为第一个参数,你不能使它成为 Pair 的成员函数.那隐含的 this在成员函数中会阻止这种情况。

https://en.cppreference.com/w/cpp/language/operators

建议:有 +(int, Pair)函数调用 +(Pair, int)功能

你需要:
1.在你的 Pair.h中声明函数文件
2.在你的 Pair.cpp中定义函数文件

由于这不是成员函数,您可以在 Pair 之外声明它。类,或将其设为 friend Pair 中的函数类(编译器将其视为在类之外,但可以直接访问类的私有(private)成员)。
// Pair.h
#pragma once
class Pair
{
// keep this the same as in your question, OP
};

Pair operator+(int num, const Pair& other); // <--- add this
// Pair.cpp

// keep this the same as in your question, OP

// add this
Pair operator+(int num, const Pair& other) // <-- NOT Pair::operator+
{
return other + num; // <-- simply calls Pair::operator+(int)
}

这种方法也使维护更容易。您不必担心更新两个相同的功能。您只需更新类 namespace 中的那个。

不建议(但可能):拥有 +(int, Pair)函数提供自己的实现,使用 friend说明符

由于上述操作 int + Pair就像调用可交换 Pair + int 一样简单, 没必要做 friend (尽管我在评论中反复强调)。但是,如果您的 int + Pair 有任何原因操作与 Pair + int 不可交换,您需要提供自己的实现,这可能需要访问 private成员变量。在这种情况下,您需要将其设为 friend功能。

这是为完成而提供的;我建议使用上述方法。

https://en.cppreference.com/w/cpp/language/friend
// Pair.h
#pragma once
class Pair
{
// keep this the same as in your question, OP

friend Pair operator+(int num, const Pair& other); // <--- add this
};
// Pair.cpp

// keep this the same as in your question, OP

// add this
Pair operator+(int num, const Pair& other) // <-- still NOT Pair::operator+
{
// example implementation to differ from +(Pair, int)
Pair newPair(other.num1, other.num2);
newPair.num2 += num; // only increment num2
return newPair;
}

关于C++二进制 '+';找不到类型为 'Pair' 的全局运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60942449/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com