我试图将多个班级分组到一个班级。 现在我遇到一个问题,就是调用另一个类中的向量中的类方法。
这是我的结构:
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
答案 0 :(得分:1)
有两种选择:
添加返回characterList
的引用的方法:
class Group
{
public:
vector<Character>& getCharacterList () {
return characterList;
}
private:
vector<Character> characterList;
}
然后在main ()
:
...
Group group;
...
group.getCharacterList ()[i].SetName("XX");
但请注意,这不是一个好的解决方案。这个解决方案可能被认为是错误的,因为它不提供任何类型的封装,并使Group
类的实现完全开放。这样的设计将来可能很难支持。
添加返回所需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
。这隐藏了将来可能会改变的实际实现,并且在阅读代码时更容易理解。