这是一个相对简单的问题,但细节让我感到困惑。
我有一个基本结构如下:
struct player {
string name;
int rating;
};
和一个使用这个结构的类“团队”。考虑到这一点,“玩家”结构的正确放置位置在团队的公共/私有字段中还是在单独的文件中?另外,为了创建它的实例,我需要做些什么不同的事情吗?谢谢。
你必须问自己一个问题。player
除非与 class 结合使用,否则struct 是否毫无意义team
?如果是这样,它可能应该在里面定义team
;否则,应独立定义。
也就是说:如果有人可以想象要使用player
尚未从 a 中直接检索到的对象,则team
应该创建player
一个独立的结构。由于我们不知道您的程序背后的一般结构或想法,我们无法直接回答您。
这取决于您如何使用团队/玩家结构。如果您的播放器被应用程序的其他部分使用,您应该让播放器独立,这是大多数情况下的做法。
struct Player {
int rating;
std::string name;
};
class Team
{
private:
std::vector<Player> players_; // here you have a bunch of players
};
如果您Player
完全被内部使用Team
并且没有人使用它,您可以将它放在Team
struct/class 中以缩小其名称范围。
class Team
{
private:
struct Player{
int rating;
std::string name;
};
private:
std::vector<Player> players_; // here you have a bunch of players
};
只需在类之前定义结构。这应该够了吧...
我认为一个团队是一个玩家的集合,所以使用一些容器来管理团队是很方便的。在STL
中可以找到很多高效的容器,由您选择最适合您需要的容器。
还要提一下,为了对与同一任务相关的人员进行分组,您可以使用namespace。
关键是能Player
不能不用用就用Team
。如果是这样,它应该是一个单独的类,而不是嵌套的。在精心设计的传统 (OO) 软件中,大多数嵌套类仅在外部类内部使用,并且是私有的。或者它们是代理,用于从外部类的函数返回值,但从未由外部类的客户端声明。
对类成员类提出其他“观点”也可能被认为是可取的;例如将迭代器放入容器中。迭代器应该是成员还是自由类,更多的是风格问题(但你应该保持一致);它主要影响名称(ContainerIterator
vs. Container::Iterator
)。
最后,模板引入了另一个维度:给定一个 type 上的T
模板,在这个模板中,引用成员(包括成员类型)很容易T
;不可能找到“不相关”的类型。换句话说,如果您使用 实例化模板T == Container
,Container::Iterator
则可以随时使用typename T:Iterator
,但您无法找到ContainerIterator
。
鉴于您的类的名称,我强烈怀疑它们应该是独立的,Team
并且1-n
与Player
. (我还怀疑两者都是实体对象,应该使其不可复制和不可分配。但这是另一个问题。)