注册 登录
编程论坛 C++教室

友元函数用法问题

shanexia 发布于 2014-07-29 20:29, 580 次点击
//简单的调用sales_item类
#include <iostream>
#include<string>
using namespace std;
void print();
void print()
    {
        cout<<isbn<<endl;
        cout<<units_sold<<endl;
        cout<<revenue<<endl;
    }


class sales_item
{
    friend void print();
    public:
    sales_item(const string &book="fuck!"):isbn(book),units_sold(0),revenue(0.0)
    {

    }
    sales_item(istream &is=cin)
    {
        cin >> isbn >> units_sold >> revenue;

    }
    private:
        int units_sold;
        double revenue;
        string isbn;
};

int main()
{
    sales_item s1(cin);
    print();
    return 0;
}
为什么有错误的显示isbn not  declared  units_sold not declared ,revenue not declared .
3 回复
#2
福尔摩斯2014-07-29 21:51
回复 楼主 shanexia
程序代码:

//简单的调用sales_item类
#include <iostream>
#include<string>
using namespace std;

class sales_item;    // 我改了你的友元函数, 添加了一个参数, 但是参数需要用到 sales_item类, 而在使用前必须声明, 本处就是类声明。
void print(sales_item&);    /* 友元函数依旧是函数, 它只不过可以访问类的私有成员而已。 未来你会看到 很多个类(尤其是派生类) 都会用同一个友元函数(多态继承的时候调用 父类的友元函数, 你应该会看到), 那么如果你不添加参数, 编译器怎么知道(这个友元函数调用哪个对象) 或者 (这个函数是不是重载的结果)?! */

class sales_item
{
    friend void print(sales_item&);
    public:
    sales_item(const string &book = "fuck!"):isbn(book),units_sold(0),revenue(0.0)
    {

    }
    sales_item(istream &is = cin)
    {
        cin >> isbn >> units_sold >> revenue;

    }
    private:
        int units_sold;
        double revenue;
        string isbn;
};

void print(sales_item& x)    // 因为这里调用了对象 x, 所以 x的类型 sales_item 必须在其之前定义
{
    cout << x.isbn << endl;
    cout << x.units_sold << endl;
    cout << x.revenue << endl;
}

int main()
{
    sales_item s1(cin);
    print(s1);
    return 0;
}


帮你把代码改了, 你自己看吧。
#3
shanexia2014-07-30 10:22
回复 2 楼 福尔摩斯
你说的一部分正确,但是你的代码编译未通过,我已经知道我的错误了,函数位置放错了。分还是给你吧。
#4
福尔摩斯2014-07-30 21:05
回复 3 楼 shanexia
只有本站会员才能查看附件,请 登录

哪里编译未通过?
1