C++循环结构问题

C++ Circular Construction Issue

本文关键字:问题 结构 循环 C++      更新时间:2023-10-16

我在赋值时遇到问题。我有一门课叫"网格与记录"。记录是网格,用于存储网格中每个位置被访问的次数。网格必须包含记录类型的数据成员,只要对网格进行更改,就可以存储该数据成员。我已经设法避免了循环依赖性,但我似乎对导致堆栈溢出的"循环构造"有问题。调用Grid构造函数会生成一个Record,它会创建一个Grid,并尝试生成另一个Record等等。我的第一个想法是让Grid的Record数据成员成为一个指针,我将其初始化为NULL,然后在构造函数之外实际创建Record对象,但是赋值特别指出Grid的Record的数据成员必须是Record类型,而不是指向Record的指针。我也不允许给Record一个默认的构造函数,所以我猜我的实现是错误的。关于如何解决这个问题,有什么建议吗?

Record::Record(int rows, int cols) : grid(new Grid(rows, cols)) {};
Grid::Grid(int rows, int cols) : record(new Record(rows, cols)) {};

我认为作业中存在误解,或者写得不好。

看来你想要的是:

Grid
+---+---+-
| a | b |
+---+---+-
| c | d |
+---+---+-
Record
+---+---+-
| 0 | 1 |
+---+---+-
| 2 | 2 |
+---+---+-

这表示a还没有被访问,并且d已经被访问了两次。

现在,如果Grid应该包含Record来维护其统计信息,那么Record就不能是Grid。正如你所注意到的,它是圆形的。然而,Record是一个网格。所以我怀疑这里存在拼写错误/阅读问题。

我的建议:

class Record {
public:
  Record(size_t rows, size_t cols): rows(rows), cols(cols), grid(rows*cols, 0) {}
private:
  size_t rows;
  size_t cols;
  std::vector<size_t> grid;
};

template <typename E>
class Grid {
public:
  Grid(size_t rows, size_t cols): grid(rows*cols, 0), record(rows, cols) {}
private:
  std::vector<E> grid;
  Record record;
};

为什么不让Record有一个实际执行录制的虚拟函数,然后让Grid只是Record的一种类型,然后覆盖录制函数。类似于:

class Record
{
  virtual recordSomething();
}
class Grid : Record
{
  virtual recordSomething();
}

我不知道我是否对你的问题足够了解,但我认为这应该会有所帮助。祝你好运

我不知道你要使用什么类型的设计结构,但这里有一个解决问题的方法。与其创建一个新的东西,只需让"内部"的构造函数将指针指向"外部"(稍后描述)。

所以,这将是

Record::Record(int rows, int cols) : grid(new Grid(rows, cols,this) {}; //outer
Grid::Grid(Record* master) : record(master) {}; //inner

"外部"类是用户应该使用的类。

"内部"类是出于实现原因(或迭代器和继承等原因)而拥有的类。

交换构造函数,以便遵循上面的样式。用户永远不应该做:Grid f(new Record(rows,cols));

请注意,这几乎是java中内部类的一个非常粗略的近似值。