BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #29021同步于 2009/9/23
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

【求助】帮忙看看这个程序怎么改?

zzh
2009/9/23镜像同步11 回复
提错是代码user.myId == "Q"这里,不能访问私有成员。我google了,知道对象不能访问私有成员。这里的UserInfo user就是所谓的对象吧?那么如果我不想将类里的private的成员改成public的,而又想在程序里使用user的myId,应该怎么改? #include "BST.h" #include <iostream> #include <fstream> #include <string> using namespace std; class UserInfo { public: friend istream & operator >> (istream & in, UserInfo & user); friend bool operator==(const UserInfo & user1, const UserInfo & user2) { return user1.myId == user2.myId && user1.myPassword == user2.myPassword; } friend bool operator<(const UserInfo & user1, const UserInfo & user2) { return user1.myId < user2.myId; } friend bool operator>(const UserInfo & user1, const UserInfo & user2) { return user1.myId > user2.myId; } private: string myId, myPassword; }; istream & operator >> (istream & in, UserInfo & user) { in >> user.myId >> user.myPassword; return in; } int main() { string filename; ifstream userFile; cout << "Enter the filename: "; cin >> filename; userFile.open(filename.data()); if (!userFile.is_open()) { cerr << "Cannot open UserFile\n"; exit(-1); } BST<UserInfo> userTree; UserInfo user; for (; ;) { userFile >> user; if (userFile.eof()) break; userTree.Insert(user); } cout << "Enter 'Q Q' to stop processing.\n"; for (; ;) { cout << "\nUser id & password: "; cin >> user; if (user.myId == "Q") break; if (userTree.Search(user)) cout << "Valid user\n"; else cout << "Not a valid user\n"; } }
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
Raiden机器人#1 · 2009/9/23
添加一个public成员函数? 比如 string UserInfo::getId(void) const { return myId; }
zzh机器人#2 · 2009/9/23
正解! 谢谢~~ 【 在 Raiden 的大作中提到: 】 : 添加一个public成员函数? : 比如 : string UserInfo::getId(void) const { : ...................
zzh机器人#3 · 2009/9/23
还有一个问题: 上面重载== >> > <这些符号的函数,必须用friend吗?我试过讲myId和myPassword设为public,然后将friend都去掉,就会提错!
Raiden机器人#4 · 2009/9/23
friend的目的是要 授予目标 访问 类私有成员的能力…… 你把friend去掉,成员改成public之后 类外面的>>操作符重载要加作用域修饰吧 UserInfo::operator>>
zzh机器人#5 · 2009/9/24
我试了一下,不行……我用的vs2005 其中一个提错是:error C2804: 二进制“operator >>”的参数太多 【 在 Raiden 的大作中提到: 】 : friend的目的是要 授予目标 访问 类私有成员的能力…… : 你把friend去掉,成员改成public之后 : 类外面的>>操作符重载要加作用域修饰吧 : ...................
Raiden机器人#6 · 2009/9/25
是,去掉friend就把那些操作符变成UserInfo类的成员了,成员操作符第一个参数是 调用该操作符的对象 【 在 zzh 的大作中提到: 】 : 我试了一下,不行……我用的vs2005 : 其中一个提错是:error C2804: 二进制“operator >>”的参数太多
zzh机器人#7 · 2009/9/25
是啊~ 【 在 Raiden 的大作中提到: 】 : 是,去掉friend就把那些操作符变成UserInfo类的成员了,成员操作符第一个参数是 调用该操作符的对象
babylike机器人#8 · 2009/9/25
这个。。。好好看看vc基础教程,要扎实!
zzh机器人#9 · 2009/9/25
嗯,是的~ 我只是喜欢遇到问题再去找解决,这样来扎实基础,因为先去看vc基础教程,我不容易记不住…… 【 在 babylike 的大作中提到: 】 : 这个。。。好好看看vc基础教程,要扎实!