C++:将向量传递到构造函数以创建成员变量的最佳方法?
C++: Best way to pass a vector into a constructor to create a member variable?
这个问题比看起来更具欺骗性,所以让我解释一下。
假设我有一个班级锦标赛。其中一个成员变量是玩家指针的向量。
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 对象的范围内执行此操作的。
尝试/建议的解决方案:
只需将playerInTournament传递到Round((构造函数中并创建它的副本。
我真的很想避免这种情况,因为当我只是 使用它就是搜索。在我的脑海中,指针或对玩家在锦标赛中的引用可能会更多 可取的,因为一旦列表变得足够大,它们就会占用更少的内存。
将引用创建为类成员。
我的理由是回合与锦标赛有组成关系。的生命周期 回合永远不会超过锦标赛对象的回合,而且回合也不"拥有"向量, 它只意味着被锦标赛操纵。
我立即遇到的问题是引用不能有延迟初始化。 在创建圆形对象本身之前,我没有什么可以直接引用它,所以这对我不起作用。
最后,
指向作为类成员的向量的指针。
据我所知,唯一的方法是使用 vector.data(( 返回指向第一个的指针 元素在向量内部使用的数组中。这将允许我遍历整个 列表用于验证目的,这没关系,但我的目的是对向量进行二叉搜索 匹配播放器,我不知道我是否可以使用 vector.data(( 做到这一点。
如果我缺少什么,或者我有任何误解,请告诉我。我使用 vector.data(( 可能是错误的,但我只是对这一天感到筋疲力尽,想要第二意见,因为这是我为了好玩而做的一个个人项目。
感谢您的阅读!
最好
朱利安·贝克是对的
这更像是一个设计问题。让我们一步一步地回答您的问题。
Round 有一个名为 addPlayers(( 的方法。当我添加播放器时,我想 搜索锦标赛的玩家在锦标赛向量中查看是否 玩家存在。
您希望实现:"addPlayers()
时Round
检查重复项。
我不知道如何直接引用玩家在锦标赛中,因为我是 从 Round 对象的范围内执行此操作。
然后你发现了问题:"如何让Round
知道一个剧团有多少玩家?
为了回答您的问题,让我们考虑以下问题。
- Round应该认识一个妖怪中的每个球员吗?
- Round应该检查
addPlayers()
是否有重复吗?
我的建议都是"不"。
- 一轮应该更像一个 POD,只包含这一轮中的玩家。
- 应该有一个
round creator
来处理哪些玩家应该参加一轮比赛。 round creator
应处理重复,因此addPlayer()
只会调用一次。或者永远不存在。因为您可以在构建它时通过一个回合中的所有玩家。
退后一步,看看你想要实现的目标可能会让你免于过早的优化。
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- C++预处理会生成变量成员、资源库和映射
- 局部堆栈变量成员的返回值优化
- Google Mock:在目标类的构造函数中实例化的模拟私有变量成员
- 使用指向结构变量成员的指针访问该结构的成员的地址
- 如果派生类仅包含自动变量成员,是否有必要具有虚拟驱动器
- 线程安全性和静态变量/成员功能
- "static const char array"可以在 C 语言上包含变量成员吗
- 仅用于内部目的的类的所有变量/成员的技术术语是什么
- 如何强制转换变量成员以将其作为函数的引用参数传递
- 类中未声明变量成员函数
- 在 main 中初始化类的 "static const" 类型变量成员的更好方法
- c++模板类静态const变量成员作为映射键给出未定义引用
- 在类中初始化结构变量成员会导致分割错误
- 在c++中建模变量成员类型
- 模板私有静态变量成员的未定义符号
- 不能访问公共静态变量成员
- 常量变量成员在C++有什么用?
- g++ 4.8.2坚持简单变量成员是数组