我有一个指向类的指针列表:
list<AbsClient*> clients;
AbsClient可以是3:TempClient,RegisteredClient,VIPClient。
在AbsClient内部有一个受保护的变量:phone_number。
我需要遍历客户列表,并搜索特定的电话号码。
我试过了:
list<AbsClient*>::iterator iter;
for(iter=clients.begin();iter!=clients.end();++iter)
{
if(iter->phone_number == phone)
{
}
}
但它不允许我访问iter-&gt; phone_number:
错误:表达式必须具有指向类的指针
这条线有什么问题?
P.S是否可以使用stl :: find函数并以某种方式告诉它通过“phone_number”变量进行搜索?
谢谢
答案 0 :(得分:1)
您可以将迭代器视为容器的“指向元素的指针”。容器中元素的类型是AbsClient*
- 另一个指针。所以,至少在语法上,你处于双指针状态,所以你需要改变你的解释器的解除引用方式:
(*iter)->phone_number == phone
您的帖子说phone_number
是受保护的成员,当您不在该类或派生类中时,您无法访问受保护的变量,因此您需要使用访问器方法或更改数据成员的可见性。
不,您不能使用std::find
执行此操作(至少不能直接执行此操作),但您可以使用std::find_if
:
iter = std::find_if(clients.begin(), clients.end(),
[phone](AbsClient* cl) { return cl->phone_number == phone; });
如果您不使用C ++ 11,那么它会更冗长:
struct MatchPhone {
explicit MatchPhone(PhoneNumber p) : phone(p) {}
bool operator()(AbsClient* cl) {
return cl->phone_number == phone;
}
PhoneNumber phone;
};
// ...
iter = std::find_if(clients.begin(), clients.end(), MatchPhone(phone));
// ...