問題タブ [forward-declaration]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
objective-c - Cocoa: 前方宣言されたクラスと @interface が存在しない可能性があるというビルド警告
Leopard のプロジェクトで Clustering Plug をビルドしようとしています。次の2つの質問があります。
プロジェクトでは、インターフェースクラスは次のように定義されています
そして、このクラスは、前方宣言を使用して実装クラスで使用されます。
次に、1 つの関数で次のように使用されます。
このプロジェクトをビルドすると、次の警告が表示されます。
また、もう 1 つの警告が生成されます。
この警告は、次のコード行に対して発生します。
これらの警告を克服するのを手伝ってくれる人はいますか?
java - Java:名前空間のクラスの前方宣言
Javaで前方宣言を行うにはどうすればよいですか?
私には2つのクラスがあり、それぞれがもう一方のメソッドを呼び出す必要があり、どちらも異なる名前空間内にあります。例えば...
と
アップデート
Eclipseでは、このコードが検出されると、「ビルドパスでサイクルが検出されました...」というコンパイル時エラーがスローされます。
c++ - 2つのクラスが相互に参照する場合のC++のコンパイル
ラッパーが破棄されたときにプールに戻す接続ポインターの周りに単純なラッパーを書き込もうとしていますが、ConnectionPoolとAutoConnが相互に宣言する必要があるため、コンパイルされません。
前方減速を使用しようとしましたが、機能しませんでした。どうすればこれを解決できますか?(g ++を使用)
c++ - 不完全な型を削除すると未定義の動作になるのはなぜですか?
前方宣言で何をしてはいけないかを説明するために使用されるこの古典的な例を考えてみましょう:
Bodyのデストラクタは自明ではないため、このケースはUBに向かっていることを標準から理解しています。私が理解しようとしているのは、これの根本的な原因です。
つまり、ハンドルの dtor がインラインであるという事実によって問題が「トリガー」されているように見えるため、コンパイラは次の「インライン展開」のようなことを行います (ここではほぼ疑似コード)。
Handle インスタンスが破棄されるすべての翻訳単位 (Handle_user.cpp
この場合のみ) で、そうですか? 私はこれを理解できません:わかりました、上記のインライン展開を生成するとき、コンパイラーは Body クラスの完全な定義を持っていませんが、なぜ単純にリンカにimpl_->~Body()
物事を解決させて、Body のデストラクタを呼び出させることができないのでしょうか?実装ファイルで実際に定義されている関数?
言い換えれば、Handle 破壊の時点で、コンパイラは Body に対して (自明ではない) デストラクタが存在するかどうかさえわからないことを理解していますが、なぜいつものようにできないのでしょうか。リンカーが埋めるための「プレースホルダー」であり、その機能が実際に利用できない場合、最終的にリンカーは「未解決の外部」になりますか?
ここで何か大きなものを見逃していますか (その場合、愚かな質問で申し訳ありません)。そうでない場合は、この背後にある理論的根拠を理解したいと思っています。
c++ - C++ で関数プロトタイプを前方宣言する方法はありますか?
私は、前方クラス宣言とそのようなクラスへのポインターを定期的に使用します。
関数ポインターを多数のレイヤーに渡す必要があります。関数ポインターのプロトタイプを宣言するヘッダーは、単にそのポインター値を渡す各レイヤーではなく、関数ポインターを逆参照するモジュールにのみ含めることをお勧めします。
これは可能ですか?
=====
回答から、私は質問によって十分に明確に表現していないと思います。私は前方クラス宣言に類似したものを探しています。私は皆、私が書くことができることに同意します:
クラス 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* に言及したいすべての場所で完全な署名/プロトタイプを提供する必要があります。
では、この非対称性を改善する方法はありますか?
c++ - C++ のネストされたクラス/前方宣言の問題
ネストされたクラスを前方宣言し、それを外部クラスの具体的な (ポインター/参照ではない) データ メンバーの型として使用することは可能ですか?
IE
c++ - 前方宣言がクラスで機能しないのはなぜですか?
ここに示した例を変更しました。
構造体の前方宣言は機能するが、クラスの前方宣言は機能しないのはなぜですか?
それは名前空間と関係がありますか?tag namespace
そしてtypedef namespace
?typedefのない構造体定義はタグ名前空間に行くことを私は知っています。
構造体は、すべてのパブリックメンバーによる単なるクラスです。ですから、私は彼らが同じように振る舞うことを期待しています。
c++ - クラスfoo; ヘッダーファイル内
ヘッダーファイルにこのようなものがある理由を説明できる人はいますか?
これを使用するときにincludeステートメントが必要ですか?
ありがとう。
c++ - 仮想関数の C++ 前方宣言
クラス階層があり、その中に仮想関数を書いています。3つのクラスがあるとしましょう
のサブクラスであるというある種の前方宣言を行うことC.h
で、 に含めることを避けることができますか?B.h
C
A
ありがとう、ゴクル。