【发布时间】:2020-04-19 21:55:12
【问题描述】:
我正在尝试创建一个具有递归结构的类,例如 Matrioska 娃娃,以便更清晰。 像这样 一个类包含 8 个 A 类型的子级。 我正在使用这个问题中指出的指针: Can a c++ class include itself as an member?
我为每个类实例分配一个索引值,以跟踪该类相对于父类的下降程度。
这是我的代码:
Tester.h
#pragma once
const unsigned int MAX_RECURSION = 3;
struct Tester
{
Tester* Children[2][2][2];
unsigned int Index;
Tester(unsigned int index) : Index(index), Children()
{
std::cout << std::string(index, '-') << "(" << index << ")" << std::endl;
if (index < MAX_RECURSION) {
for (int x = 0; x < 2; x++) {
for (int y = 0; y < 2; y++) {
for (int z = 0; z < 2; z++) {
this->Children[x][y][z] = &Tester(index + 1);;
}
}
}
}
}
void Walk(int& tr)
{
if (this->Index < MAX_RECURSION) {
for (int x = 0; x < 2; x++) {
for (int y = 0; y < 2; y++) {
for (int z = 0; z < 2; z++) {
tr++;
(this->Children[x][y][z])->Walk(tr);
}
}
}
}
}
};
Main.cpp:
#include "Tester.h"
#include <iostream>
int main() {
int c = 0;
Tester t(1);
t.Walk(c);
return 0;
}
值 c 保存函数 Tester::Walk 运行的次数。
通过运行此代码,所有类都会正确创建,您可以在输出日志中看到:
-(1)
--(2)
---(3)
---(3)
---(3)
---(3)
---(3)
---(3)
---(3)
---(3)
--(2)
---(3)
---(3)
---(3)
---(3)
---(3)
---(3)
---(3)
---(3)
--(2)
---(3)
---(3)
---(3)
---(3)
---(3)
---(3)
---(3)
---(3)
--(2)
---(3)
---(3)
---(3)
---(3)
---(3)
---(3)
---(3)
---(3)
--(2)
---(3)
---(3)
---(3)
---(3)
---(3)
---(3)
---(3)
---(3)
--(2)
---(3)
---(3)
---(3)
---(3)
---(3)
---(3)
---(3)
---(3)
--(2)
---(3)
---(3)
---(3)
---(3)
---(3)
---(3)
---(3)
---(3)
--(2)
---(3)
---(3)
---(3)
---(3)
---(3)
---(3)
---(3)
---(3)
索引为 3 的类确实被创建了 8*8 次,所以 64。(每次递归 8)。
但是当我尝试将Walk 向下移动t 的Children 变量时,walk 函数只运行了8 次。通过调试,我后来发现只有前 8 个 Tester 类(main.cpp 中 t 类中的第一个)具有正确的索引,因为其他的具有 3435973836 的索引。我最初认为递归创建有问题,但日志显示索引正常工作(打印了 1 次、2 8 次和 3 64 次)。
是什么导致了这种行为?
【问题讨论】:
-
@user4581301 我该如何解决这个问题?