2017-02-18 46 views
0

我正在使用C++實現bptree。我被困在節點創建的第一步。繼續收到「C2011'節點':'class'type redefinition」錯誤。我在網上發現了一些建議,從cpp文件中刪除類關鍵字。但是當我刪除class關鍵字時,我得到很多其他錯誤。這裏是我的代碼爲Node.cpp:C2011'Node':'class'type redefinition

#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

感謝您的回覆,但是當我刪除類節點時,我得到了一堆錯誤。刪除類節點它不知道任何節點的參數,如價值,孩子和ect – user1836957

+0

我更新了我的答案,以更好地解釋它。 – szym

+0

謝謝,現在我做到了這一點,我在Node.h文件中出現錯誤:C2143 \t語法錯誤:缺少';'之前'<'\t C4430 \t缺少類型說明符 - 假定爲int。注意:C++不支持在';'之前的意外令牌(s)的default-int \t C2238 \t即使我已經包含#include 和#include user1836957

相關問題