2017-12-19 3 views
-1

私は、このようなリンクされた2つの異なるcppファイルにcppファイルを含めるにはどうすればいいですか?

//blah.cpp 
int blah() 
{ 
    return 1; 
} 

としてCPP単純なファイルを持っており、一方が他方を継承したファイルの2セットがあると仮定。

ああ:またBHとを含む

#ifndef B_H 
#define B_H 

#include "a.h" 

class ChildBlah : public Blah 
{ 
public: 
     ChildBlah(int var, int childvar); 
     int callingblah(); 

private: 
     int childvar; 
}; 

#endif 

b.cppメイン方法

を有する:ああああを継承

//a.cpp 
#include "blah.cpp" 
#include "a.h" 

Blah::Blah(int var) : myvar(var) {} 

int Blah::callingblah() 
{ 
    blah(); 
    return 2; 
} 

BHを含む

//a.h 
#ifndef A_H 
#define A_H 

class Blah 
{ 
public: 
    Blah(int var); 
    int callingblah(); 

private: 
    int myvar; 
}; 

#endif 

a.cpp

//b.cpp 
#include "blah.cpp" 
#include "b.h" 

ChildBlah::ChildBlah(int var, int childvar) : Blah(var), mychildvar(childvar) {} 

int ChildBlah::callingblah() 
{ 
    blah(); 
    return 3; 
}; 

int main() 
{ 
    Blah myBlah(1); 
    ChildBlah myChild(1,2); 
    cout << myBlah.callingblah(); 
    cout << myChild.callingblah(); 
} 

そして、私が使用してコンパイル:

g++ a.cpp b.cpp blah.cpp 

ここでの問題は、私は複数の場所にblah.cppが含まれているので、私は「複数の定義」エラーが出るということです。

しかし、blah.cppを含めることはできません。なぜなら、「宣言されていません」というエラーが表示されるからです。

私は意図的に教育と経験のためにblah.hを作っていません。 cppをインクルードし、ヘッダーを持たないようにするシナリオがいくつかあります。

blah.cppのヘッダーファイルを作成せずにこれを解決するにはどうすればよいですか?

+6

* .cppファイルを#includeしないでください。 – Eljay

+0

[定義されていない参照/未解決の外部シンボルエラーとは何ですか?また修正するにはどうすればいいですか?](https://stackoverflow.com/questions/12573816/what-is-an-undefined-reference-unresolved-external-シンボルエラーとハウツーi-fix) – user0042

+0

_ @ marumaru_ホールド!あなたが尋ねているのと同じ質問がないので、私の重複した提案を否定しないでください。すべての答えはあなたの特定の問題を解決するためのものです。 '#include'ヘッダファイルとリンク翻訳単位 – user0042

答えて

3

他のCPPファイルにCPPファイルを含めないでください。代わりに、ヘッダーを作成して代わりにインクルードします。あなたのケースでは、ヘッダは、非常に短いのようになります。

blah.h:

int blah(); 

"blah.h""blah.cpp"を交換し、コードにあなたがそれを動作させるために行った方法をコンパイルします。

+0

今、何らかの理由でヘッダファイルを必要としない場合はどうすればいいですか? – marumaru

+0

@marumaru同じ前方宣言(つまり 'int blah();')を両方のファイルに書くことができます。ヘッダー。 – dasblinkenlight

+1

@marumaru - もしあなたが "何らかの理由でヘッダファイルを必要としない"なら、あなたは言語の構造と戦っています。あなたはその戦いを失うでしょう。

0

blah.cppを含めると、b.hにも含まれています。 b.ha.hを継承しているため、すべてのa.hインクルードファイルが継承されます。

   a.h <--- //here you include blah.h(never .cpp) 
      / \ 
     / \ 
     a.cpp b.h 
        \ 
        b.cpp 

のでblah.hからの方法は、あなたがa fileb fileで、今それを使用することができます。 mainにはa.hが含まれています。十分です。

関連する問題