类友元问题

时间:2008-05-12 13:49:01   来源:论坛整理  作者:  编辑:chinaitzhe
请大家帮我看一下 我写的这个类问题出在那,我声明清楚了重载的那2个函数为友元素
C/C code





Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/





#pragma once//这是头文件

#include<string>

#include<iostream>

class Agv_score

{

public:

    friend std::istream& operator>>

        (std::istream& in,const Agv_score&);

   friend std::ostream& operator<<

        (std::ostream& out,Agv_score&);

    double agv_score()const;

    Agv_score& operator =(const Agv_score&);

    bool sam_name(const Agv_score &rhs)const

    {   return name==rhs.name;

    }

    Agv_score():units_sold(0),total(0.0) {}



private:

    unsigned units_sold;

    double total;

    std::string name;

};

#include<iostream>//这是实现源文件 

#include"Agv_score.h"

using namespace std;

istream& 

operator>>(istream& in, Agv_score& org)

{

    double sum;

    in>>org.name>>org.units_sold>>sum;

    org.total=org.units_sold*sum;

    if(in)

    org.total=org.units_sold*sum;

    else

    org=Agv_score();

    return in;

}

ostream& 

operator<<(ostream& out,const Agv_score& tl)

{

    out<<tl.name<<"\t"<<tl.units_sold<<"\t"

        <<tl.total<<"\t"<<tl.agv_score();

    return out;

}

double Agv_score::agv_score()const

{

    if(units_sold)

    return total/units_sold;

    else

        return 0;

}

Agv_score& Agv_score::operator =(const Agv_score& rhs)

{

    units_sold =rhs.units_sold;

    total =rhs.total;

    return *this;

}

Agv_score operator (const Agv_score& les,const Agv_score& rh)

{

    Agv_score ret(les);

    ret =rh;

    return ret;

}

int main()

{



    return 0;

}

///////////////////////////////////////////////////////////////////////////////

------ 已启动生成: 项目: Agv_score, 配置: Debug Win32 ------



正在编译...

Agv_score.cpp

e:\c  练习题\卖书记录\agv_score.cpp(7) : error C2248: “Agv_score::name” : 无法访问 private 成员(在“Agv_score”类中声明)

        e:\c  练习题\卖书记录\agv_score.h(21) : 参见“Agv_score::name”的声明

        e:\c  练习题\卖书记录\agv_score.h(5) : 参见“Agv_score”的声明

e:\c  练习题\卖书记录\agv_score.cpp(7) : error C2248: “Agv_score::units_sold” : 无法访问 private 成员(在“Agv_score”类中声明)

        e:\c  练习题\卖书记录\agv_score.h(19) : 参见“Agv_score::units_sold”的声明

        e:\c  练习题\卖书记录\agv_score.h(5) : 参见“Agv_score”的声明

e:\c  练习题\卖书记录\agv_score.cpp(9) : error C2248: “Agv_score::total” : 无法访问 private 成员(在“Agv_score”类中声明)

        e:\c  练习题\卖书记录\agv_score.h(20) : 参见“Agv_score::total”的声明

        e:\c  练习题\卖书记录\agv_score.h(5) : 参见“Agv_score”的声明

e:\c  练习题\卖书记录\agv_score.cpp(9) : error C2248: “Agv_score::units_sold” : 无法访问 private 成员(在“Agv_score”类中声明)

        e:\c  练习题\卖书记录\agv_score.h(19) : 参见“Agv_score::units_sold”的声明

        e:\c  练习题\卖书记录\agv_score.h(5) : 参见“Agv_score”的声明

e:\c  练习题\卖书记录\agv_score.cpp(17) : error C2248: “Agv_score::name” : 无法访问 private 成员(在“Agv_score”类中声明)

        e:\c  练习题\卖书记录\agv_score.h(21) : 参见“Agv_score::name”的声明

        e:\c  练习题\卖书记录\agv_score.h(5) : 参见“Agv_score”的声明

e:\c  练习题\卖书记录\agv_score.cpp(17) : error C2248: “Agv_score::units_sold” : 无法访问 private 成员(在“Agv_score”类中声明)

        e:\c  练习题\卖书记录\agv_score.h(19) : 参见“Agv_score::units_sold”的声明

        e:\c  练习题\卖书记录\agv_score.h(5) : 参见“Agv_score”的声明

e:\c  练习题\卖书记录\agv_score.cpp(18) : error C2248: “Agv_score::total” : 无法访问 private 成员(在“Agv_score”类中声明)

        e:\c  练习题\卖书记录\agv_score.h(20) : 参见“Agv_score::total”的声明

        e:\c  练习题\卖书记录\agv_score.h(5) : 参见“Agv_score”的声明



生成日志保存在“file://e:\C  练习题\卖书记录\Debug\BuildLog.htm”中

Agv_score - 7 错误,0 警告





---------------------- 完成 ---------------------



    生成: 0 已成功, 1 已失败, 0 已跳过








网友回复:
你在这个地方对两个友元函数的定义有些问题,
我很少写这样的函数,但是感觉到这里时你单方面说"你是我的朋友,我帮你实现两个函数",但是人家iostream是什么也不知道啊, 你没有在iostream里面定义过这两个函数,实现的时候,函数前面也没有加上iostream::的字样

我有个办法可以绕过这个问题,就是你写几个get函数来在这两个函数里面获取相关数据

因为不熟悉相关语法,可能有误,见谅

网友回复:在使用c 的过程中,要注重封装,继续,多态的配合使用,多理解为什么要这样做,尽量避免一些比较难以理解的方案,

没有关系,看得出来你对各种语法理解很深,只要积累些经验,应该可以很轻松解决此类问题
有空多看看其他人的代码
网友回复:谢谢上面朋友的解释
希望在来个星星帮
我解下迷惑
网友回复:
C/C code





Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/





// .h

#pragma once//这是头文件

#include<string>

#include<iostream>

class Agv_score

{

public:

    friend std::istream& operator>>

        (std::istream& in, Agv_score&);

    friend std::ostream& operator<<

        (std::ostream& out, Agv_score&);

    double agv_score()const;

    Agv_score& operator =(const Agv_score&);

    bool sam_name(const Agv_score &rhs)const

    {   return name==rhs.name;

    }

    Agv_score():units_sold(0),total(0.0) {}



private:

    unsigned units_sold;

    double total;

    std::string name;

};








C/C code





Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/





// .cpp

#include"Agv_score.h"

using namespace std;

istream& 

operator>>(istream& in,  Agv_score& org)

{

    double sum;

    in>>org.name>>org.units_sold>>sum;

    org.total=org.units_sold*sum;

    if(in)

        org.total=org.units_sold*sum;

    else

        org=Agv_score();

    return in;

}

ostream& 

operator<<(ostream& out, Agv_score& tl)

{

    out<<tl.name<<"\t"<<tl.units_sold<<"\t"

        <<tl.total<<"\t"<<tl.agv_score();

    return out;

}

double Agv_score::agv_score()const

{

    if(units_sold)

        return total/units_sold;

    else

        return 0;

}

Agv_score& Agv_score::operator =(const Agv_score& rhs)

{

    units_sold =rhs.units_sold;

    total =rhs.total;

    return *this;

}

Agv_score operator (const Agv_score& les,const Agv_score& rh)

{

    Agv_score ret(les);

    ret =rh;

    return ret;

}

int main()

{



    return 0;

}






网友回复:同不解,只是感觉#include <iostream>重复了
网友回复:星羽大哥我看了你改了的代码还是通不过编译
我用的是DEV C 出现错误16个
网友回复:哦对不起是我看错了

网友回复:请问以下我的错误是在那了

网友回复:函数原型的声明和实现不一致。
这是声明:
friend std::istream& operator>>
(std::istream& in,const Agv_score&);
friend std::ostream& operator < <
(std::ostream& out,Agv_score&);
这是实现:
istream&
operator>>(istream& in, Agv_score& org)
ostream&
operator < <(ostream& out,const Agv_score& tl)

网友回复:你自己对比下不就知道了吗?如楼上所说,你的声明和定义不匹配
网友回复:谢谢
下次一定仔细想了在发
结贴给分
关键字:类友,问题,

文章评论

共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面