0

我有一个指向类的指针列表:

list<AbsClient*> clients;

AbsClient 可能是 3 个中的 1 个:TempClient、RegisteredClient、VIPClient。

在 AbsClient 内部有一个受保护的变量:phone_number。

我需要遍历客户列表,并搜索特定的电话号码。

我试过这个:

    list<AbsClient*>::iterator iter;
    for(iter=clients.begin();iter!=clients.end();++iter)
{
    if(iter->phone_number == phone)
    {

    }
}

但它不允许我访问 iter->phone_number:

错误:表达式必须具有指向类的类型

这条线有什么问题?

PS是否可以使用 stl::find 函数并以某种方式告诉它通过“phone_number”变量进行搜索?

谢谢

4

1 回答 1

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));
// ...
于 2012-08-25T17:05:42.080 回答