我尝试坚持在实现文件中包含标题而不是在.h文件中的原则。但对于qt项目,我必须通过moc运行我的大多数头文件,然后抱怨它不知道的类。我使用moc header.h -o header.moc.cpp
然后将所有cpp和.moc.cpp链接在一起。
例如:
header1.h 以及一个cpp文件,我在顶部包含header1.h
#ifndef __HEADER_1_H
#define __HEADER_1_H
class Baseclass { /* ... */ };
#endif
header2.h 以及一个cpp文件,我在顶部包含header1.h和header2.h
#ifndef __HEADER_2_H
#define __HEADER_2_H
//here is where I then have to #include "header1.h" because of moc
class Derived: public QObject, public Base { Q_OBJECT; /* ... */ };
#endif
现在的问题是当我在另一个头文件和cpp文件中有另一个类时:
header3.h #ifndef __HEADER_3_H #define __HEADER_3_H
//I have to include header2.h because moc doesn't know about Derived.
class Other : public QWidget { Q_OBJECT; Derived* d };
然后在实现文件中我需要使用Derived和Other,但是当我包含它们的头时,我显然会得到多个定义错误。我可以通过仅包含header3.h来避免这种情况,而header3.h将包含其他标头。 我认为这导致非常混乱的代码与不必要的包含的东西和其他不可见的包含的东西(因此容易出错)。我怎样才能更好地做到这一点?
答案 0 :(得分:3)
你有多个定义,因为你可能在头文件中有一些函数定义,所以将它们移到相应的.cpp文件中。
现在关于包括: 你需要include(完整类型)继承(不适用于moc):
#ifndef __HEADER_2_H
#define __HEADER_2_H
//here you need to include header1, because you inherit from that class
//and this needs to see the whole object blueprint
//forward declaration is not enough.
#include <QObject>
#include "Baseclass.h" //or header1.h or whateven the file name is
class Derived: public QObject, public Baseclass { Q_OBJECT; /* ... */ };
#endif
你需要完整的继承类型,而Derived
你可以使用前向声明,因为你只有一个指针:
//you need include for QWidget, because you inherit from it
#include <QWidget>
//and forward declaration for derived
Class Derived;
class Other : public QWidget { Q_OBJECT; Derived* d };
在other.cpp文件中,如果要使用Derived