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 に答える