我有一个有趣的任务,我有std::map
CTurist
(上一课)和unsigned
变量。这是代码:
class CTurist
{
protected:
string tName;
int age;
public:
CTurist() {};
CTurist(string name, int age2)
{
tName = name;
age = age2;
}
bool operator<(const CTurist& e) const
{
return age < e.age;
}
friend ostream& operator<<(ostream& os, const CTurist&& e);
friend ifstream& operator>>(ifstream& is, CTurist&& e);
};
class CHotel:public CTurist
{
protected:
string hName;
int stars;
int beds;
map<CTurist, unsigned> Turisti;
public:
unsigned Sum = 0;
CHotel(){};
CHotel(string hName2, int zvezdi, int legla)
{
hName = hName;
stars = zvezdi;
beds = legla;
}
int Compare()
{
list<CTurist*> list;
int br=0;
CTurist vyzrast;
map<CTurist, unsigned>::iterator it = Turisti.begin();
while (it != Turisti.end())
{
if (it->first < vyzrast)
{
br++;
}
else
{
list.push_back(std::move(&it->first));
}
}
}
};
我知道它很长,但我认为最好给你所有的信息。
现在,底部的int Compare()
功能是导致我出现问题的功能。
我必须检查游客的年龄是否高于或低于我在此称为vyzrast
的参数。我们正在比较age
。如果它低于它,那就非常直接了。
如果它在上面,我必须将这些游客添加到list<CTurist*>
,也就是说。到指针列表。如果我从对象创建列表,而不是指针。没有运气,因此我在寻找建议如何解决这个问题。
答案 0 :(得分:0)
为什么要为operator
重载使用右值引用?您应该const CTurist &
使用operator<<
,CTurist&
使用operator>>
。您应该std::istream
使用operator>>
:
friend ostream& operator<<(ostream& os, const CTurist &e);
friend istream& operator>>(istream& is, CTurist &e);
除此之外,Compare()
在填充std::move()
时没有理由使用std::list
,因为它正在添加指针,而不是移动实际对象。
Compare()
由于以下几个原因而无法正常胜出:
it->first
是一个实际的const CTurist
对象,但您的std::list
期待CTurist*
指针。 std::map
个键是const
,因此&it->first
是CTurist const *
指针(指向const对象的非const指针),而不是CTurist*
指针(非常量指针)对于非const对象)就像你期待的那样。
您的vyzrast
对象未初始化。您根本没有为其age
(和tName
)成员分配任何值,因此您的比较结果是不确定的。
您没有在每次循环迭代中递增it
迭代器,因此如果std::map
不为空,您将陷入无限循环。
尝试更像这样的东西:
int Compare()
{
std::list<const CTurist *> clist;
int br = 0;
CTurist vyzrast("", SomeAgeValueHere);
std::map<CTurist, unsigned>::iterator it = Turisti.begin();
while (it != Turisti.end())
{
if (it->first < vyzrast)
{
br++;
}
else
{
clist.push_back(&it->first);
}
++it;
}
// use clist as needed...
return SomeValueHere;
}