一个操作符重载问题。

zhileichen 2008-11-17 09:53:27
class wkrs
{
public:
wkrs() : num(""), name(""), sex(""), age(0) {}
wkrs(string s1, string s2, string s3, int a) : num(s1), name(s2), sex(s3), age(a){}
private:
string num;
string name;
string sex;
int age;
friend ostream & operator << (ostream & os, const wkrs & wk);
friend istream & operator >> (istream & is, wkrs & wk);
friend bool operator < (const wkrs & wk, const string & s);
};
////////////////////////////////////////////////////////////
//我知道是不能以下这么重载的, 但是要如何才能实现同时能比较类里的两个成员呢???
//
bool operator < (const wkrs & wk, const string & s)
{
return wk.num < s;
}
bool operator < (const wkrs & wk, const string & s)
{
return wk.name < s;
}


...全文
219 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhileichen 2009-10-03
  • 打赏
  • 举报
回复


















































































zhileichen 2009-10-03
  • 打赏
  • 举报
回复
就呆在云上 2008-11-18
  • 打赏
  • 举报
回复
用一个函数集成以下就是了
既然要比较两个变量,那就这么修改吧,用pair模板的大小比较方法
先要比较num和s,如果大于就再比较后面的name和s字符串,参考pair模板的写法


#include <string>
using namespace std;
class wkrs
{
public:
wkrs() : num(""), name(""), sex(""), age(0) {}
wkrs(string s1, string s2, string s3, int a) : num(s1), name(s2), sex(s3), age(a){}
private:
string num;
string name;
string sex;
int age;
friend ostream & operator << (ostream & os, const wkrs & wk);
friend istream & operator >> (istream & is, wkrs & wk);
friend bool operator < (const wkrs & wk, const string & s);
};

//既然要比较两个变量,那就这么修改吧,用pair模板的大小比较方法
//先要比较num和s,如果大于就再比较后面的name和s字符串,参考pair模板的写法
bool operator < (const wkrs & wk, const string & s)
{
return ((strcmp(wk.num.c_str(), s.c_str() ) < 0) ||
!(strcmp(wk.num.c_str(), s.c_str() ) < 0) &&(strcmp(wk.name.c_str(), s.c_str() ) < 0));
}



int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}
P_ghost 2008-11-18
  • 打赏
  • 举报
回复
奇怪的思想,同时比较两个成员,如果一个比较出来结果为小于,一个为大于,如何判断呢?
hai040 2008-11-18
  • 打赏
  • 举报
回复
用函数对象,设一个状态来实现不同的比较
nullah 2008-11-18
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 huntrose 的回复:]
使用成员函数的方法比较好,像3楼说那样
[/Quote]
使用成员函数还是一样的效果
楼主要比较两个成员函数

2楼的是个解决办法
taodm 2008-11-18
  • 打赏
  • 举报
回复
好,好,解决就好。
不是我们不懂你的意思,而是你没懂我们的意思。
“对不合理的问题,去寻找合理解”其实是没有意义的。
zhileichen 2008-11-18
  • 打赏
  • 举报
回复
谢谢 各位大大

我想大部分人还是理解错了我的意思, 也都怪我没表达清楚
不过谢谢你们了
我已经找到了解决方法,正如13楼所说的 使用用函数对象

以下是我的实现:
class less
{
private:
enum type {num, name, age};
type codition;
public:
bool less::operator ()(const wkrs &wk, const std::string &s)
{
if(condition == num) return wk.num < s;
if(condition == name) return wk.name < s;
if(condition == age) return wk.age < atoi(s.c_str());
}
less(type temp = num) : condition(temp) {}
};
huntrose 2008-11-17
  • 打赏
  • 举报
回复
使用成员函数的方法比较好,像3楼说那样
toadzw 2008-11-17
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;
class wkrs
{
public:
wkrs():num(9){}
int num;

friend bool operator < (const wkrs & wk, const string & s);
};
////////////////////////////////////////////////////////////
//我知道是不能以下这么重载的, 但是要如何才能实现同时能比较类里的两个成员呢???
//
bool operator < (const wkrs & wk, const int & s)
{cout<<"here"<<endl;
return wk.num < s;
}



int main()
{
wkrs w1;
cout<<(w1<14);
}
lann64 2008-11-17
  • 打赏
  • 举报
回复
还不谈实现的事,楼主这个设计思想就是错的。

假设能够重载,那对于:
wkrs w;
const string s;

if (w<s).... //这时候,楼主希望是运行的哪个版本的重载函数?
toadzw 2008-11-17
  • 打赏
  • 举报
回复
应该是直接就可以使用的,见我的实现:
#include <iostream>
using namespace std;
class wkrs
{
public:
wkrs():num(9){}
int num;

friend bool operator < (const wkrs & wk, const string & s);
};
////////////////////////////////////////////////////////////
//我知道是不能以下这么重载的, 但是要如何才能实现同时能比较类里的两个成员呢???
//
bool operator < (const wkrs & wk, const int & s)
{
return wk.num < s;
}



int main()
{
wkrs w1;
cout<<(w1<14);
}
arong1234 2008-11-17
  • 打赏
  • 举报
回复
重载至少要求函数参数列表不一样,他要求得是完全一样得参数列表,同样得函数名,不同得功能,绝对是无法实现得。
[Quote=引用 5 楼 elegant87 的回复:]
可以这样重载的!重载为友元函数就需要两个参数的!
你可以重载为成员函数的!更好一些的!
[/Quote]
太乙 2008-11-17
  • 打赏
  • 举报
回复
bool operator < (const wkrs & wk, const string & s)
{
return wk.num < s;
}
bool operator < (const wkrs & wk, const string & s)
{
return wk.name < s;
}

为啥不把这俩放在一起呢?

elegant87 2008-11-17
  • 打赏
  • 举报
回复
可以这样重载的!重载为友元函数就需要两个参数的!
你可以重载为成员函数的!更好一些的!
changsheng230 2008-11-17
  • 打赏
  • 举报
回复
const wkrs & wk 和 const string & s的比较确实没有重载operator <
arong1234 2008-11-17
  • 打赏
  • 举报
回复
在一个函数、运算符里分别比较两个成员是无法通过C++实现的,因为C++不允许二义性
因此正确的做法是写两个比较函数,如

bool wkrs::compareByName(const string & s);
bool wkrs::compareByNum(const string & s);

wuyu637 2008-11-17
  • 打赏
  • 举报
回复
struct compare_struct
{
string name;
string num;
}

bool opeator < (const wkrs& ws, const compare_struct & s)
{
if(wk.num > s.num && wk.name > s.name)
return true;
else
return false;
}
taodm 2008-11-17
  • 打赏
  • 举报
回复
std::pair听说过没有?
另外,只听说需要 wkrs的2个对象间需要使用<。
wkrs和直接的string比较基本属恶搞。

65,184

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧