C++ 遍历另一个类中包含的向量

C++ 遍历另一个类中包含的向量,c++,class,vector,iteration,C++,Class,Vector,Iteration,节目描述 我有三个班:A、B和C 对于这个问题,类B只包含一个ID变量和一个状态变量,以及这些变量的setter和getter 类A包含B对象的向量,以及使用单元ID存储、删除、修改或比较单元的函数 类C包含与黑盒对话的功能,此黑盒包含与类a相同的B向量,但具有更新的状态 本帖末尾展示了基本信息类的粗略示例 问题 在我的主窗口中,我希望遍历类A中的向量。对于所有我希望获得ID的元素,将其传递给类C,并让类C返回更新状态。我画了一张草图来说明我的意思 我的问题是如何正确地迭代类A中的向量,以获得I

节目描述

我有三个班:A、B和C

对于这个问题,类B只包含一个ID变量和一个状态变量,以及这些变量的setter和getter

类A包含B对象的向量,以及使用单元ID存储、删除、修改或比较单元的函数

类C包含与黑盒对话的功能,此黑盒包含与类a相同的B向量,但具有更新的状态

本帖末尾展示了基本信息类的粗略示例

问题

在我的主窗口中,我希望遍历类A中的向量。对于所有我希望获得ID的元素,将其传递给类C,并让类C返回更新状态。我画了一张草图来说明我的意思

我的问题是如何正确地迭代类A中的向量,以获得ID,然后将ID发送到类C

在这一点上,我所考虑的是类似于以下内容的内容(注意:出于这个问题的目的,类A中的向量是自动填充的):

intmain(){
...
...
对于(int i=0;i
这并不是非常出色,这就是为什么我要征求关于如何执行这项任务的建议。我已经草拟了一份系统的大致计划。很抱歉我的画不清楚

课程

class A {
  public:
    void updateStatus(char ID, bool status);
    ...
    ...
  private:
    vector<B> b_Storage;
}

class B {
  public:
    getters & setters
  private:
    char ID;
    bool state;
}

class C {
  public:
    bool getState(char ID);
    ...
  private:
    ...
}
A类{
公众:
无效更新状态(字符ID,布尔状态);
...
...
私人:
向量b_存储;
}
B类{
公众:
接球手和接球手
私人:
字符ID;
布尔州;
}
C类{
公众:
bool getState(字符ID);
...
私人:
...
}

如果您的问题是迭代
b_存储
的元素,这是私有的,您可以通过在类A中添加两个公共方法来尝试使用迭代器:

std::vector<B>::iterator begin() {
return b_Storage.begin();
}
std::vector<B>::iterator end() {
return b_Storage.end();
}
std::vector::iterator begin(){
返回b_存储。开始();
}
std::vector::迭代器end(){
返回b_Storage.end();
}

并使用这些迭代器访问
b_存储的元素

您可以选择不在
main
中迭代,而是将迭代移动到
A

class A
{
public:
     void updateStates(std::function<bool(char)> f)
     {
          for (const auto& b: b_Storage)
          {
              updateStatus(b.id, f(b.id));
          }
     }
};

// ...

int main() {
    // ...
    A a;
    C c;
    a.updateStates([&](char id) { return C.getState(id); });
}
A类
{
公众:
void updateStates(std::函数f)
{
用于(const auto&b:b_存储)
{
更新状态(b.id,f(b.id));
}
}
};
// ...
int main(){
// ...
A A;
C C;
a、 updateStates([&](charid){return C.getState(id);});
}

这使得
main
更加独立于
A
的实现。

听起来A中应该有一个函数为您实现这一点。这样你就可以直接在函数中使用向量了。我认为它已经足够出色了!似乎是最明智的事情。我仍然是C++编程新手,所以我不确定这里发生了什么:A.UpDestestes([&(char id)-> BOOL {C.GETStand(ID);});@trick4GLTE参数是一个lambda表达式;匿名函数的定义。你可以读到它,例如。如果你正在从一本相当新的书(比如2011年或更高版本)中学习,它应该涵盖这些内容。谢谢你,我会努力研究的。
class A
{
public:
     void updateStates(std::function<bool(char)> f)
     {
          for (const auto& b: b_Storage)
          {
              updateStatus(b.id, f(b.id));
          }
     }
};

// ...

int main() {
    // ...
    A a;
    C c;
    a.updateStates([&](char id) { return C.getState(id); });
}