[英]Dereferencing a class pointer function in iterator
我创建了一个指向名为 Food 的类的指针向量
vector<Food*> items;
该类如下所示:
class Food
{
private:
string name;
int month;
int year;
public:
void display()
{
cout << name << " - " << month << "/" << year << endl;
}
}
然后我创建了一个函数来提示这些项目
void promptInventory(vector<Food*> &items)
{
string name;
int month;
int year;
do
{
cout << "Enter item name: ";
getline(cin, name);
if (name != "quit")
{
cout << "Enter expiration month: ";
cin >> month;
cout << "Enter expiration year: ";
cin >> year;
cin.ignore();
Food * food = new Food;;
food->setName(name);
food->setMonth(month);
food->setYear(year);
items.push_back(food);
}
}
while (name != "quit);
我想遍历指针向量并为所有项目调用显示函数,但我无法使用迭代器取消对它们的引用。
我怎样才能成功地遍历这些指针并调用显示函数?
很遗憾,
vector<Food*>::iterator iter = items.begin();
while (iter < items.end())
{
cout << *iter->display() << endl;
}
结果是:
error: request for member ‘display’ in ‘* iter.__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator-><Food**, std::vector<Food*> >()’, which is of pointer type ‘Food*’ (maybe you meant to use ‘->’ ?)
cout << *iter->display() << endl;
谢谢!
运算符优先级已为您服务。 *iter->display()
被编译器解释为*(iter->display())
因为->
优先于(将在之前执行) *
。 一个更清晰的方式来看待这个是*((*iter).display())
Food *
。Food*
上调用 display 。 失败并导致编译器错误。display
的结果。 您需要使用一些括号强制执行所需的执行顺序: (*iter)->display()
Food *
Food
引用Food
上调用显示解决这个问题会导致问题 2: display
不返回任何可以写入cout
。 幸运的是, display
完成了所有需要的打印。
while (iter < items.end())
{
(*iter)->display();
}
解决了这个问题,但在惯用的 C++ 中有一个更好的解决方案:重载<<
运算符。
Food
挑friend
功能
class Food
{
private:
string name;
int month;
int year;
public:
void display()
{
cout << name << " - " << month << "/" << year << endl;
}
friend ostream & operator<<(ostream & out, const Food & food)
{
out << food.name << " - " << food.month << "/" << food.year;
return out;
}
};
然后你可以
vector<Food*>::iterator iter = items.begin();
while (iter < items.end())
{
cout << **iter << endl;
}
或使用基于范围的 for 循环
for (auto & item:items)
{
cout << *item << endl;
}
旁注:除了练习指针,还要练习智能指针。 你会发现它们更有用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.