如何修复不完整类型错误c ++?

时间:2015-11-11 15:06:08

标签: c++ incomplete-type

我想使用级别顺序遍历来构建树。当我在私有作用域中声明我的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();

}

1 个答案:

答案 0 :(得分:2)

要在创建Tree时实例化您的队列,编译器需要知道Queue类在阅读Tree.h时的样子。所以你需要添加

#include "Queue.h"

Tree.h,它将使开始阅读Queue之前编译器可见完整的Tree声明。