#include .h和仅说明A类之间的区别;在C ++中

时间:2013-08-26 10:40:29

标签: c++ class header

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

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

感谢您的帮助,我希望我的问题足够明确。

3 个答案:

答案 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 ;
};