2012-05-05 4 views
1

Это заголовочный файл для моего двоичного дерева. У меня есть класс, называемый TreeNode, и, конечно, класс BinaryTree имеет указатель на его корень.ошибка C2143: синтаксическая ошибка: отсутствует ';' перед '*' при объявлении указателя

И я получил следующие три ошибки

error C2143: syntax error : missing ';' before '*' 
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 

и код для заголовка файла BinaryTree появляется

#pragma once 

#include <fstream> 
#include <iostream> 
#include "Node.h" 
using namespace std; 

class BinaryTreeStorage 
{ 
private: 
    TreeNode* root; 

public: 
    //Constructor 
    BinaryTreeStorage(void); 

    //Gang Of Three 
    ~BinaryTreeStorage(void); 
    BinaryTreeStorage(const BinaryTreeStorage & newBinaryTreeStorage); 
    BinaryTreeStorage& operator=(const BinaryTreeStorage & rhs); 

    //Reading and writing 
    ofstream& write(ofstream& fout); 
    ifstream& read(ifstream& fin); 

}; 

//Streaming 
ofstream& operator<<(ofstream& fout, const BinaryTreeStorage& rhs); 
ifstream& operator>>(ifstream& fin, const BinaryTreeStorage& rhs); 

ошибки быть в строке 11

TreeNode* root; 

я провел несколько дней, пытаясь избавиться от этой ошибки и полностью опустошить.

Является ли эта ошибка неправильным пространством имен? Или, может быть, класс TreeNode не объявлен правильно?

И только в случае, если код для заголовка файла TreeNode

#pragma once 
#include <string> 
#include "BinaryTreeStorage.h" 

using namespace std; 

class TreeNode 
{ 
private: 
    string name; 
    TreeNode* left; 
    TreeNode* right; 

public: 
    //Constructor 
    TreeNode(void); 
    TreeNode(string data); 

    //Gang of Three 
    ~TreeNode(void); 
    TreeNode(const TreeNode* copyTreeNode); 


    //Reading and writing 
    ofstream& write(ofstream& fout); 

    //Add TreeNode 
    void addTreeNode(string data); 

    //Copy tree 
    void copy(TreeNode* root); 
}; 

Спасибо заранее.

+0

Спасибо всем за ответ на вопрос, это было действительно глупо. Вот что происходит, если вы программируете C# до C++. –

ответ

3

Вместо

#include "Node.h" 

просто вперед объявить класс:

class TreeNode; 

Кроме того, почему вы в том числе BinaryTreeStorage.h в Node.h? В этом нет необходимости, поэтому удалите его.

0

Вы используете ofstream в определении TreeNode класса, но вы не включили его:

#include <fstream> //include this in Node.h 

Пожалуйста, сделайте это.

Кроме того, нет необходимости включать BinaryTreeStorage.h в Node.h. Это делает вещь круговой.

0

вперед объявить TreeNode т.е. добавить class TreeNode; перед тем class BinaryTreeStorage{};

3

Похоже node.h в том числе BinaryTreeStorage.h, поэтому при попытке компиляции node.h (класс TreeNode) это первый компилирует BinaryTreeStorage, но требует знания того, что TreeNode еще не скомпилирован.

Обойти это направить объявить класс:

class TreeNode; 

который сообщает компилятор ожидать класс типа TreeNode быть определен позже, но вы можете объявить указатели и ссылки этого типа в тем временем. Последнее, что нужно сделать, - это удалить #include "Node.h". Это нарушает вашу циркулярную ссылку.

+0

TY для понимания круговых ссылок, это помогло решить мою проблему! +1 – teejay

Смежные вопросы