0

这个问题比看起来更具欺骗性,所以让我解释一下。


假设我有一个班级Tournament。其中一个成员变量是 Player 指针向量。

class Tournament{
public:
 vector <shared_ptr<Player>> playersInTournament;
 vector <shared_ptr<Round>>  listOfRounds;
 //More code.

假设我还有一个名为Round的课程。

class Round{
public:
 vector <shared_ptr<Player>> playersInRound;
 Round(playersInTournament);
 //More code.

Round 有一个名为addPlayers()的方法。添加玩家时,我想搜索锦标赛的playerInTournament向量以查看该玩家是否存在。


问题:

我不知道如何直接引用playerInTournament,因为我是在 Round 对象的范围内进行的。

尝试/建议的解决方案:

  1. 只需将playerInTournament传递给Round()构造函数并创建它的副本。

    真的很想避免这种情况,因为当我将它用于搜索时,这将是很多开销。在我的脑海中,指针或对playerInTournament的引用可能更可取,因为一旦列表变得足够大,它们会占用更少的内存。

  2. 创建作为类成员的引用。

    我的理由是 Round 与 Tournament 有组成关系。Round 的生命周期永远不会超过 Tournament 对象的生命周期,而且 Round 并不“拥有”该向量,它仅由 Tournament 操作。

我立即遇到的问题是引用不能进行延迟初始化。在创建圆形对象本身之前,我没有任何东西可以直接引用它,所以这对我不起作用。

最后,

  1. 指向作为类成员的向量的指针。

    据我所知,这样做的唯一方法是使用 vector.data() ,它返回指向向量内部使用的数组中第一个元素的指针。这将允许我遍历整个列表以进行验证,这没关系,但我的意图是对向量进行二进制搜索以找到匹配的播放器,我不知道我是否可以使用 vector.data() 来做到这一点。

如果我遗漏了什么,或者我有任何误解,请告诉我。使用 vector.data() 可能是错误的,但我今天已经筋疲力尽了,想要第二个意见,因为这是我为了好玩而做的一个单独的项目。

感谢您的阅读!

最好的,

朱利安贝克是对的

4

1 回答 1

0

这更像是一个设计问题。让我们一步一步来回答你的问题。

Round 有一个名为 addPlayers() 的方法。添加玩家时,我想搜索锦标赛的 playerInTournament 向量以查看该玩家是否存在。

您想要实现:“让Round检查重复时addPlayers()。”

我不知道如何直接引用 playerInTournament,因为我是在 Round 对象的范围内进行的。

然后你发现了一个问题:“如何让Round一个锦标赛中有多少玩家?”

为了回答您的问题,让我们考虑以下问题。

  1. 朗德应该知道锦标赛中的每个球员吗?
  2. Round 是否应该检查是否addPlayers()有重复?

我的建议都是“不”。

  1. 一轮应该更像一个 POD,只包含这一轮中的玩家。
  2. 应该有一个round creator处理哪些球员应该在一轮。
  3. Around creator应该处理重复,所以addPlayer()只会被调用一次。或者永远不存在。因为在构建它时您可能会在一轮中通过所有玩家。

退后一步,看看您想要实现的目标可能会使您免于过早的优化。

于 2020-06-18T07:56:20.853 回答