我已经好几天没有回答了我的问题......
我正在尝试搜索某个项目以进行修改。使用“列表”我需要重载运算符==但我不明白我的错误。你能告诉我怎么解决这个问题?
class Nation{
private :
short continent;
unsigned int population, superficie;
string pays, ville;
public :
list<Nation> lireRemplir(list<Nation>liste, const char nomALire[]);
Nation(short continent, unsigned int population, unsigned int superficie, string pays, string ville) {
..... // ok
}
Nation(){};
void modifierContinent(list<Nation> liste, string nomPays, short nouveauContinent);
bool operator == (Nation &); //?
};
bool Nation::operator == (Nation & autre) {
return this->pays == autre.pays;
}
void modifierContinent(list<Nation> liste, string nomPays, short nouveauContinent)
{
//Nation uneNation(0,0,0,nomPays,"");
for (list<Nation>::iterator il = liste.begin(); il != liste.end(); il++)
{
if (*il == nomPays){ cout << "found!"; }
}
}
int main()
{
list<Nation>liste;
liste=lireRemplir(liste, "Nation.txt"); //hidden but working
modifierContinent(liste, "FRANCE", 5);
}
答案 0 :(得分:3)
下面:
if (*il == nomPays){ cout << "found!"; }
nonPays
是字符串类型,但您为另一个Nation
类型重载了运算符。没有超载=
需要Nation
和string
。两种解决方案:
您可以将转换重载为字符串(不推荐)或创建带字符串的构造函数。
最佳解决方案是为getter
创建pays
方法。只做il->getPays() == nomPays
。简洁明了。
答案 1 :(得分:1)
您不一定要在班级中重载操作员。原因如下:您已使用std::list
。这很好。现在更进一步,也放弃你自己的算法,转而使用标准的算法:std::find_if
。
std::find_if
可以使用您提供的比较仿函数搜索标准容器类。通常,该仿函数是struct
,其重载operator()
(因此它的对象可以像函数一样使用)。
我给你举个例子:
#include <algorithm> // for std::find_if
// ...
struct CountryComparison
{
CountryComparison(std::string const &country) : m_country(country) {}
bool operator()(Nation const &nation) const
{
return nation.pays == m_country;
}
std::string m_country;
};
void modifierContinent(list<Nation> &liste, string const &nomPays, short nouveauContinent)
{
list<Nation>::const_iterator find_iter = std::find_if(liste.begin(), liste.end(),
CountryComparison(nomPays));
if (find_iter != liste.end())
{
cout << "found!";
}
}
我还确保字符串由const&amp;传递,这应该是至少在C ++ 11之前的字符串参数的默认值。我通过&amp;传递liste
,这也更有可能是预期的行为(因为它不会创建不必要的副本)。
顺便说一下,你的Nation
课很奇怪。它包含一个&#34;国家&#34; (支付)和&#34;镇&#34; (威乐)。这意味着在你的课堂设计中,一个国家由一个国家和一个城镇组成。除了城市国家之外,这没有任何意义;)
修改:我忘记了实施细节。由于仿函数无法直接访问pays
的{{1}}成员,请考虑为您的班级提供以下成员函数:
Nation
或者将仿函数设为std::string GetPays() const
{
return pays;
}
friend
。