【问题标题】:Needing an elegant solution to a simple, C++ bingo board需要一个简单的 C++ 宾果板的优雅解决方案
【发布时间】:2011-09-24 04:27:26
【问题描述】:

我正在尝试用 C++ 编写 Bingo Board,但我做错了。我不确定是什么,但无论出于何种原因,当我初始化行数和列数并在我创建的数组上执行嵌套 for 循环以实现此结构时,我得到的结果似乎超过 100 行和 30 + 专栏,当我应该得到一个五个,由五个板。我也在尝试为我的 rand 函数指定最大值和最小值,但似乎没有办法做到这一点。因此,在不放弃解决方案的情况下实现这一目标的最佳方法是什么?我之所以提到最后一点,是为了让我可以学习如何做到这一点,哈哈。

这是我的代码:

#ifndef BOARD_H
#define BOARD_H
#include <cstdlib>
#include <time.h>
#include <stdio.h>

class Board
{
public:
    Board(unsigned int numberOfRows, unsigned int numberOfColumns, unsigned int seed, unsigned int max, unsigned int min);
    void generate();
        void setSeedValue(int seed);

private:
   unsigned int m_rows[];
   unsigned int m_columns[];
   unsigned int m_max, m_min;
};

#endif // BOARD_H

    Board::Board(unsigned int numberOfRows, unsigned int numberOfColumns, unsigned int seed, unsigned int max, unsigned int min)
{
    this->m_rows[numberOfRows];
    this->m_columns[numberOfColumns];
    srand(seed);
    this->m_max = max;
    this->m_min = min;
    printf("%d\n", size_t(m_rows));
    printf("%d\n", size_t(m_columns));
}

void Board::generate()
{
    for (int i = 0; i < size_t(m_rows); i++)
    {
        for(int j = 0; j < size_t(m_columns); j++)
        {
            this->m_columns[j] = (rand() % 10) + j;

            std::cout << this->m_columns[j];
        }
    }
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    Board * board = new Board(5, 5, time(NULL), 100, 1);

    board->generate();

    delete board;

    return a.exec();
}

【问题讨论】:

  • Board 的构造函数在哪里定义?
  • 已更新。现已添加构造定义。
  • 这是怎么编译的?
  • 它没有。除了我正在解决的问题之外,还有其他问题,尽管大多数问题已经得到解决。

标签: c++ arrays memory-management


【解决方案1】:

为了创建您想要的二维板,在运行时输入尺寸,您将不得不在内存中实际动态分配一块板......您不能以您的方式声明您的板'已经在您的班级中作为零长度数组完成。

这样的代码:

this->m_rows[numberOfRows];

不会初始化您的数组大小...而是实际上尝试访问从m_rows开始的偏移量处分配的内存...这可能导致分段错误或由于访问超出范围的内存而导致的其他未定义行为类/结构类型的结尾。

由于您使用的是 C++,因此使用 STL 的 std::vector 容器创建您的板类会更好。您的 Board 类将如下所示:

class Board
{
    public:
        Board(unsigned int numberOfRows, unsigned int numberOfColumns, 
              unsigned int seed, unsigned int max, unsigned int min);

        void generate();
        void setSeedValue(int seed);

    private:
       vector<vector<unsigned int> > board; //use the STL vector container
       unsigned int m_max, m_min;
};

然后在您的构造函数中,您将实际分配您的板将占用的必要内存(通过 STL 的向量容器):

Board::Board(unsigned int numberOfRows, unsigned int numberOfColumns, 
             unsigned int seed, unsigned int max, unsigned int min)
{
    for (int i=0; i < numberOfRows; i++)
    {
        this->board.push_back(vector<unsigned int>(numberOfColumns, 0));
    }

    srand(seed);
    this->m_max = max;
    this->m_min = min;
    printf("%d\n", size_t(m_rows));
    printf("%d\n", size_t(m_columns));
}

最后,您的 Board::generate 函数现在看起来如下所示:

void Board::generate()
{
    for (int i = 0; i < this->board.size(); i++)
    {
        for(int j = 0; j < this->board[i].size(); j++)
        {
            this->board[i][j] = (rand() % 10) + j;

            std::cout << this->board[i][j];
        }
    }
}

【讨论】:

  • 感谢您的帮助。这似乎是一个很好的解决方案,但我看到的唯一我不明白的是这一行:“this->board.push_back(vector(numberOfColumns, 0));”我看不出这个论点是如何工作的,至少在 vector (和一个与之配套的函数???)在那里传递时。是静态的吗?
  • 我们调用std::vector&lt;vector&lt;unsigned int&gt; &gt;::push_back ...这要求我们传入std::vector&lt;unsigned int&gt;的类型。语法std::vector&lt;unsigned int&gt;(numberOfColumns, 0) 调用std::vector 的构造函数,并传入要在向量容器中创建的槽数以及将这些槽初始化为什么值的参数。因此,我们正在为复制到行中的列生成一个临时向量对象。初始化插槽后,您可以通过 operator[] 语法访问它们,这就是我在 Board::generate 函数中所做的。
【解决方案2】:

让您的板类将行大小和列大小存储为成员变量。使用这些成员变量作为成员函数 generate() 中 for 循环的上限。此外,使用 2D 数组而不是 1D 数组,因为这更好地代表了宾果棋盘的结构。目前,您在 for 循环中对临时 size_t 的初始化不正确。数组名称充当指向数组第一个元素的指针——因此您创建的变量不会为您提供数组的长度。您必须将数组的长度与数组本身分开存储(或使用 boost::array)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-31
    • 2017-12-07
    • 1970-01-01
    • 2023-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多