【问题标题】:Searching by a specific variable in a class按类中的特定变量搜索
【发布时间】:2012-08-25 16:49:33
【问题描述】:

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

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:

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

这条线有什么问题?

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

谢谢

【问题讨论】:

  • if(iter-&gt;phone_number == phone) 应该是 if((*iter)-&gt;phone_number == phone) 因为它指向 value_type of (AbsClient*) 另一个指向 AbsClient 的指针
  • @Mr.Anubis if((*iter)->phone_number == phone) 给我一个错误说:成员 AbsClient::phone_number 无法访问。并且:没有运算符“==”与这些操作数匹配。

标签: c++ list iterator find


【解决方案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));
// ...

【讨论】:

  • 你的结构中的“PhoneNumber”是什么?你是说我的变量phone_number吗?或某种类型...?编辑:我猜这是一种类型。所以我需要字符串。
  • @AdamDe 您的phone_number 变量的类型不在您的问题中,所以我编了一个。
  • 我将 phone_number 更改为公开的,现在我有这个错误:没有运算符“==”与这些操作数匹配(在线:cl->phone_number == phone)。编辑:电话和电话号码都是字符串。
  • @AdamDe 使用我的精神力量,我推断您已声明 phone_numberphone 是不同的类型。或者它们是一些奇怪的字符串类型,没有声明 operator==
  • @AdamDe 那么他们不是std::strings。你自己写的字符串类型吗?
猜你喜欢
  • 1970-01-01
  • 2022-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多