2016-07-01 1 views
1

ベースクラスのインクルードディレクティブを設定する方法があるかどうかを理解しようとしていますが、ベース以外のヘッダーで定義されている派生クラスクラス。例えば:GenericObject.hでベースクラスヘッダーのみが含まれている場合のアクセス派生クラス

:Ball.hで

class GenericObject { 
    /* whatever - shared properties and methods implemented in .cpp file */ 
} 

他のいくつかの実装ファイルで今すぐ
class Ball : public GenericObject { 
    /* whatever - implementation details are in the .cpp file */ 
} 

(のはmain.cppにそれを呼びましょう)、私は#includeを持っていますd "GenericObject.h"。 main.cppでは、GenericObjectクラスのメンバーだけでなく、BallクラスやGenericObjectの他の派生クラスの両方にアクセスできるようにしたいと考えています。これまでの試行から、Ball * b;のように宣言しようとすると、コンパイラはボールの識別子を認識しないため、そのクラスに属するメンバーのいずれかが認識されます。

これは私の#includeのd "GenericObject.h"ファイルが私にアクセスするこの派生したボールクラスがリンクされていないためですか? "#include "Ball.h"の場合、Ballクラスを正しく識別して使用できますが、GenericObjectクラスの派生クラスのヘッダーファイルをすべて含める必要があるとは思いませんか?

これがどのように機能するかを推測しなければならない場合は、GenericObjectクラスのBallクラスのプロトタイプ宣言のようなものが正しい方向のステップになると思いますが、クラスのプロトタイプも事である。

フィードバックをお寄せいただきありがとうございます。

+2

[*翻訳単位*](https://en.wikipedia.org/wiki/Translation_unit_(プログラミング))の概念を学ぶ必要があります。簡略化された翻訳単位は、単一のソースファイルとそのすべてのヘッダファイルです。正しいヘッダーファイルが含まれていない場合、コンパイラはそのヘッダーファイルで宣言し定義したシンボルを単に知ることができません。 –

+0

私はこれが当てはまると思っていたと言いましたが、私は何か明白なアプローチや別の最適なアプローチを見逃していないことを確認したかったのです。ありがとう、結構です! –

答えて

3

いいえ、まだ説明されていない識別子は使用できません。これには、ベースから派生したものであろうとなかろうと、どのクラスも含まれます。

あなたはLiskovを違反しているようです。ベースへの参照またはポインタを受け取った場合、派生したものかどうかを知る必要があるものは実行しないでください。あなたはベースのインターフェイスを使用しているだけです。これにより、派生クラス用のヘッダーは、THEIRインターフェイスでのみ定義されたものを使用していない場所に含める必要はなくなりました。

+0

私は理解していると思います。私がインターフェイスとしてベースを使用していたとしても、派生したすべてのクラスのヘッダーを宣言する必要があります。GenericObjectクラスの派生クラスが50種類ある場合、それらの派生クラスごとに50の '#include'ステートメントが本当に必要でしょうか?プロジェクトが再コンパイルされたときに、変更されたファイルだけを再コンパイルする必要があるように、ヘッダーファイルが使用されていると思っているので気にしないと思います。私がこれらのヘッダーをすべて含んでいれば、それはコンパイル時間を増やすことにつながりますか? –

+0

使用しているインターフェイスを含めるだけです。 50種類の派生クラスにダウンキャストしている場合は、50個のヘッダーをすべて含める必要があります。あなたがいないなら、あなたはしません。はい、50個のヘッダーを含むとコンパイル時間が長くなります。 –

+0

それを明確にしていただきありがとうございます。さらに明確にするために、私はまだC++のインターフェース継承で少し混乱しているので、インタフェース(GenericObject)を '#include 'し、BallクラスにGenericObjectを実装させ、Ballを#includeする必要はありません。 h ""このように?それを書くことは可能だとは思わないが、私は確信したい。 –

1

GenericObjectクラスの派生クラスのすべてのヘッダーファイルを含める必要があるとは思いませんか?

あなたはポインタまたは参照を通じて以外GenericObjectから派生したクラスを、アクセスしたい場合は、それらのヘッダファイルを#includeする必要があります。

ポインタと参照のみを使用すると、ヘッダファイルを#includeにする必要はありませんが、まだそれらを宣言する必要があります。

関連する問題