【问题标题】:How can I fill a 2d array, with random caracters? Using classes in c++如何用随机字符填充二维数组?在 C++ 中使用类
【发布时间】:2020-08-07 02:53:20
【问题描述】:

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

我正在尝试用随机字符填充二维数组,这并不难,但是当你引入类和指针时......它会变得混乱。所以我有一个名为 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-&gt;Caracters was nullptr"。

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

仅此而已,没有尝试其他任何方法。看了一段视频后,它让我想到了使用矢量,但我还没有尝试过。

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

【问题讨论】:

  • 您从未在代码中分配任何内存。为什么一开始还要使用指针和手动动态内存分配?
  • 我并不惊讶你会感到困惑,生成随机字符的类是大量的矫枉过正。只需编写一个函数即可。并非所有事情都必须通过课程来完成。为工作使用正确的工具。
  • 我不知道,不知怎的,我认为它可能会起作用?
  • 问题是我们有一个要遵循的协议,我需要那个类。至少老师说它在那里。如果我不能解决这个问题,我很可能不得不走这条路

标签: c++ arrays class pointers


【解决方案1】:

我创建了一些示例代码来展示一种可以使用更现代的 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 类将使用一些算术技巧来假装它是二维的。你可以在 print 函数中看到它是如何工作的。

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

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

此外,我不再独自管理动态资源。在这个类中还有很多东西需要像迭代器,也许是operator[],但显示的代码解决了您当前的问题。

【讨论】:

  • 谢谢你,我会尽力使用你教给我的东西。谢谢你的时间,我真的很感激。你帮了很多忙。
猜你喜欢
  • 2012-08-21
  • 1970-01-01
  • 2012-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多