5

そのため、私はC ++を学び、アプリケーションの実行全体でデータを永続化するための実践でSQLiteを使用することも学びました。これは、とても楽しいことです。

しかし、私はこの問題にぶつかりました:

プログラムはGradeBookであり、古典的なDitelC++の本の練習問題です。私は次のようにクラスを構成しています。

~/classes/Database.h/cpp // A small wrapper for sqlite3
~/classes/Student.h/cpp // The Student object with name and grades (Uses Database)
~/classes/GradeBook.h/cpp // Takes care of most of the application logic and UI (Uses Database and Student)
~/main.cpp // contains just the main function and base Instances of Database and GradeBook

これは、main()から単一のデータベースオブジェクトをインスタンス化し、GradeBookとStudentを参照して渡すことができるため、データベース関数を使用できるようにするためです。インクルードの可能なすべての順序を試しましたが、この順序だけが機能することがわかりました。

Student includes Database.
GradeBook includes Student, gets access to Database.
main.cpp includes GradeBook, gets access to both Database and Student.

問題は、これは正しいですか?インクルードが最も深いクラスからmain.cppファイルに逆方向に「カスケード」しているように見えることは、まったく直感に反しているようです。つまり、私はこれを正しく行っているのでしょうか、それとも何かが足りないのでしょうか。

もしそうなら、この「カスケード」がどのように機能するかについての少しの説明やポインタはかなり素晴らしいでしょう。

ありがとう!

4

1 に答える 1

7

まず、ヘッダーファイルは複数のインクルードを防ぐためにインクルードガードを使用する必要があります。

#ifndef MY_HEADER_H
#define MY_HDEADER_H

// code...

#endif  // this file will only ever be copied in once to another file

次に、実行したいことを実行するために必要なすべてのヘッダーファイルを明示的にインクルードする必要があります。ヘッダーAに依存してヘッダーBをインクルードするのは不格好であり、インクルードガードを使用しているため、同じファイルを2回インクルードすることを心配する必要はありません。

それで、あなたの質問に答えるために、いいえ、それは「より良い」かもしれないという意味で「正しい」ではありません。 main.cpp必要なすべてのヘッダーファイルを含める必要があります。それらのすべて。 #include単純なテキスト置換メカニズムです。ファイルを#include作成すると、文字通り貼り付けられます。それだけです。

于 2013-03-26T05:43:03.000 に答える