【发布时间】:2022-07-18 21:11:02
【问题描述】:
我目前正在创建一个体育联盟模拟,但在指向模型中对象的指针方面遇到了问题。
我正在做的是在一个 Season 对象中创建 n 个 Game 对象,每个游戏都由模拟中的两个 Team 对象构成。
我的问题是我对Game 类中的Team 对象所做的任何操作都不会保存到在Season 中实例化的原始Team 对象中。基本上每个Game 都只是在全新的团队中运行,原始Team 对象中没有更新任何值。
我知道这与我如何将 Team 对象传递给每个游戏有关,但就是不知道如何。
对于上下文,这是我的第一个 C++ 项目,所以在引用/指针方面还没有真正得到我的帮助 - 任何帮助将不胜感激!
这是我目前正在做的事情的简化版本(就像我传递和构造对象的方式):
Game
{
class Game
{
private:
Team m_homeTeam;
Team m_awayTeam;
public:
Game( Team &homeTeam, Team &awayTeam )
{
m_homeTeam = homeTeam;
m_awayTeam = awayTeam;
}
void startGame() { // operate on team objects }
};
Season
{
private:
// A 2x10 matrix where the first row is the home teams and the second row is the away teams
std::vector< std::vector<Team> > m_roundFixtures;
public:
void startSeason( )
{
Game g = Game ( &m_roundFixtures[0][i], &m_roundFixtures[1][i] );
g.startGame();
}
};
【问题讨论】:
-
你可以让
Team成员变量引用或使用智能指针(例如std::shared_ptr<Team>)。 -
构造函数没问题,只需通过引用传递 Team(s),只要确保他们的生命周期比游戏长(通过设计)。在较大的项目中,如果不按设计使用 std::shared_ptr 也可能成为维护问题(循环依赖!)。 (我个人倾向于仅在具有独立生命周期的线程之间传递数据时才使用 shared_ptr)
-
你的 C++ 教科书或教程中的章节主题是什么?了解主题将有助于指出使用哪种方法,大概它旨在加强本章中介绍的任何材料。
-
@PepijnKramer,不幸的是在编译上述构造函数时得到了
error: no viable overloaded '='。 -
m_homeTeam 和 m_awayTeam 也应该是一个参考。并在初始化列表中初始化它们,而不是在构造函数的主体中。
标签: c++ oop pointers pass-by-reference