1

別のプログラマーが作成した非常に長いプログラムを変更する必要があります。彼のコードを調べてみると、C++ オブジェクトへのポインターが 2 つあることがわかります。この場合にダブルポインターが使用される理由がわかりません。シングルポインターでも同じことができると思います。例はそれをより明確にします:

class A {
...
public:
   static B** b; //why double pointers here?
   ...
}


Class B {
...
public: 
   B(...)
   func1();
   func2();
}

クラスから多数のオブジェクトが必要です。Bたとえば、5 つのオブジェクト (オブジェクトの 2D 配列ではありません) が必要です。を作成するbと、コードが *b を改ざんすることはありません。によって呼び出されるのは B の関数だけb[i]->func1()です。したがって、ポインターを変更しないので、 を定義することで同じことができると思いstatic B* b;ます。私は何かを無視していますか?

4

5 に答える 5

2

(生の)ポインターの動的な(生の)配列が必要な場合は、実際にポインターからポインターが必要になります。

もちろん、C ++の方法は、スマートポインターのベクトル、または同様のものになります。

完全な文脈を見ずにこれ以上何も言うことは難しい。

于 2012-02-14T23:26:09.820 に答える
2

Mac OSの古いバージョンでは、これらはハンドルと呼ばれていました。これらは、オペレーティングシステムがポインタを壊すことなくメモリを再配置できるようにするために使用されました。(つまり、ポインターへのポインターのみを保持している限り、OSはオブジェクトを移動し、オブジェクトへのポインターを変更できます。)

あなたのケースで何が起こっているのかを知るのは難しいですが、ある種の同様のメモリ最適化が起こっているかどうかを確認したいかもしれません。

于 2012-02-14T23:28:07.443 に答える
2

プログラマーは、タイプ B または B から派生したオブジェクトの配列が必要だったのでしょうか (または単に将来のプログラムでその機能を妨げないように)? B から派生するオブジェクトはサイズが異なる可能性があるため、単純に配列に次々と配置することはできません。したがって、参照レベルが追加されます。

C++ では、boost ライブラリを使用している場合、この動作はboost::ptr_vectororによって比較的きれいに達成できます。これによりboost::ptr_array、ダブル ポインターの見苦しさが隠され、他の偶発的なエラーが発生するのを防ぐことができます。

于 2012-02-14T23:39:57.900 に答える
1

それが単一のポインタである場合、あなたは正しいです、それはBオブジェクトのインスタンスへのポインタのリストになります。

ダブルポインタがあるという事実は、必ずしも彼がBオブジェクトの2D配列を作成しようとしていたことを意味するわけではありません。たぶん彼は、BオブジェクトのリストをBオブジェクトのリストではなく、Bオブジェクトへの参照のリスト(たとえば、Bオブジェクトへのポインター)にしようとしていました。

たぶん、オブジェクト自体ではなくBオブジェクトへのポインタを格納するアプリケーションのコンテキストでは、良い考えのように聞こえますか?

とにかく、私が言ったように、ダブルポインタは必ずしもダブルリストを意味するわけではありません。

于 2012-02-14T23:45:24.397 に答える
0

何かへのポインターは、その何かを見つける場所またはその何かを配置する場所をコードに伝えるために使用されます。したがって、ポインターを見つける場所またはポインターを置く場所をコードに伝える必要がある場合は、ポインターへのポインターが使用されます。

于 2012-02-14T23:36:20.820 に答える