【发布时间】:2020-07-14 22:36:53
【问题描述】:
我有一组正在迭代的类对象(Fighter),偶尔会调用该类的成员函数。当我尝试调用迭代器指向的对象的成员函数时,似乎我错误地取消引用了我的迭代器。
std::cout << (*iter)->getFrame(text);
我收到以下编译器错误:
错误:“->”的基本操作数具有非指针类型“const Fighter”
【问题讨论】:
标签: c++ pointers data-structures iterator
我有一组正在迭代的类对象(Fighter),偶尔会调用该类的成员函数。当我尝试调用迭代器指向的对象的成员函数时,似乎我错误地取消引用了我的迭代器。
std::cout << (*iter)->getFrame(text);
我收到以下编译器错误:
错误:“->”的基本操作数具有非指针类型“const Fighter”
【问题讨论】:
标签: c++ pointers data-structures iterator
您可以直接在iter 上使用-> 运算符。如果你想先取消引用,你可以使用. 操作符:(*iter).getFrame(text);
std::cout << iter->getFrame(text);
或
std::cout << (*iter).getFrame(text);
【讨论】:
错误是因为您的容器显然不包含指针类型作为其元素类型。取消引用迭代器会为您提供对容器中元素的引用,例如:
container::value_type &element = *iter;
如果元素类型不是指针,并且该类型没有重载 -> 运算符(例如,智能指针类型通常会重载),那么您不能使用 -> 运算符来访问元素的成员:
element->getFrame(text); // error!
您需要改用. 运算符:
element.getFrame(text); // OK!
回到上下文中,你会得到这样的结果:
std::cout << (*iter).getFrame(text); // OK!
另一种方法是在迭代器本身上使用-> 运算符,它会为您取消对迭代器的引用,以便您可以在同一表达式中访问元素的成员:
std::cout << iter->getFrame(text); // OK!
【讨论】: