私は、前方クラス宣言とそのようなクラスへのポインターを定期的に使用します。
関数ポインターを多数のレイヤーに渡す必要があります。関数ポインターのプロトタイプを宣言するヘッダーは、単にそのポインター値を渡す各レイヤーではなく、関数ポインターを逆参照するモジュールにのみ含めることをお勧めします。
これは可能ですか?
=====
回答から、私は質問によって十分に明確に表現していないと思います。私は前方クラス宣言に類似したものを探しています。私は皆、私が書くことができることに同意します:
クラス foo;
ボイドバー (foo*);
無効 waz(foo* p) { bar(p); }
waz は名前以外にクラス foo について何も知らないことに注意してください。おそらく、bar は foo の完全な説明にアクセスできます。おそらく、bar は単純に p をさらに先に渡します。誰も気にしない?foo* を逆参照するサイトのみ。他のすべてのサイトでは、「class foo;」のみが必要です。
同様に、私は次のように書けることを知っています:
typedef void foo(int, double);
ボイドバー (foo*);
無効 waz(foo* p) { bar(p); }
違いは、識別子 foo が関数型を示すことがわかっているだけでなく、完全な署名/プロトタイプをすでに持っていることです。これにより、次の 2 つの不快なシナリオのいずれかに陥ります。
1) 複数のサイトで typedef を複製します (ヤッ! 壊れやすい!) 2) typedef をヘッダーに貼り付け、foo* が言及されているすべての場所に含めます。
非対称性に注意してください。データ オブジェクトの場合、foo* を逆参照したいポイントでクラス foo の完全な説明を提供するだけで済みました。関数の場合、foo* に言及したいすべての場所で完全な署名/プロトタイプを提供する必要があります。
では、この非対称性を改善する方法はありますか?