C++ 如何修复“*私有变量*是“*类名*的私有成员”错误

C++ 如何修复“*私有变量*是“*类名*的私有成员”错误,c++,friend-function,C++,Friend Function,我正在编写使用friend函数的代码,但我不确定为什么会出现函数sum中的私有成员错误,因为我在头文件中将函数声明为friend 头文件: #include <iostream> class rational { public: // ToDo: Constructor that takes int numerator and int denominator rational (int numerator = 0, int denominator = 1);

我正在编写使用friend函数的代码,但我不确定为什么会出现函数sum中的私有成员错误,因为我在头文件中将函数声明为friend

头文件:

#include <iostream>

class rational
{
public:

    // ToDo: Constructor that takes int numerator and int denominator
    rational (int numerator = 0, int denominator = 1);
   // ToDo: Member function to write a rational as n/d
    void set (int set_numerator, int set_denominator);
    // ToDo: declare an accessor function to get the numerator
    int  getNumerator () const;
    // ToDo: declare an accessor function to get the denominator
    int  getDenominator () const;
    // ToDo: declare a function called Sum that takes two rational objects
    // sets the current object to the sum of the given objects using the
    // formula: a/b + c/d = ( a*d + b*c)/(b*d)
    friend rational sum (const rational& r1, const rational& r2);

    void output (std::ostream& out);
    // member function to display the object

    void input (std::istream& in);


private:

    int numerator;
    int denominator;

};
源文件:

#include <iostream>
using namespace std;


//  takes two rational objects and uses the formula a/b + c/d = ( a*d + b*c)/(b*d) to change the numerator and denominator


rational sum (rational r1, rational r2)
{
    // formula: a/b + c/d = ( a*d + b*c)/(b*d)

    cout << endl;

    numerator = ((r2.denominator * r1.numerator) + (r1.denominator * r2.numerator));

    denominator = (r1.denominator * r2.denominator);
}
有理和有理r1,有理r2是一个全新的函数,与接受两个有理数并返回一个有理数的rational类无关

实现所需类方法的正确方法是rational::sum const rational&r1,const rational&r2


总体评论:对Rational类使用大写的第一个字母

您想要这样的东西:

rational sum (const rational& r1, const rational& r2)
{
    // formula: a/b + c/d = ( a*d + b*c)/(b*d)

    int numerator = ((r2.denominator * r1.numerator) + (r1.denominator * r2.numerator));

    int denominator = (r1.denominator * r2.denominator);
    return rational(numerator, denominator);
}

rational sum const rational&r1,const rational&r2;和rational sum rational r1,rational r2是两个不同的函数,它们的参数声明不匹配如果你有getter函数,比如getNumerator和getDenominator,为什么你需要让sum函数成为朋友呢?朋友函数通常会使事情复杂化,往往会使代码混乱更难维护。当然也有例外,输入和输出操作符重载通常是其中之一,但如果可以的话,通常尽量避免它们。我认为您的声明需要使用rational rational::sum rational r1,rational R2声明的目的是使用友元声明,因此全局函数应该是rational的sum const rational&r1,const rational&r2 insteadGet在我将未声明标识符的分子更改为建议的实现时使用它时出错。rational sum const rational&r1,const rational&r2@user10793479当然,请注意我答案中的额外整数