返回信息流提错是代码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";
}
}
这是一条镜像帖。来源:北邮人论坛 / cpp / #29021同步于 2009/9/23
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
【求助】帮忙看看这个程序怎么改?
zzh
2009/9/23镜像同步11 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
正解!
谢谢~~
【 在 Raiden 的大作中提到: 】
: 添加一个public成员函数?
: 比如
: string UserInfo::getId(void) const {
: ...................
还有一个问题:
上面重载== >> > <这些符号的函数,必须用friend吗?我试过讲myId和myPassword设为public,然后将friend都去掉,就会提错!
friend的目的是要 授予目标 访问 类私有成员的能力……
你把friend去掉,成员改成public之后
类外面的>>操作符重载要加作用域修饰吧
UserInfo::operator>>
我试了一下,不行……我用的vs2005
其中一个提错是:error C2804: 二进制“operator >>”的参数太多
【 在 Raiden 的大作中提到: 】
: friend的目的是要 授予目标 访问 类私有成员的能力……
: 你把friend去掉,成员改成public之后
: 类外面的>>操作符重载要加作用域修饰吧
: ...................
是,去掉friend就把那些操作符变成UserInfo类的成员了,成员操作符第一个参数是 调用该操作符的对象
【 在 zzh 的大作中提到: 】
: 我试了一下,不行……我用的vs2005
: 其中一个提错是:error C2804: 二进制“operator >>”的参数太多
是啊~
【 在 Raiden 的大作中提到: 】
: 是,去掉friend就把那些操作符变成UserInfo类的成员了,成员操作符第一个参数是 调用该操作符的对象
嗯,是的~
我只是喜欢遇到问题再去找解决,这样来扎实基础,因为先去看vc基础教程,我不容易记不住……
【 在 babylike 的大作中提到: 】
: 这个。。。好好看看vc基础教程,要扎实!