【问题标题】:How do we instantiate an object which operates on the (original) objects passed to it in C++? [closed]我们如何实例化一个对 C++ 中传递给它的(原始)对象进行操作的对象? [关闭]
【发布时间】: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&lt;Team&gt;)。
  • 构造函数没问题,只需通过引用传递 Team(s),只要确保他们的生命周期比游戏长(通过设计)。在较大的项目中,如果不按设计使用 std::shared_ptr 也可能成为维护问题(循环依赖!)。 (我个人倾向于仅在具有独立生命周期的线程之间传递数据时才使用 shared_ptr)
  • 你的 C++ 教科书或教程中的章节主题是什么?了解主题将有助于指出使用哪种方法,大概它旨在加强本章中介绍的任何材料。
  • @PepijnKramer,不幸的是在编译上述构造函数时得到了error: no viable overloaded '='
  • m_homeTeam 和 m_awayTeam 也应该是一个参考。并在初始化列表中初始化它们,而不是在构造函数的主体中。

标签: c++ oop pointers pass-by-reference


【解决方案1】:

您的构造函数非常好;您通过引用有效地传递了团队。但是,当您执行m_homeTeam = homeTeam; m_awayTeam = awayTeam; 时,您并没有复制引用,而是实际上复制了整个对象。因此,稍后,当您想要访问 m_homeTeam 时,您访问的不是您为构造函数提供的引用,而是一个完全不同的对象。

要解决此问题,您可以将 指针 传递给团队,而不是通过引用传递您的团队;然后,您可以将 m_homeTeamm_awayTeam 的类型从 Team 更改为 Team*:

    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, using -> instead of . when accessing their methods }
    };
    
    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( )
        {
            // still perfectly fine, you are sending a pointer to a Team object
            Game g = Game ( &m_roundFixtures[0][i], &m_roundFixtures[1][i] );
            g.startGame();
        }
    };

【讨论】:

    猜你喜欢
    • 2021-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-15
    • 2018-12-13
    • 1970-01-01
    相关资源
    最近更新 更多