Когда я запускаю этот код, я получаю сообщение об ошибке: «Поле« children »имеет неполный тип« Node [0] »». Я пишу на C ++ и хочу создать класс Node, который создает в себе два других объекта Node и так далее, пока не достигнет maxDepth. Полная ошибка, которую я получаю:
18:24:16 **** Incremental Build of configuration Debug for project Tests ****
make all
Building file: ../main.cpp
Invoking: Cross G++ Compiler
g++ -std=c++0x -O3 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"main.d" -MT"main.d" -o "main.o" "../main.cpp"../main.cpp:22:17: error: field ‘children’ has incomplete type ‘Node [2]’
Node children[2];
^
../main.cpp:8:7: note: definition of ‘class Node’ is not complete until the closing brace
class Node {
^
make: *** [main.o] Error 1
subdir.mk:18: recipe for target 'main.o' failed
И код:
#include <iostream>using namespace std;class Node {
public:
int depth;
bool value;
Node(bool value, int depth, int maxDepth) {
this->value = value;
this->depth = depth;
if (this->depth < maxDepth) {
children[2] = {Node(false, this->depth + 1, maxDepth), Node(true, this->depth + 1, maxDepth)};
}
}
private:
Node children[2];
};int main() {
Node tree(false, 0, 1);return 0;
}
Реальная проблема заключается в том, что «Node» не определен в то время, когда «Node children [2]»; встречается компилятором. Вы можете иметь указатель на него, но не можете иметь его экземпляр до тех пор, пока он не будет полностью определен (при достижении закрывающего «}»).
Вы определили класс Node
содержать массив Node
объекты:
private:
Node children[2];
Node
не может содержать другое Node
потому что он должен иметь фиксированный размер, достаточно большой, чтобы содержать его членов. Это Можно содержат указатели на других Node
объекты, и это, вероятно, то, что вы должны использовать в этом случае:
private:
Node *children[2];
Это означает, что вы должны переписать свое назначение на children
массив (который в любом случае неверен), так что он присваивает значения типа Node *
:
// Incorrect:
// children[2] = {Node(false, this->depth + 1, maxDepth), Node(true, this->depth + 1, maxDepth)};
children[0] = new Node(false, this->depth + 1, maxDepth);
children[1] = new Node(true, this->depth + 1, maxDepth);