2011-02-10 12 views
0

私はC++を初めて使い、名前空間に関する助けが必要です。C++リンカエラー

node.h <--class interface 
node.cpp <--implementation 
testNodeFunctions.cpp 
testNodeMain.cpp 

//node.h 
--------------------------------- 
#include <iostream> 
using namespace std; 

namespace namespaceName{ 

    class Node { 
    private: 
     int data; 

    public: 
     void setData(int x); 
     int getData(); 

    }; 
    //and some more functions 

} 

//node.cpp 
------------------------------------- 
#include <iostream> 
#include "node.h" 
using namespace std; 

namespace namespaceName { 
     //provides implementation of the memeber functions 
    int Node::getData() const{ 
     return data; 
    } 
    void Node::setData(int x){ 
    data=x; 
    } 

}//namespace 


//testNodeFunctions.cpp 
------------------------------------- 
#include <iostream> 
#include "Node.h" 
using namespace std; 
using namespace namespaceName; 

void showData(){ 
    //creates a Node object and prints some stuff 
    Node a=37; 
    cout<<a.getValue()<<endl; 
} 


//testNodeMain.cpp 
---------------------------------------------- 
#include <iostream> 
#include "Node.h" 

void showData(); 

int main(){ 
//calls methods from testNodeFunctions 
showData(); 
} 

私は現在の名前空間を定義していた場合、私はわからない:以下の は私の4つのファイルです。

どのようにtestNodeMain.cppファイルからshowData()関数を呼び出しますか?現在、私は

わかりまし事前にそんなに

感謝している「未定義namespaceName ::ノードへの参照:: methodNameの」旨のリンカエラーを取得しています。意味がある。ヘッダーから名前空間stdを使って削除しました。 main()を持つtestNodeMain.cppをコンパイルしています。 TestNodeMain.cppはtestNodeFunctions.cppから関数を呼び出します。 testNodeFunctions.cppはNodeオブジェクトを作成します。

+7

ヘッダーファイルに 'using namespace ... 'を入れないでください。それでは、ヘッダーに '#include 'があるのはなぜですか? –

+0

関連するコードとビルドコマンドを表示してください。 2つの可能性があります:あなたのコード(表示していない)が間違っているか、ビルドコマンド(あなたが表示していない)が間違っています。ところで、ヘッダーのグローバル名前空間で 'namespace std;'を使用しないでください。これはEvilです。ヘッダに ''を含まないようにしてください(例えば、 ''を含む)。 –

+0

コンパイル方法に関する詳細を追加できますか? node.hヘッダーはインクルードしていますが、3つの.cxxファイルをまとめてコンパイルしていますか? – spbots

答えて

0

は、あなたのノードのように

void setData(int x); 
    int getData(); 

を持っています。cppのファイル、あなたが持っている:

int Node::getValue() const{ 
    return data; 
} 
void Node::setValue(int x){ 
data=x; 
} 

あなたがのためのヘッダファイルに関数名をごNode::getValue() const {}Node::getData() const {}に変更、またはint getValue()void setValue (int x)

にあなたのヘッダファイル内の関数の名前を変更する必要がありますクラスと実際の.cppファイルが同じである必要があります。

0

あなたの問題を引き起こす完全なコンパイル例がないと、実際には難しいですが、リンク行にnode.cppを含めるのを忘れたようです。

+0

申し訳ありませんが、私はC + +を初めて使いました。これは宿題の問題です。検索結果に表示されるので、ここにすべてのコードを掲載したくありません。 – sap

+0

したがって、node.hとnode.cppはnamespaceNameの内部にあります。 TestNodeFunctionsはNodeオブジェクトを作成し、Node.cppの関数を呼び出して関数を呼び出す関数calld showData()を作成します。そして最後にTestNodeMainがshowData()を呼び出します – sap

0

現在のところ名前空間を定義しているかどうかはわかりません。

あなたはあなたがその中に入れたものを見ることなく、私は確かに言うことはできませんが、それはうまく見えます。

どのようにしてtestNodeMain.cppファイルからshowData()関数を呼び出しますか?

が呼び出される前に、関数がと宣言されている必要があります。 testNodeMain.cppのいずれかで#include行の後、次の宣言を追加するか、またはそれからtestNodeMain.cppから含まれていなければならない別のヘッダファイルに:

int main() { 
    showData(); 
} 

void showData(); 

は、その後、あなたはmainから関数を呼び出すことができます

現在、「namespaceName :: Node :: methodnameへの未定義の参照」というリンカーエラーが発生しています

メインファイルだけでなく、すべてのソースファイルをコンパイルしてリンクしていることを確認する必要があります。あなたはまだそのような場合には、エラーを取得している場合は、あなたが実際にメソッドを実装していることを確認し、

gcc -o testNode testNodeMain.cpp testNodeFunctions.cpp node.cpp 

:あなたはGCCを使用している場合は、ビルドコマンドは次のようになります。あなたが持っていると思っている場合は、不足しているメソッドの実装をインクルードするために、質問のコードを更新してください。あなたのヘッダーファイルnode.hで

+0

あなたの返事をありがとう。私はコマンドラインを使わなければならないということは知らなかった。私はDev-C++ IDEを使用しています。そこからコマンドラインを使うには? – sap

+1

@ user491753:IDEを使用している場合は、コマンドラインを使用する必要はありません。すべてのソースファイルがプロジェクトに含まれていることを確認してください。私はそのIDEに精通していないので、私はそれを助けることはできません。 IDEがビルドしようとしたときに完全な出力を投稿すると、IDEがエラーメッセージ以上のものを提供する場合に役立ちます。 –

+0

ご協力いただきありがとうございます。私はちょうどファイルを含める必要がありました。どうすればこのフォーラムであなたの答えを受け入れることができますか? – sap