我想使用级别顺序遍历来构建树。当我在私有作用域中声明我的Queue对象时,我得到错误“field'q'具有不完整类型'Queue'。如果我在addTreeNode(int integer)函数中声明了一个Queue,我的程序有效,但是当我将它移动到头文件,我得到了新的错误。从我看到的内容看来,Tree类似乎不知道要为Queue对象分配多少内存。如何解决这个问题?
编辑:对于浏览此问题的任何人来说,问题与包含文件等无关。这里的问题是Tree有一个Queue实例,而Queue和Tree是朋友类,这意味着他们可以互相访问数据成员。这迫使一种循环的情况并且不知道c ++。我的问题的解决方案是使Queue成为模板类。这是主要课程:
#include <cstdlib>
#include "Tree.cpp"
using namespace std;
int main() {
Tree tree;
tree.addTreeNode(5);
return 0;
}
这是队列标题:
#pragma once
#include "tree.h"
class Queue {
friend class Tree;
private:
typedef struct node {
Tree::treePtr treeNode;
node* next;
}* nodePtr;
nodePtr head;
nodePtr current;
public: //This is where the functions go
Queue();
void push(Tree::treePtr t);
int pop();
void print();
};
这是Tree.h:
#pragma once
class Queue;
class Tree{
friend class Queue;
private:
Queue q;
typedef struct tree {
int data;
tree* left;
tree* right;
}* treePtr;
treePtr root;
int numNodes;
public:
Tree();
void addTreeNode(int integer);
};
这是tree.cpp
#include <cstdlib>
#include <iostream>
#include "Tree.h"
#include "Queue.cpp"
using namespace std;
Tree::Tree() {
root = NULL;
}
void Tree::addTreeNode(int integer) {
numNodes++;
treePtr t = new tree;
t->left = NULL;
t->right = NULL;
t->data = integer;
cout << "add root\n";
root = t;
q.push(t);
q.print();
}
答案 0 :(得分:2)
要在创建Tree
时实例化您的队列,编译器需要知道Queue
类在阅读Tree.h
时的样子。所以你需要添加
#include "Queue.h"
到Tree.h
,它将使开始阅读Queue
之前编译器可见完整的Tree
声明。