0

私はOOPを学んでいて、疑問があります。ClassB.hを含むファイルClassA.hがあり、ある時点でClassB.hにClassA.hを含める必要があるとします

これはエラーを発生させます。無限のインクルードループが発生するため、なぜそれが発生するのか理解できたと思います。しかし、この場合はどうすればよいですか?このエラーを回避する方法はありますか?それとも、それを避けるためにクラスを再考する必要がありますか?これは、私のクラス組織が適切に設計されていないことを意味しますか?もしそうなら、私の「クラス図」を整理してこれを回避する方法は何でしょうか?

このシナリオでのベストプラクティスを知りたいだけです。また、「#pragmaonce」ディレクティブがこの問題を解決しないのはなぜですか?前もって感謝します。

4

3 に答える 3

4

それを修正する方法はありますが、クラス編成が壊れていることも意味します。

これを修正する方法は「インクルード ガード」と呼ばれますが、多くのコンパイラもこの#pragma onceディレクティブをサポートしています。#pragma once全体が解析されるまでヘッダーファイルが含まれているとはおそらく見なされないため、機能していないと思います。また、ヘッダー ファイルの途中で再帰的なインクルードが発生するため、まだ解析が完了していません。

インクルード ガードは次のようなものです。

ClassA.h で:

#pragma once // Just because. It really should help.
#ifndef INCLUDED_CLASSA_H
#define INCLUDED_CLASSA_H

#include "ClassB.h"

//... rest of header file

#endif

ClassB.h で:

#pragma once // Just because. It really should help.
#ifndef INCLUDED_CLASSB_H
#define INCLUDED_CLASSB_H

#include "ClassA.h"

//... rest of header file

#endif

組織の問題は循環依存と呼ばれ、循環依存は一般的に悪い考えです。それらを壊すにはさまざまな方法がありますが、どの方法を使用するかは、依存関係の正確な性質と元の理由によって異なります。

問題に応じて、さまざまな手法のいずれかを使用できます。

  • 共通の基本クラスからの継承
  • 2 つのクラスのうちの 1 つを他のクラスの基本クラスに変える- これは前のクラスの変形です。
  • 前方宣言 - 循環依存関係を実際に壊すわけではなく、問題のある循環インクルード依存関係も必要ないように配置するだけなので、これはあまり望ましくありません。
  • 両方のクラスの一部を両方が使用できるクラスに変換する- これは、継承の代わりに構成を使用する共通基本クラスの別の変形です。

他にもテクニックがあります。実際、循環依存関係を取り除くことが本の大きなテーマであるため、さまざまな状況で使用できる非常に多様な手法が記載された本があります。その本は、John Lakos による「Large-Scale C++ Software Design」です

于 2013-02-15T01:32:31.897 に答える
4

また、前方宣言を使用してこれを回避することもできます。ヘッダーに含めるか、ヘッダーから継承しないクラスの実際のオブジェクトを作成しない場合、たとえば、ヘッダーにそれらのポインターのみが必要な場合は、これを行うことができます。

例:

ClassA.h
class ClassB;
//rest of the codes here

ClassB.h
class ClassA;
//rest of the codes here

ClassA.cpp
#include ClassA.h
#include ClassB.h

ClassB.cpp
#include ClassB.h
#inlcude ClassA.h
于 2013-02-15T01:52:45.103 に答える
-1

私の過去の経験では、継承を使用して同じ問題を解決しました。

私が解決した方法は . ClassA -> ClassB : ClassB は ClassA によって継承されました。ClassA には、ClassB と ClassA が必要とする共通のニーズがありました。

次に、「再帰インクルードの問題」を解決しました

于 2013-02-15T01:44:23.237 に答える