2016-03-30 20 views
0

**問題が解決しました。私は間違って余分なヘッダーを作成していたようだが、私は彼を削除したので、それはうまくいった。 **クラスとヘッダーを理解しようとしています

私はクラスとヘッダーについて理解しようとしています。どのように連携させることができますか。 私はオンラインチュートリアルに従っていますが、私のコードで何か問題が起きているようです。 問題は、mainを実行しようとすると、 複数定義Cat::speak()と他のすべての機能がこのエラーになります。

main.cppに

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

int main() 
{ 
    Cat jim; 
    jim.makehappy(); 
    jim.speak(); 

    Cat george; 
    george.makesad(); 
    george.speak(); 

    return 0; 
} 

class.cpp

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

void Cat::speak() 
{ 
    if (happy) 
    { 
     cout << "meoww" << endl; 
    } 
    else 
    { 
     cout << "sssss" << endl; 
    } 
} 

void Cat::makehappy() 
{ 
    happy = true; 
} 

void Cat::makesad() 
{ 
    happy = false; 
} 

class.h

#ifndef CLASS_H_INCLUDED 
#define CLASS_H_INCLUDED 

class Cat 
{ 
private: 
    bool happy; 
public: 
    void makehappy(); 
    void makesad(); 
    void speak(); 
}; 

#endif // CLASS_H_INCLUDED 
+3

コードをどのようにコンパイルしていますか?むしろリンク中にclass.cppを2回以上使用するように見えます。 – marcinj

+0

ですが、 'error:multiple definition'はリンカーの問題を示していません。 – marcinj

+2

あなたのコードを試してみましたが、コンパイルやリンクのエラーはありませんでした。どうやって造っているの? –

答えて

1

はどのようにコードをコンパイルしていますか?特定の "class.o"ファイルと "main.o"ファイルを別々にリンクする前に別々にビルドしていることを確認する必要があります。以下は、Makefileの例です。

all: main 

main: main.o class.o 
    g++ main.o class.o -o main 

main.o: main.cpp class.h 
    g++ -c main.cpp 

class.o: class.cpp class.h 
    g++ -c class.cpp 

私はそれが問題だとは思わないので、ダブル封入ガードを使用しているようです。この回答を調べて、何が起こっているのかについてのより詳細な説明を確認してください。Error with multiple definitions of function

1

ここに示した内容は問題ありません。実際にいくつかの場所でこの関数を定義しているかどうかを調べるために一時的に解決する方法は、クラスを名前空間にラップすることです。

class.h

#ifndef CLASS_H_INCLUDED 
#define CLASS_H_INCLUDED 

namespace myNamespace { 

class Cat { 
private: 
    bool happy; 
public: 
    void makehappy(); 
    void makesad(); 
    void speak(); 
}; 

} // namespace myNamespace 

#endif // CLASS_H_INCLUDED 

class.pp

#include <iostream> 
#include "class.h" 

// using namespace std; // Don't Use - This is Bad Practice 
         // Can cause name clashing when trying to resolve name lookup 


namespace myNamespace { 

void Cat::speak() { 
    if (happy) { 
     std::cout << "meoww" << std::endl; 
    } else { 
     std::cout << "sssss" << std::endl; 
    } 
} 

void Cat::makehappy() { 
    happy = true; 
} 

void Cat::makesad() { 
    happy = false; 
} 

} // namespace myNamespace 

main.cppに

#include <iostream> 
#include "class.h" 
// using namespace std; // Again -Bad Practice 

int main() { 
    using namespace myNamespace;  

    Cat jim; 
    jim.makehappy(); 
    jim.speak(); 

    Cat george; 
    george.makesad(); 
    george.speak(); 

    return 0; 
} 

あなたがアーカンソーかどうかを確認するために、これを試してみてください同じコンパイルエラーが発生しました。これは、複数のスペースでこの関数を定義しているかどうかを確認するのに役立ちます。また、using namespace std;を削除し、スコープ解決演算子をstd::名前空間に使用するだけで、起こりうる問題や将来発生する可能性のある問題を取り除くのに役立ちます。

+0

私はそれを試しましたが、私は同じ問題に遭遇します。 – Georgez

+0

@Georgez hmm;ソリューションを清掃してみてください。すべての古いオブジェクトファイルを削除します。その後、再コンパイルして再構築します。 –

関連する問題