C++ 在C+中执行所有数组+;类必须动态分配,还是只分配它们的成员变量?

C++ 在C+中执行所有数组+;类必须动态分配,还是只分配它们的成员变量?,c++,arrays,multidimensional-array,new-operator,conways-game-of-life,C++,Arrays,Multidimensional Array,New Operator,Conways Game Of Life,为了完成一项任务,我不得不将康威《生活的游戏》的一些代码分成多个文件,但现在我正试图更深入地理解为什么代码是这样编写的。我有一个类,World,该类的部分构造函数如下所示: 世界卫生组织: class World { public: // Constructor/destructor World(); ~World(); void updateWorld(); ... private: char **m_grid_1;

为了完成一项任务,我不得不将康威《生活的游戏》的一些代码分成多个文件,但现在我正试图更深入地理解为什么代码是这样编写的。我有一个类,
World
,该类的部分构造函数如下所示:

世界卫生组织:

class World {
public:
    // Constructor/destructor
    World();
    ~World();
    
    void updateWorld();

    ...

private:    
    char **m_grid_1;
    char **m_grid_2;

    ...
};
world.cpp:

World::World()
{
    m_toggle = true;

    m_grid_1 = new char*[MAX_ROWS];
    m_grid_2 = new char*[MAX_ROWS];

    for (int i = 0; i < MAX_ROWS; i++) {
        m_grid_1[i] = new char[MAX_COLS];
        m_grid_2[i] = new char[MAX_COLS];
    }

    ...
}
< C++类中的所有数组都必须动态分配吗?< /P> 不一般

或者只是他们的成员变量

成员变量也不必动态分配

  • char**是什么意思。。。指向字符指针的指针
  • 它是指向char的指针

    这些成员是二维数组

    更正:这些成员是指针。它们使用指针,因此不是数组

  • 为什么new在这里与构造函数中的循环结合使用
  • 因为程序的作者选择了使用它

    你就不能说m_grid_1[MAX_ROWS][MAX_COLS]

    也许吧。如果
    MAX_行
    MAX_列
    是编译时常量,如果它们很小,则确定

    如果我想在成员函数updateWorld()中创建m_grid_1的本地副本,并使用该本地副本获取游戏的下一个状态,我是否需要使用new

    如果问题是你是否需要动态分配,那么也许。见上面的答案


    几乎不需要使用
    new
    。创建动态数组的一种更简单、更安全的方法是使用
    std::vector

    代码本身并不好。代码在C++环境中使用C样式数组。尝试更好地理解如何创建静态c样式数组以及与动态数组的区别。然后,您将了解为什么需要指针以及为什么您的方法不起作用。这可能会有所帮助。要理解阵列为什么需要动态分配或不需要动态分配还有很长的路要走,尽管您的答案中已经介绍了这一点got@RoQuOTriX我没有写这段代码的主要部分,我只是想理解它。@dylosaur是的,没关系,我想说的是,代码本身并不好,如果没有其他限制,我希望它不会通过代码审查。您的回答非常详细,回答了问题的各个方面。但是我认为答案对用户没有帮助,因为他缺少c/c++编程的基本概念
    std::array
    也是一个很好的选择,因为大小在编译时是已知的。问题是:结果数组有多大?如果足够小,就像你说的,不使用动态分配是可以的。@eerorika常量是硬编码的,这就是为什么我对动态分配感到困惑的部分原因。在本例中,MAX_ROWS和MAX_COLS仅为20,但我可以将它们更改为任何值。对于较大规模的电网,动态分配会更好吗?此外,我喜欢向量,但这只是作业的一部分,我想尝试将其紧密匹配,并了解为什么它是这样写的。
    void World::updateWorld() {
        char grid_copy[MAX_ROWS][MAX_COLS];
    
        for (int i = 0; i < MAX_ROWS; i++) {
            for (int j = 0; j < MAX_COLS; j++) {
                grid_copy[i][j] = m_grid_1[i][j];
            }
        }
      
      // loop over grid_copy to find next state of m_grid_1
      
    }