c++ - 如何用随机字符填充二维数组?在 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++ 库来完成的方法。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[]
,但显示的代码解决了您当前的问题。
推荐阅读
- javascript - 为什么在原始查询更新上未定义续集元数据?
- python - 字典中填充了相同的值
- javascript - 将自定义事件发送到 Google Analytics 并捕获该数据的正确方法是什么?
- python - 用于查找与输出的特征关系的神经网络模型
- linker - Q 在调试版本中使用发布库
- terminator - 几天后终结者 1.91 变慢了
- scala - 如何在由案例类列表组成的 DataSet 中表示空值
- reactjs - 不显示图像
- asp.net-mvc - 使用另一个站点的 ASP.NET 成员身份在一个站点上进行身份验证
- selenium - nightwatch 测试失败,依次出现多个点击事件