C++:将向量传递到构造函数以创建成员变量的最佳方法?

C++: Best way to pass a vector into a constructor to create a member variable?

本文关键字:变量 成员 创建 最佳 方法 构造函数 向量 C++      更新时间:2023-10-16

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


假设我有一个班级锦标赛。其中一个成员变量是玩家指针的向量。

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((的方法。 当我添加玩家时,我想搜索锦标赛的玩家InTournament向量以查看该玩家是否存在。


问题:

我不知道如何直接引用玩家在锦标赛中,因为我是在 Round 对象的范围内执行此操作的。

尝试/建议的解决方案:

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

    真的很想避免这种情况,因为当我只是 使用它就是搜索。在我的脑海中,指针或对玩家在锦标赛中的引用可能会更多 可取的,因为一旦列表变得足够大,它们就会占用更少的内存。

  2. 将引用创建为类成员。

    我的理由是回合与锦标赛有组成关系。的生命周期 回合永远不会超过锦标赛对象的回合,而且回合也不"拥有"向量, 它只意味着被锦标赛操纵。

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

最后,

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

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

如果我缺少什么,或者我有任何误解,请告诉我。我使用 vector.data(( 可能是错误的,但我只是对这一天感到筋疲力尽,想要第二意见,因为这是我为了好玩而做的一个个人项目。

感谢您的阅读!

最好

朱利安·贝克是对的

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

Round 有一个名为 addPlayers(( 的方法。当我添加播放器时,我想 搜索锦标赛的玩家在锦标赛向量中查看是否 玩家存在。

您希望实现:"addPlayers()Round检查重复项。

我不知道如何直接引用玩家在锦标赛中,因为我是 从 Round 对象的范围内执行此操作。

然后你发现了问题:"如何让Round知道一个剧团有多少玩家?

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

  1. Round应该认识一个妖怪中的每个球员吗?
  2. Round应该检查addPlayers()是否有重复吗?

我的建议都是"不"。

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

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