【问题标题】:objects in a class, number/array or objects类、数字/数组或对象中的对象
【发布时间】:2014-08-16 02:33:09
【问题描述】:

也许我很遥远,但我正在尝试自学 C++ 对象和类的想法,并构建非常小的游戏。 在那个游戏中,我将拥有一个拥有棋盘的大对象(类) 我希望这个对象创建 NUMBER 或 PlayerClass 对象,每个对象都将成为该板对象中的一个对象,我不知道会有多少(玩家) 我想知道我可以有对象数组吗? 我编写了这段代码来显示我在寻找什么:

class PlayerClass{
public:
...
private:
    int myLocation[2];
    bool isPlayer=false;
};


class game{
public:
    void MakePlayers(int numberOfPlayers){
        PlayerClass players[numberOfPlayers];
        playerObject=players;
        Number=numberOfPlayers;
    }
private:
    PlayerClass *playerObject
    int Number;
}

【问题讨论】:

    标签: c++ class


    【解决方案1】:

    我赞扬您尝试自学 C++ 的主动性。它不是最容易学习的语言,但是一旦你理解它就会非常强大。

    第一条评论:你想拥有多个PlayerClass 对象。实现这一目标的一种方法是拥有一个指向动态分配的玩家数组的PlayerClass* 成员变量,这似乎就是您想要的。但这需要大量的手动内存管理,即使您熟悉该语言,也很难做到这一点。我建议改用std::vector(确保#include <vector>):

    class game
    {
       // ...
    private:
       std::vector<PlayerClass> m_players; // instead of PlayerClass*
       // no more need for int Number
    };
    

    然后你的构造函数可以像这样初始化它:

    void MakePlayers(int numberOfPlayers)
        : m_players(numberOfPlayers)
    {
    }
    // if you're being rigorous, you'll want to either change numberOfPlayers to
    // an unsigned type or ensure it is nonnegative before using it
    

    vector 支持 [] 运算符,其语义与常规数组相同,因此您仍然可以访问单个玩家(例如)m_players[3]。此外,vector 知道它包含多少元素(size() 成员函数),因此不再需要单独跟踪玩家数量。

    祝你好运!

    更新:您的一位 cmets 说您是从 C 开始使用 C++,所以也许手动内存管理对您来说并不陌生 ;)。尽管如此,正如 Stephane Rolland 指出的那样,由于标准库中的有用类,在现代 C++ 中几乎从来不需要它。如果您发现自己出于习惯想要这样做,请务必先考虑是否真的有必要。

    【讨论】:

    • 也许你更清楚地说明避免使用指针(在可能的情况下,并且通常是可能的)在现代 c++ 中是很好的做法。
    • 好的,首先对我来说是一个很大的飞跃,看到这个向量,我现在将阅读它说,我应该把“std::vector m_players;”放在哪里?其次,我是如何得到 size() 的?应该是“m_players.size()”吗?谢谢!!!
    • @JohnnyF 我的建议是将m_players 的声明代替您现在拥有的PlayerClass *playerObjectm_ 前缀是可选的;这只是一些人用于成员变量的约定)。是的,m_players.size() 将是事后获取玩家数量的方法。
    【解决方案2】:

    您应该为此使用std::vector

    class game {
        std::vector<PlayerClass> players_;
    
      public:
        game (std::size_t NumPlayers) : players_ (NumPlayers) {}
    }
    

    【讨论】:

    • 嗨,首先谢谢你的时间,但作为一个刚从 c 来的人,我不知道那里写了什么或它做了什么......
    • learn std::vector,它是用于数组的 c++ 工具。它与 c 样式数组类似,但使用起来更简单、更简洁。
    • @JohnnyF but as someone who just came from c i have noo ideaaa what is writen there or what it does 这意味着无论您了解多少 C,C++ 都是另一种语言。您在那里看到的是基本的 C++。另外,由于您来自“C”,我推荐Accelerated C++,以便您真正了解 C++,而不是从“C”编码实践开始的“传统”方法。
    • @JohnyF std::size_t 是容器长度的类型,我认为它相当于 unsigned long,std::vector 是一个模板,它在 PlayerClass 类型上实例化,它在编译时创建一个 std::vector 类型,它是包含多个 PlayerClass 类型对象的标准方式。存在其他容器模板。
    【解决方案3】:

    是的,你可以,但是你的MakePlayers函数有错误,应该是

    void MakePlayers(int numberOfPlayers){
    
            playerObject= new (PlayerClass*)[numberOfPlayers];
            Number = numberOfPlayers;
    
            for (int i = 0; i++; i < numberOfPlayers)
            {
                playerObject[i] = new PlayerClass();
            }
        }
    

    此外,您需要在类析构函数中释放 playerObject 以避免内存泄漏。另一个建议,请先了解什么是指针。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-01
      • 2013-09-16
      • 2011-12-09
      • 2021-11-30
      • 1970-01-01
      • 2020-08-07
      相关资源
      最近更新 更多