C++对象引用/访问

C++ object referencing/accessing

本文关键字:访问 对象引用 C++      更新时间:2023-10-16

好的,所以我有一个GroupDB类(Group Databse),嵌套在里面的是一个Group类。Group类包含两个私有变量,其中包含组的名称和组的成员。每次用户创建一个新组时,都会创建一个组对象,并将其添加到我的GroupDB类中的组对象向量中。我正在开发一个功能,让用户加入一个特定的组。。。

我正在尝试遍历Group对象的这个向量,并访问每个对象,直到找到正确的组,然后我想将用户添加到组成员的正确组向量中

这是相关代码:

void GroupDB::JoinGroup(string n, string t) {
        for (vector<Group>::iterator i = groupList.begin();
            i != groupList.end(); ++i)
        {
            Group g = *i;
            string x = g.GetName();
            if (x == t)
                i.Join(n, t);
        }
}

我正在努力理解迭代器是如何工作的
我相信Group g = *i; string x = g.GetName();是正确的,但我如何为groupList中的group对象实际调用Join()函数

这也是我的课堂标题:

class GroupDB {
public:
    void JoinGroup(string, string);
private:
    class Group
    {
    public:
        string GetName();
        vector<string> GetMembers();
        void Join(string, string);
        Group(string);
    private:
        string name;
        vector<string> members;
    };
private:
    vector<Group> groupList;
};

您可以通过以下几种方式来实现这一点。

您可以取消引用迭代器来访问对象(在检查名称之前不需要复制它):

{
    string x = i->GetName();  // The same as (*i).GetName()
    if (x == t)
        i->Join(n, t);    // The same as (*i).Join(n, t)
}

或者你可以使用一个参考变量,在不复制的情况下为向量中的对象引入一个新名称:

{
    Group& g = *i;
    string x = g.GetName();
    if (x == t)
        g.Join(n, t);
}

在这一行i.Join(n, t);中,您实际上试图调用vector<Group>::iterator对象的函数Join()。要获得所需的行为,必须首先取消对迭代器的引用,这样才能调用Group对象的函数。这就是它应该看起来像(*i).Join(n, t);的样子。请注意,*i.Join(n, t);不起作用。