类友元问题
时间:2008-05-12 13:49:01
来源:论坛整理 作者: 编辑:chinaitzhe
- 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 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面