首页 > 解决方案 > 如何用随机字符填充二维数组?在 C++ 中使用类

问题描述

我正在为学校做一个单词搜索拼图,我面临的问题如下。

我正在尝试用随机字符填充二维数组,这并不难,但是当你引入类和指针时......它会变得混乱。所以我有一个名为 Char 的类,它的功能是生成随机字符以存储在 Board 类中的二维数组中。

class Char
{
private:

    char Letters;

public:

    Char();
    Char(char let);
    ~Char();

    void Set_Letters(char let) { Letters = let; }
    char Get_Letters(void) { return Letters; }

    void Random(void);
    void View(void);
};

class Board
{

private:

    int BoardWidth;
    int BoardHeight;
    int numWords;
    Char** Caracters;

    Point P; //This is ponting to an other class called Point, it keeps track of the location of the Words that were read from the txt file
public:

    Board(void);
    ~Board();

    void Init(int Dx, int Dy);

    inline void Set_BoardWidth(int bW) { BoardWidth = bW; }
    inline void Set_Boardheight(int bH) { BoardHeight = bH; }
};

所以这些是重要的课程。在 Board 类中,我用来存储二维数组的变量是 Char**,我什至不知道这是否是正确的方法。这些是 Char 类中函数背后的相关代码:

void Char::Random()
{

    //The unsigned int is used to silence the error : "Possible loss of data"
    srand((unsigned int)time(NULL));
    Set_Letters('A' + (rand() % 26));
}

这会创建随机字符,这是应该将字符保存在二维数组中的部分。

void Board::Init(int Dx, int Dy)
{

    Set_BoardWidth(Dx);
    Set_Boardheight(Dy);

    Char Letter;
    int n = 0, m = 0;

    for (int j = 0; j < Dy; j++)
    {
        for (int i = 0; i < Dx; i++)
        {
            //Fill the array with random char´s
            Letter.Random();
            **Caracters = Letter.Get_Letters();
            //In this part im attributing a x and y value to the char
            P.Set_x(n); P.Set_y(m);
            n++; m++;
        }
    }
}

它给我的错误是:

“抛出异常:读取访问冲突。 this->Caracters was nullptr”。

我试图在 Board 类中创建一个字符串来存储它,但它似乎不起作用,由于某种原因,当我使用它时,该类甚至无法识别该变量。也尝试使用char**,给了我同样的错误。

就是这样,没有尝试过其他任何东西。看了一段视频后,它给了我使用矢量的想法,但我还没有尝试过。

上个学期我刚学完 C,我觉得我还是太沉迷了。而且我很难将它们分开。因此,如果您对我如何变得更好以及我可以改进的地方有任何提示,以及我编写代码的方式,请告诉我。

标签: c++arraysclasspointers

解决方案


我创建了一些示例代码来展示一种可以使用更现代的 C++ 库来完成的方法。rand()不推荐,因为它只是不太擅长它的工作,并且使用模算术来强制范围也会扭曲结果。

#include <iostream>
#include <random>

class Board {
 public:
  explicit Board(int rows, int columns)
      : m_rows(rows), m_columns(columns), m_board(rows * columns, '0') {
    for (auto& i : m_board) {
      i = capital(prng);
    }
  }
  void print() const {
    for (int i = 0; i < m_rows; ++i) {
      for (int j = 0; j < m_columns; ++j) {
        std::cout << m_board[i * m_columns + j] << ' ';
      }
      std::cout << '\n';
    }
  }

 private:
  int m_rows = 0;
  int m_columns = 0;
  std::vector<char> m_board = {};

  static std::random_device rd;
  static std::mt19937 prng;
  static std::uniform_int_distribution<char> capital;
};

std::random_device Board::rd;
std::mt19937 Board::prng(Board::rd());
std::uniform_int_distribution<char> Board::capital('A', 'Z');

int main() {
  Board board(5, 5);
  board.print();
}

我摆脱了角色类;这是没有必要的。我们将使用向量而不是数组。总的来说,它们通常更好用。请注意,它是一维的。这比向量的向量执行得更好。我们的Board课程将使用一些算术技巧来假装它是二维的。您可以在打印功能中看到它是如何工作的。

我在类中包含了随机数生成器工具作为静态成员。那是您的代码的另一个问题;每次调用该Random()函数时,您都在重新播种。你只播种一次。static在 C++ 类中意味着该类型的所有对象共享静态成员。

static成员必须在类之外初始化,除非它们是inline static并且您正在使用 C++17 或更高版本进行编译。我让构造函数用随机字母填充板子。这是 C++ 在可能的情况下做事的方式。您的Init()函数在构造函数的工作上做得很差。

此外,我不再自己管理动态资源。还有很多需要进入这个类,比如迭代器和可能operator[],但显示的代码解决了您当前的问题。


推荐阅读