调用另一个对象类中的向量中的对象类方法

时间:2017-12-10 12:19:12

标签: c++

我试图将多个班级分组到一个班级。 现在我遇到一个问题,就是调用另一个类中的向量中的类方法。

这是我的结构:

class Group
{
    public:
       void PushCharacterToVector(Character character);
    private:
        vector<character> characterList;
}

class Character
{
    public:
        Character();
        void SetName(string name);
    private:
        string _name;
} 

如果没有Group课程,characterList中已声明main(),我可以使用characterList[i].SetName("XX")调用课程方法。

因为我需要在characterList类中声明这个Group。我想做这样的行动

Group _group;
_group.PushCharacterToVector(Character());
//Set name to a character inside Group vector
_group.characterList[0].SetName("Kelvin"); //My concept to do

1 个答案:

答案 0 :(得分:1)

有两种选择:

  1. 添加返回characterList的引用的方法:

    class Group
    {
        public:
            vector<Character>& getCharacterList () {
                return characterList;
            }
    
        private:
            vector<Character> characterList;
    }
    

    然后在main ()

    ...
    Group group;
    ...
    group.getCharacterList ()[i].SetName("XX");
    

    但请注意,这不是一个好的解决方案。这个解决方案可能被认为是错误的,因为它不提供任何类型的封装,并使Group类的实现完全开放。这样的设计将来可能很难支持。

  2. 添加返回所需Character对象的引用或指针的方法:

    class Group
    {
        public:
            int AddCharacter (const Character& i_character) {
                int character_id = characterList.size ();
    
                characterList.push_back (i_character);
    
                return character_id;
            }
    
            Character& Character (int i_character_id) {
                return characterList [i_character_id];
            }
    
        private:
            vector<Character> characterList;
    }
    

    这种设计稍微好一些,因为它没有揭示Group类的实际实现。但是,使用字符名称作为标识符可能是更好的解决方案。

    可以从Group::AddCharacter()方法检索字符ID:

    ...
    Group group (...);
    Character character (...);       
    
    auto character_id = group.AddCharacter (character);
    
    group.Character (character_id).SetName ("new name");
    ...
    

    请注意,您没有将方法PushCharacterToVector()命名为AddCharacter。这隐藏了将来可能会改变的实际实现,并且在阅读代码时更容易理解。