2012-03-23 12 views
0

大きなプログラムを多数の.cppファイルに分割しました。 display.cpp、gui.cpp、display.h、gui.hなど...複数のソース.cppファイルの問題

これらのファイルは読みやすさのために区切られていますが、必ずしも依存性スキームを示すものではありません。

最初は、ディスプレイからの関数がguiから関数を呼び出すので、コンパイルするのに苦労しました。逆もまた同様です。いずれにしても最初に含めるものは、もう一方の機能に依存します。しかし、私は最終的にすべての.hファイルをインクルードしてから、すべての.cppファイルを私のメインプログラムに含める必要があることを知りました。

例は、main_program.cppに:

#include "display.h" 
#include "gui.h" 
#include "display.cpp" 
#include "gui.cpp" 

は、残念ながら、私はまた、コンパイルするために、私はVisual Studioで、「ソース」コードと見なされているものから他のすべての.cppファイルを削除しなければならなかったことに気づきましたデバッガ。そうすれば、main_program.cppがコンパイルされ、必要に応じて他のファイルもコンパイルされます。 "source"サイドバーにdisplay.cppとgui.cppを含めるとエラーになります。

これはおそらく間違ったやり方であり、私は何か間違っているように感じています。私はすべてのソースファイルをサイドバーに入れて、コンパイルしておきたいと思っています。もちろん、上記は単なる例であり、2つではありませんが、お互いの関数を呼び出す10個の.cppファイルによく似ています。これをよりうまく設計する方法についてアドバイスしてください。

+0

"display.h"と "gui.h"の代わりに、私のプログラムが "functions.h"のように1つのファイルで使用するすべての関数を定義することができます。なぜ私はそれを前に考えなかったのか分からないが、それはうまくいくかもしれないようだ。 – pete

+0

待って!やめる!あなたが答えを得るまで遠くに行かないでください! : –

+0

haha​​まあ、アイデアはかなり低い機会費用を持っているし、私は何もしたくない。たとえデザインが恐ろしいものであっても、元に戻すことができる。 – pete

答えて

2

一般的に .cppファイルを含めたい!また、のいずれかのサイクルを含まない依存関係の階層に従ってコードを分解することに慣れてください。小さなproframの場合、これはちょうど参考になります。大規模なソフトウェアにとっては不可欠です。

+0

Dietmarありがとうございました。ディスプレイの一部の機能がguiの一部の機能を呼び出したり、逆の機能を呼び出すことがありますが、必ずしもお互いに同じ機能である必要はありません。 – pete

+0

ファイル間の循環は望ましくありません。基本的なレベルでは、echを呼び出す関数があるかもしれませんが、これは基本的にこれらの関数が同じコンポーネントの一部であり、同じヘッダーやソースに入っていることを意味します。これらの依存関係を壊すことはもちろんです。 –

+1

@ Peter James:* .cppファイルをプロジェクトに追加します。 Visual Studioで実行可能ファイルに配置することを心配してください。 –

0

私は、2つのヘッダファイルが互いに参照したり、関数などを呼び出すのに似た問題を抱えていました。これを修正するために、まず私のヘッダガードがすべてチェックされていることを確認しました(#ifndef HEADER_DEFINE#pragma onceなど)。 )、クラスファイルには問題のあるヘッダーが含まれています。

私がPie.hとCherries.hを持っていて、Pie.hにCherries.hが含まれていれば、Pie.cppファイルにはCherries.hのインクルードがあります(逆もまた同様です)。

+0

hmしかし、私はお互いに.hファイルを含めていない;例えば、display.cppにはdisplay.h – pete

+0

@PeterJamesが含まれていますが、display.hにはgui.hは含まれていませんか? – Lander

1

.cppファイルが含まれているという問題があります。そのため、ソースコードファイルを常にコンパイルするため、Visual Studioにこれらのファイルが「ソース」コードではないかのように告げる必要がありました。ですから、簡単な解決策はではありません。です。

ヘッダファイル(.h)のみをそれぞれに含めると、それぞれ.cppファイルが必要です。たとえば、gui.cppdisplay.cppで定義された関数を呼び出す必要がある場合、gui.cppコードファイルの先頭にdisplay.hヘッダーファイル#includeが必要です。

前方宣言を使用して、残っている循環依存を排除​​します。

1

これは...物事にアプローチする正しい方法ではありません。私が推測しなければならないのは、定義ではない関数宣言を使用していないと思います。機能定義はあなたがおそらく持っているものです:ヘッダーに行く何

void dothing(int param) { //function definition 
    throw param; 
} 

が関数である。このようなものだ宣言、:

void dothing(int param); //function declaration 

これは単に他のcppファイルは知ることができますファイルは呼び出しのために存在するが、詳細を知る必要はありません。一般的に、関数は(あなたがしていると思われる).cppファイルに入ります。 CPPファイルneadsは別のCPPファイル内の関数にアクセスする場合、

void dothing(int param) { //function definition 
    throw param; 
} 

float object::function(float param) { //member function definition 
} 

そして

display.h

#include "velocity.h" //we need the details, so we include 

void dothing(int param); //function declaration 

class coordinate; // this is a class declaration 
        //this header needs to know about coordinates 
        //but doesn't need the details 
        //otherwise we'd have to include "coordinate.h" 

struct object { //class definitions usually go in headers 
    coordinate* member; //pointers don't need to know the details 
    velocity speed; //actual object needs the details 
    float function(float param); //function declaration 
}; 

display.cpp:各関数は、ヘッダファイルで宣言を持っています適切なヘッダーが含まれています。

main.cpp

ヘッダーはクラスを宣言することをお勧めします(私の例では:coordinate)、できるだけ多くのヘッダーを含めるようにしてください。また、テンプレートには完全に異なるルールがあります。

関連する問題