1

私は C++ は初めてで、C と、JavaScript、PHP、Ruby と Python などのさまざまな動的スクリプト言語の経験が少しあります。私は長い間ではありませんが、オブジェクト指向 (OO) の原則に取り組んできましたが、私にとって新しいことは、C++ がクラスへのポインターを使用することです。C のポインターはもはや私にとって謎ではありません (少なくともそうであることを願っています)。例外は、特別な変数を追跡したい場合、またはそれを関数に渡してその値を変更したい場合です。そして、ポインターを使用する動機が必要なので、C++ でそれらを使用する必要があります。例を参照していただけますか?ウィキペディアで勉強しました。これは、C++ でのビルダー デザイン パターンの例です。彼らはPizzaクラスを使用し、PizzaBuilderクラスへのm_pizzaポインタを使用します。Pizzaここで通常のインスタンスの代わりにポインターを使用する理由は何ですか?

編集:

誤解を避けるためだけに

  • 「C のポインターはもはや私にとって謎ではありません」という私の声明で言いたかったのは、ポインターがメモリなどにどのように格納されているかを知っているということです。それは私が C 忍者であるという意味ではありません :)

  • そして、私が言うとき、「オブジェクト指向 (OO) の原則に長くは取り組んできませんでしたが」とは、それほど長くはありませんが、あまり経験がないことを意味しますが、一目でわかります。高レベルのスクリプト言語を使用しており、C を除いて他の低レベル言語の経験はなく、C にはクラスがありません。:)

4

2 に答える 2

3

この例でポインタを使用する理由は、それが抽象ファクトリだからです。その目的は、さまざまなピザ クラスからピザ オブジェクトを構築することです。

抽象ファクトリは、これらのオブジェクトがメモリ内でどれだけのスペースを占有するかを知らなくても、これらのオブジェクトを保持する必要があります。そのため、ここではプレーン インスタンスをメンバー変数として使用できません。それらのサイズは、ピザビルダーの実装ごとに異なります。

とにかく、それがここでのアイデアだと思います。この例では、常にピザに同じクラスを使用していますが、ベースのピザから派生させることで、まったく異なる機能を持つピザを生成するファクトリを実装できます。そして、ピザを保持するためのポインターが抽象的なピザビルダーに必要です。

于 2013-09-01T11:23:47.853 に答える
1

m_pizza = 新しいピザ; constructPizza() メソッドの行はメモリを割り当て、ポインタ メンバー変数 "m_pizza" がそれを指すようにします。getPizza() を使用すると、オブジェクトに割り当てられたメモリへのポインターを取得できます。

それとは別に、作成された各ビルダー オブジェクトには、独自の Pizza ポインター メンバー変数があります。したがって、各getPizza () 呼び出しの後にhawaiianとspiceによってポイントされるメインの Pizza オブジェクトは、異なるオブジェクトです。

さらに、同じビルダーのインスタンス createNewPizzaProduct() の 2 つの結果呼び出しがどこかにある場合、2 つのオブジェクトが作成されますが、最後のオブジェクトのメモリのみがメンバー変数ポインターによってポイントされるように設定され、メモリ リークが発生することに注意してください。(たとえば、m_pizzaBuilder->createNewPizzaProduct(); が誤ってクックの constructPizza() メソッドで 2 回呼び出された場合に発生する可能性があります。ここでのポイントは、ここのコードの方がメモリ リークに対してより安全である可能性があるということです。書かれている通りに漏れます)。

于 2013-09-01T13:42:37.057 に答える