【问题标题】:C++ object referencing/accessingC++ 对象引用/访问
【发布时间】:2014-09-26 23:57:48
【问题描述】:

好的,所以我有一个 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 中的组对象调用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;
};

【问题讨论】:

标签: c++ pointers object reference


【解决方案1】:

您可以通过多种方式做到这一点。

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

{
    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);
}

【讨论】:

  • 啊,这一切都在我脑海中浮现。非常感谢!
【解决方案2】:

在这一行i.Join(n, t); 中,您实际上尝试调用vector&lt;Group&gt;::iterator 对象的函数Join()。要获得期望的行为,您必须首先取消引用迭代器,以便调用 Group 对象的函数。这就是它应该看起来像(*i).Join(n, t);。请注意,*i.Join(n, t); 不起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-31
    • 2021-12-19
    • 2023-03-30
    • 2017-04-15
    • 1970-01-01
    • 2017-02-24
    • 2020-08-12
    • 1970-01-01
    相关资源
    最近更新 更多