問題タブ [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.
c++ - C ++で何を「前方宣言」できますか?
私は私ができることを知っています
そしておそらく
およびグローバル関数
型付き列挙型はどうですか?宣言されていないクラス内の型付き列挙型はどうですか?宣言されていないクラスを持つ関数はどうですか?宣言されていないクラス内の静的メンバーはどうですか?未知の名前空間内のこれらはどうですか?前方宣言できるものが他にありませんか?
c++ - 空の名前空間定義が必要なのはいつですか?
名前空間は他のほとんどのもののように宣言および定義されていませんが、前方宣言に相当する名前空間は次のようになります。
通常、名前空間を定義するには、その中に他の宣言を配置します。しかし、この「名前空間前方宣言」が最も簡単な解決策である問題はありますか?空の名前空間はどのような用途に使用されますか?
android - 1.6ではAndroidの前方宣言が機能しない
公式サイトによると、Androidはバージョン1.6以降の前方宣言をサポートしています。
最小SDKとターゲットSDKの両方の要件をmanifest.xmlで「4」に調整した後も、Eclipseのレイアウトエディターは、相対レイアウトでの不明な宣言について不平を言っています。
この行に複数の注釈が見つかりました:
エラーエラー:指定された名前に一致するリソースが見つかりません(「layout_above」で値「@ id / ChkBoxSavePwd」)。
エラーエラー:指定された名前に一致するリソースが見つかりません(「layout_alignLeft」で値「@ id / EditTxtServer」)。
クリーン/再構築は役に立ちませんでした..誰かがこの問題に遭遇しましたか?
c++ - 前方宣言FILE*
FILE *
Cで前方宣言するにはどうすればよいですか?私は通常これを使用してこれを行いますstruct MyType;
が、当然これは可能ではないようです。
C標準またはコンパイラ間およびC++で動作が異なる場合、これも重要です。
Update0
これを脇に置きたい理由:私が求めているのは、非struct / "typedef'd struct"型を前方宣言して、それへのポインターを宣言できるようにする方法です。明らかに、それを使用void *
してソースファイルにキャストするのは少しハックです。
c++ - 前方宣言インクルード、宣言インクルードの上に (ClassFwd.h + Class.h)
効果的な C++ (第 3 版) の項目 31 で、Scott Meyers は、クラスが従来の宣言 (.h) および定義 (.cpp) ファイルに加えて、前方宣言インクルード ファイル (fwd.h) を持つ必要があることを示唆しています。完全な定義を必要としないクラスは、自身を前方宣言する代わりに使用できます。
私はそれのケースをいくらか見ていますが、これを実行可能なオプションとは本当に思いません...維持するのは非常に難しく、かなりやり過ぎで、ほとんど必要ではないようです。
ただし、かなり重いテンプレートの前方宣言に使用されていることがわかります。しかし、単純なクラスの場合は?維持するのは苦痛であり、非常に小さな目的を果たすほとんど空のインクルードファイルを大量に作成するようです...手間をかける価値はありますか?
次に例を示します。
私の質問:
皆さんはどう思いますか?これは良い習慣ですか?
注: 私は主に、この慣行の議論に関心があります。Scott Meyers に同意させる何かを見落としていないかどうかを確認するためです。
c++ - C++循環参照の問題
私には2つのクラスがあります:DataObject
とDataElement
。s DataObject
(のみ)へのポインタを保持し、aにはいくつかのタイプへのポインタが含まれます。DataElement
DataElement
DataObject
DataObject
以前は、のsへのポインタのみを使用しているため、これは問題ありませんでした。したがって、のヘッダーでのDataElement
前方宣言で十分です。DataObject
DataElement
ただし、ここで、にデストラクタを追加しようとしています。ここでは、をDataElement
削除する必要がありDataObject
ます。これについて、コンパイラは次のように述べています。
どうすればこれを解決できますか?前方宣言は明らかに十分ではありませんが、の完全なヘッダーを含めることはできませんDataObject
。これにより、循環依存が再び発生します。
前もって感謝します!
c++ - 前方宣言はうまくいきません
以下は、コードの 2 つの断片 (コンパイル可能) です。最初のフラグメントでは、構造体の前方宣言のみを使用しているときに、この構造体へのポインターを基本クラスから削除していますが、Guest クラスの dtor は呼び出されません。
2 番目のフラグメントでは、前方宣言の代わりに、Base での削除を使用してこの Guest クラスの完全な定義を使用し、意図したとおりに動作します。
なんで?なぜ違いが生じるのですか?前方宣言は、このクラス/構造体の定義が別の場所にあるというコンパイラーへの単なるメモではないでしょうか?
それが直感的に機能しないことに非常に驚いています。
// 2 番目 - 完全な定義
c++ - C++ フレンド関数リファレンス
私はこのような状況です (2 つの異なるヘッダー ファイルを持つ 2 つのクラス):
bh
ああ
基本的に、クラス A は「B」オブジェクトを作成します。作成関数 create() に、クラス B のプライベート メンバー 'x' を変更するアクセス権を付与したいと考えています。C# の 'internal' キーワードをより詳細なレベルでシミュレートしたいと考えています。
私が抱えている問題は、循環ヘッダー参照になってしまうことです。bh は ah の後に来たいが、ah は bh の後に来たい これを行う適切な方法は何ですか? void* ptr に頼る必要がありますか? 私は 1 種類のオブジェクトしか作成しないので、ファクトリ パターンは必要ないと思います。うまくいけば、単純なものが欠けています。
c - 「names」のストレージ サイズは不明です
この .c ソース ファイルのコンパイル中にこのエラーが発生します。
/INIT_SOURCE_BUILD/src/names_list.c:7: エラー: 'names' のストレージ サイズが不明です
これがこのリンクされたリストのヘッダーです
c++ - クラス内で「使用前に宣言」ルールが必要ないのはなぜですか?
なぜ C++ の使用前宣言規則がクラス内で成立しないのか疑問に思っています。
この例を見てください:
BASE が定義されている場合、コードは有効です。
A のコンストラクター内で、まだ宣言されていない B::foo を使用できます。
なぜこれが機能するのですか?また、ほとんどの場合、クラス内でのみ機能するのはなぜですか?