【问题标题】:C++ - friend operator cannot access private data membersC ++ - 朋友运算符无法访问私有数据成员
【发布时间】:2021-05-29 19:52:13
【问题描述】:

我正在尝试为一个类重载一个运算符:

#include <iostream>
using namespace std;

class Complex{
    float re, im;
public:
    Complex(float x = 0, float y = 0) : re(x), im(y) { }
    friend Complex operator*(float k, Complex c); 
};

Complex operator*(float k, Complex c) {
    Complex prod;
    prod.re = k * re; // Compile Error: 're' was not declared in this scope
    prod.im = k * im; // Compile Error: 'im' was not declared in this scope
    return prod;
}

int main() {
    Complex c1(1,2);
    c1 = 5 * c1;
    return 0;
}

但好友功能无权访问私人数据。当我添加对象名称时,错误已解决:

Complex operator*(float k, Complex c) {
    Complex prod;
    prod.re = k * c.re; // Now it is ok
    prod.im = k * c.im; // Now it is ok
    return prod;
}

但是根据我正在阅读的注释,第一个代码应该可以正常工作。如何在不添加对象名称(re 而不是c.re)的情况下修复错误?

【问题讨论】:

  • friend 函数是免费函数。不是类成员函数,所以没有隐含的this-&gt;
  • c.re 是对由于friend 而允许的类实例的私有成员访问。您的函数不是成员函数。
  • 显然你的笔记不正确
  • 是的,要么你的笔记有误,要么你遗漏了什么。
  • 您使用额外的c. 所做的更改是正确的解决方案。

标签: c++ private-members friend-function member-access


【解决方案1】:

在第一个 operator* 情况下,reim 对于编译器来说是完全未知的,因为在这种情况下,函数 operator* 位于全局空间(作用域)中。

operator* 的第二个示例中,您通过使用类Complex c 的对象来赋予reim 含义 - 在这种情况下,编译器知道class Complex 的定义(在上面定义)并且它的成员 reim 也是已知的 - 这就是您在第二个示例中没有收到错误消息的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-16
    • 1970-01-01
    • 1970-01-01
    • 2019-08-08
    • 2015-08-03
    • 2023-04-06
    • 1970-01-01
    相关资源
    最近更新 更多