2

我正在为学校分析一个操作系统项目,并遇到了这个头文件:

//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; 数据访问权限是否存在差异?或者它以某种方式完全不同?

感谢您的帮助,我希望我的问题足够清楚。

4

3 回答 3

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标题的副本替换该行,并且一切都可以正常工作(上面示例中的每一行都是有效的)。然而,有很多理由不这样做。易于维护以及可读性和模块化将是首要问题。它也不太适用于编译器缓存(因此通常需要更长的时间来编译)

于 2013-08-26T10:50:51.887 回答
2

如果您只有一个声明 class A;而不是完整的类定义,那么该类型被称为不完整的。这可以以有限的方式使用;你可以做一些只需要知道类存在的事情,例如:

  • 声明一个指针或对它的引用;
  • 声明一个函数,使用它作为参数或返回类型;
  • 声明(但不定义)该类型的外部变量。

你不能做任何需要知道类成员、大小或定义给出的其他细节的事情,例如:

  • 定义该类型的变量;
  • 使用它定义一个函数;
  • 访问任何成员或嵌套声明;
  • 继承它;
  • 适用sizeof于它。
于 2013-08-26T11:04:57.083 回答
0

如果我没记错的话,你问的是Declaration vs Definition. 它们不同但相关。

我转发给你这两个用谷歌搜索为“c++ 声明定义”的帖子,因为它们会比我解释得更好:)

定义和声明有什么区别?

http://www.cprogramming.com/declare_vs_define.html

只需评论您的class A;is a declaration,而 includeThread.h肯定会有很多definitions内部(也许还有声明)。

- - - - - - - - - - - 编辑:

关于@Dave 评论的前向声明:

class B ; // needed declaration

class A {
  B field ;
} ;

class B {
  A field ;
};
于 2013-08-26T10:46:44.003 回答