問題タブ [opaque-pointers]

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.

0 投票する
3 に答える
1375 参照

c# - C# で不透明なポインター (参照) を作成する

List別のクラスを使用してデータを格納するクラス(基本的にリンクされたリストなので、と呼びましょう)(ノードなので、クラスと呼びましょうNode)があります。Nodeには から呼び出さなければならないメソッドがありますがList、他の場所から呼び出すと面倒な場合があります。プログラムの他の部分で の参照を使用する必要がありますNodeが、変更するのは のみListです。C++ では、 へのプライベート ポインターを持ち、 の一部のメンバーを公開する別のクラス ( と呼びましょう)を作成し
ます。にアクセスできないようにすることなく、プログラムの残りの部分からへの参照を隠す方法は考えられませんでした。OpaqueNodeNodeListNodeNodeList
それを行う方法や、同じ機能を持つC#固有のイディオムはありますか?

List明確化:クラスだけに見えるようにしたいと思います。internalキーワードについてはすでに知っています。

0 投票する
1 に答える
97 参照

c - 不透明なポインターを初めて使用する

スタックを実装しようとしていますが、不透明ポインターの使用法を理解していません。私の申告書です:

そして、これが私のスタック構造と new_stack 関数です:

私の目には、新しいスタックのアドレスを返していますが、これは new を返すことからコンパイル時にエラーをスローします。私は何を間違っていますか?

0 投票する
3 に答える
1194 参照

c - C のスタックに割り当て可能な不透明型

.hC インターフェイスを設計する場合、ユーザー プログラムが知る必要があるものだけをパブリック インターフェイス ( ) に入れるのが一般的です。

したがって、たとえば、構造体の内部コンポーネントは、ユーザー プログラムが知る必要がない場合、非表示のままにしておく必要があります。インターフェイスに影響を与えることなく、構造体の内容と動作が将来変更される可能性があるため、これは確かに良い方法です。

その目的を達成する優れた方法は、不完全型を使用することです。

typedef struct foo opaqueType;

へのポインターのみを使用するインターフェイスをopaqueType構築できるようになりました。ユーザー プログラムは の内部動作を知る必要はありませんstruct foo

ただし、パフォーマンスとメモリの断片化の問題のために、通常はスタック上でそのような構造を静的に割り当てる必要がある場合があります。明らかに、上記の構成でopaqueTypeは不完全であるため、そのサイズは不明であるため、静的に割り当てることはできません。

回避策は、次のような「シェル タイプ」を割り当てることです。

typedef struct { int faketable[8]; } opaqueType;

上記の構成では、サイズと配置が強制されますが、構造に実際に何が含まれているかについては詳しく説明しません。したがって、タイプを「不透明」に保つという目的に一致します。

それは主に動作します。しかし、ある状況 (GCC 4.4) では、コンパイラは厳密なエイリアスを壊すと文句を言い、バグのあるバイナリを生成します。

今、私は厳密なエイリアシングについてたくさんのことを読んだので、それが何を意味するのか理解できたと思います.

問題は、厳密なエイリアシング規則を破ることなく、スタックに割り当てることができる不透明な型を定義する方法はありますか?

この優れた記事で説明されているユニオン メソッドを試してみましたが、それでも同じ警告が生成されることに注意してください。

また、visual、clang、および gcc 4.6 以降では、この構成で問題なく動作することに注意してください。

[編集]情報の補足:

テストによると、問題は次の状況でのみ発生します。

  • プライベートとパブリックのタイプが異なります。ファイル内で public タイプを private にキャストしてい.cます。彼らが同じ組合の一員であるかどうかは明らかに問題ではありません。public 型に が含まれているかどうかは問題ではありませんchar
  • private 型のすべての操作が読み取りだけであれば問題ありません。書き込みのみが問題を引き起こします。
  • また、自動的にインライン化される関数だけが問題になると思います。
  • -O3 設定の gcc 4.4 でのみ問題が発生します。-O2 は問題ありません。

最後に、私のターゲットはC90です。本当に仕方がないのならC99かもしれません。

0 投票する
2 に答える
3467 参照

c - リンクリストのヘッドノードを削除するには? C

そのため、リンクされたリスト スタックを C の不透明なオブジェクトとして使用しています。関数へのヘッド ポインター ポインターを渡しています。

これは、delete head 関数のコードです。ポップと呼んでいます

これは機能しません。ヘッド ノードは削除されません。私は実際にできます。しかし、私がそれを行ったときにヘッドノードが次に切り替わらず、ヘッドがないためにプログラムがクラッシュします笑。頭を次に切り替えるにはどうすればよいですか。機能していないためです。これはノード ポインタ ポインタです。と呼ばれるノードの公開バージョンですMY_STACK。不透明なオブジェクトにどれだけ精通しているかはわかりませんが、このためにはこのようにする必要があります。私はすべてをまとめることができません。それで頭の削除を行う方法を知っていますが、ここでは機能しません

これは MY_STACK ヘッダー ファイルです。Node_ptr は、同じもの + データと次のフィールドを保持するプライベート バージョンです。それらにアクセスするには、MY_sTACK を Node_ptr にキャストする必要があります。

機能する挿入機能があります。それは頭を変える。しかし、何らかの理由で pop 関数はそれを行いません

0 投票する
1 に答える
241 参照

c - 不透明なハンドルに定数を追加する

次のように、前方宣言された構造体へのポインターを使用してハンドルをユーザーに提示する C モジュールを作成したとします。

const次に、それを修飾パラメーターとして使用する関数プロトタイプを宣言すると、次のようになります。

const-nessはどのように適用されますか?

それともUBですか?

0 投票する
1 に答える
1116 参照

c++ - テンプレート引数の条件によってテンプレート メンバー変数を除外することは可能ですか?

私は現在、テンプレート引数に応じて特殊化する必要があるクラスを作成しています。

数値テンプレート引数が X より大きいかどうかに応じて、特定の特殊化のために特定のメンバー変数を除外して、より正確にすることができるかどうか疑問に思っています。

たとえば、次のようになります。

std::conditional の使用を考えていましたが、少なくとも 1 つの型が選択されるようです。もちろん、D-Pointer メソッドと std::conditional を使用して、指定されたさまざまなオブジェクトに特化することもできますが、もっと良い方法があるかどうか疑問に思いました。

私が見る別の方法は、抽象基本クラスを使用し、N < X 用と N >= X 用の 2 つの実装を持つことですが、これがより良いかどうかはわかりません。