我正在为学校分析一个操作系统项目并遇到了这个头文件:
// kernelev.h
#ifndef _KERNELEV_H
#define _EVENT_H_
typedef unsigned char IVTNo;
class Thread;
class PCB;
class KernelSem;
class KernelEv {
public:
KernelEv (IVTNo ivtNo);
~KernelEv();
int wait(int MaxTimeToWait);
void signal();
[...]
现在,在编写这些方法的完整定义(KernelEv,~KernelEv,wait和signal)时,他们使用了Thread,PCB和KernelSem类的属性。通常引入例如#include Thread.h之间的区别是什么; #include KernelSem.h;并且只是声明这样的类:class Thread;数据访问权限是否存在差异?或者它有点完全不同?
感谢您的帮助,我希望我的问题足够明确。
答案 0 :(得分:3)
首先,请注意,如果您只介绍类,则无法使用这些方法;
class Thread;
Thread x; // compile error: size of x unknown
Thread* x; // this is ok
// set x to some valid thread, maybe as a parameter
x->signal(); // compile error
但是,您的声明是在标题中还是包含在文件中没有任何区别。也就是说,你可以用标题的副本替换include
行,一切都可以正常工作(上例中的每一行都是有效的)。然而,有许多理由不这样做。易于维护将是最重要的问题,以及可读性和模块化。它也不太适用于编译器缓存(因此通常需要更长的时间来编译)
答案 1 :(得分:1)
如果您只有声明 class A;
而不是完整的类定义,那么该类型被称为不完整。这可以以有限的方式使用;你可以做一些只需要知道班级知识的事情,例如:
您不能做任何需要了解类成员,大小或定义给出的其他详细信息的事情,例如:
sizeof
应用于此。答案 2 :(得分:0)
如果我没错,你会问Declaration vs Definition
。它们不同但相关。
我转发你的两篇帖子用Google搜索“c ++声明定义”,因为它们会比我更好解释:)
What is the difference between a definition and a declaration?
http://www.cprogramming.com/declare_vs_define.html
只评论您的class A;
是declaration
,而包含Thread.h
肯定会有很多definitions
(也可能是声明)。
---------------------编辑:
关于@Dave bellow评论的前向声明:
class B ; // needed declaration
class A {
B field ;
} ;
class B {
A field ;
};