2017-02-18 13 views
2

私はb ++をC++で開発しようと考えています。私はC + +プログラミングで非常に新しいです、そして、私は彼らが何であるか分からないこのエラーを得ました。 Node.hLNK2005とLNK1169でC++エラー

#ifndef NODE_HEADER 
#define NODE_HEADER 
#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 
public: 
    Node(int order); 
    void printNodeContent(Node* node); 
    friend class BpTree; 
}; 
#endif 

Node.cpp

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


    //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; 
     }   
    } 

    void Node::printNodeContent(Node* node) { 
     map<int,string> values = node->value; 
     for (auto pval : values) { 
      cout << pval.first << "," ; 
     } 
     cout << endl; 
    } 

    void main() { 
    } 

BpTree.h

#ifndef BPTREE_HEADER 
#define BPTREE_HEADER 
#include "Node.cpp" 

class BpTree 
{ 
    Node *root; 
    Node *np; 
    Node *x; 

public: 
    int order; 
    BpTree(); 
    ~BpTree(); 
    BpTree(int ord); 
    int getOrder(); 
    Node* getRoot(); 
    bool insert(int key, string value); 

}; 
#endif 

BpTree.cpp

enter image description here

は、私は4つのファイルを持っています

私はここで何が欠けているのですか?私は.hファイルまたは.cppファイルを一度だけインクルードしようとしました。しかし、まだこのエラーが発生します。いずれかの人にこれを修正する方法に関する提案があれば、本当に感謝しています。

+2

Node.cppを含むNode.hをBpTree.hファイルに含めないでください。 – Rob

答えて

2

BpTree.hにはNode.cppが含まれています。これは、そのファイルからすべてのシンボルをBpTree.hをインクルードしたファイルにプルしています。

リンクすると、Node.objとBpTree.objをリンクすると、現在のように重複シンボルエラーが発生します。

一般的なルールでは、#cppファイルは絶対に#includeしないようにします。ヘッダーファイルのみを#includeします。これにより、問題が解決されます。

+0

私はこの質問の人と同じ問題を抱えていましたが、コードはGlobal.hのものですが、問題は私のmain.objを指しています。 Global.hは問題を引き起こしていますが、なぜ私は考えていませんか? .cppファイルはありません –

+0

ファイルの拡張子はここでは無関係です。 Global.hがシンボルを定義していて、複数のファイルにGlobal.hが含まれている場合、それらのファイルにはそのシンボル定義が含まれます。 – Caleb

関連する問題