5

因此,我正在学习 C++ 并学习在我的实践中使用 SQLite 来实现跨应用程序运行的数据持久性,这很有趣。

但是我碰到了这个问题:

该程序是一本成绩册,经典的 Ditel C++ 书籍练习。我的课程结构如下:

~/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 很笨拙,而且由于您使用的是包含保护,您永远不必担心包含两次相同的文件。

因此,要回答您的问题,不,从可以“更好”的意义上说,这不是“正确的”。 main.cpp应该包括它需要的所有头文件。他们全部。 #include是一种简单的文本替换机制。当您#include创建一个文件时,它实际上是粘贴进去的。就是这样。

于 2013-03-26T05:43:03.000 回答