2017-02-18 3 views
0

Я реализую bptree с помощью C++. Я застрял на начальном этапе создания узла. Продолжайте получать «C2011« Узел »: ошибка переопределения типа« класс ». Я нашел несколько предложений в Интернете, чтобы удалить ключевое слово класса из файла cpp. Но когда я удаляю ключевое слово класса, я получаю много других ошибок. вот мой код node.cpp:C2011 'Node': переопределение типа 'class'

#include "Node.h" 
#include <cstdio> 
#include <iostream> 
#include <string> 
#include <map> 


using namespace std; 


class Node { 
    bool leaf; 
    Node** kids; 
    map<int, string> value; 
    int keyCount;//number of current keys in the node 

    //constructor; 
    Node::Node(int order) { 
     this->value = {}; 
     this->kids = new Node *[order + 1]; 
     this->leaf = true; 
     this->keyCount = 0; 
     for (int i = 0; i < (order + 1); i++) { 
      this->kids[i] = NULL; 
     }   
    } 
}; 

и node.h файл выглядит следующим образом:

#pragma once 
#ifndef NODE_HEADER 
#define NODE_HEADER 

class Node { 

public: 
    Node(int order) {}; 
}; 

#endif 

Как я могу это исправить?

ответ

0

Проблема

В C++, заголовки просто вставляются в тело, когда вы #include. Так что теперь компилятор видит:

class Node { 

public: 
    Node(int order) {}; 
}; 

// stuff from system headers omitted for brevity 

using namespace std; 

class Node { 
    bool leaf; 
    //... 
}; 

Есть две проблемы:

  1. компилятор видит class Node дважды с различными органами.

  2. Node::Node определяется дважды (первый раз пустой {}).

Решение

Заголовок должен включать класс декларацию:

#include <map> 

using namespace std; 

class Node { 
    bool leaf; 
    Node** kids; 
    map<int, string> value; 
    int keyCount;//number of current keys in the node 

    //constructor; 
    Node(int order); 
}; 

Обратите внимание, что конструктор не имеет никакого тела здесь. Это просто декларация. Поскольку он использует map, вам необходимо включить <map> и добавить using namespace перед объявлением.

После этого не ставьте class Node еще раз в файл .cpp или .cc. Только поставьте реализации метода на верхнем уровне:

Node::Node(int order) { 
    // ... 
} 
+0

спасибо за ответ, но когда я удаляю классный узел, я получаю кучу ошибок. После удаления класса Node он не знает ни одного из параметров узла, таких как значение, дети и ect – user1836957

+0

Я обновил свой ответ, чтобы объяснить его лучше. – szym

+0

Спасибо, теперь, когда я сделал это, я получил ошибки в файле Node.h, который говорит: C2143 \t синтаксическая ошибка: отсутствует ';' before '<' \t C4430 \t отсутствующий спецификатор типа - int. Примечание: C++ не поддерживает default-int \t C2238 \t неожиданный токен (ы), предшествующий ';' хотя я включил #include и #include user1836957

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