2

ポインタはオブジェクト指向プログラミングの概念とどのように連携しますか?

私が理解しているように(そして私はID-10Tとして分類されていることを認識してください)、OOPの主な信条は、クラス内に含まれる管理責任(メモリ/実装など)の封じ込めと維持です。しかし、オブジェクトのメソッドがポインタを返すとき、オブジェクトを「ポップ」しているように見えます。今、誰かが心配する必要があるかもしれません:

  1. 彼らはポインタの関連オブジェクトを削除することになっていますか?
  2. しかし、クラスがまだオブジェクトを必要としている場合はどうなりますか?
  3. 彼らはオブジェクトを変更できますか?もしそうなら、どのように?const(私はこの問題を解決するかもしれないと認識しています)
  4. など...

オブジェクトのユーザーは、クラスがどのように機能するか、およびクラスがユーザーに何を期待するかについて、さらに詳しく知る必要があるようです。それは、OOPに直面して平手打ちされているように見える「猫が袋から出された」シナリオのように感じます。

注:これは言語に依存しない質問であることに気付きました。ただし、C++環境で作業しているときに質問をするように求められました。

4

3 に答える 3

5

あなたが説明するのは所有権の問題です。これらは、オブジェクト指向に対して直交しています(つまり、独立しています。もう一方がなくても、両方がなくてもかまいません)。OOPを使用せず、POD構造体へのポインターをジャグリングする場合も、同じ問題が発生します。OOPを使用する場合は問題はありませんが、なんとかして解決します。より多くのOOPを使用して、または別の方法でそれを解決することができます(しようとします)。

それらはまた、ポインターの使用と直交しています(ポインターの定義を選択して拡張しない限り)。たとえば、2つの別々の場所がインデックスを配列に保持し、配列を変更、サイズ変更、最終的に削除する場合にも、同じ問題が発生します。

C ++では、通常の解決策は、適切なスマートポインターの種類を選択することです(たとえば、オブジェクトを共有する場合は共有ポインターを返すか、排他的所有権を示すために一意のポインターを返します)。実際、後者はどの言語でも重要な要素です。

これを支援するために実行できるOOP関連の1つのことは、カプセル化です(もちろん、OOPがなくてもカプセル化は問題なく実行できます)。たとえば、オブジェクトをまったく公開せず、内部でオブジェクトをクエリするメソッドのみを公開します。または、生のポインターを公開せず、スマートポインターのみを公開します。

于 2012-08-28T17:56:29.903 に答える
1

手始めに...ポインタや参照なしでポリモーフィズムを持つことはできません。C ++では、従来、オブジェクトはコピーされ、(ほとんどの場合)自動保存期間があります。ただし、コピーはポリモーフィックオブジェクトでは機能しません。それらはスライスされる傾向があります。また、OOはアイデンティティを意味することもよくあります。つまり、コピーしたくないということです。したがって、解決策は、オブジェクトを動的に割り当て、ポインタを渡すことです。それらを使って行うことは、設計の一部です。

オブジェクトが論理的に別のオブジェクトの一部である場合、そのオブジェクトはその存続期間に責任があり、ポインターを受け取るオブジェクトは、所有するオブジェクトが消えた後にポインターを使用しないようにするための措置を講じる必要があります。(これは、ガベージコレクションのある言語でも当てはまります。オブジェクトへのポインタがある限りオブジェクトは消えませんが、所有オブジェクトが無効になると、所有オブジェクトも無効になる可能性があります。事実ガベージコレクターがメモリをリサイクルしないことは、指定したオブジェクトが使用可能であることを保証しません。)

オブジェクトが論理的に別のオブジェクトの一部ではなく、ファーストクラスのエンティティ自体である場合は、おそらくそれ自体を処理する必要があります。繰り返しになりますが、ポインタを保持している可能性のある他のオブジェクトは、存在しなくなった場合(または無効になった場合)に通知する必要があります。オブザーバーパターンの使用が通常の解決策です。私がC++を始めたとき、関係を登録するある種の管理クラスを備えた「関係管理」の流行がありました。これにより、すべてが正常に機能することが保証されたと思われます。実際には、それらは機能しなかったか、単純なオブザーバーパターン以上のことはしなかったため、今日ではそれ以上聞こえません。

ほとんどの場合、あなたの正確な質問は、各クラスがその機能ごとに確立しなければならない契約の一部です。真のOOクラス(エンティティオブジェクト)の場合、おそらくそれらを削除しないでください。それはあなたのビジネスではなく、ビジネスです。ただし、例外があります。たとえば、トランザクションを処理している場合、削除されたオブジェクトはロールバックできないため、オブジェクトがそれ自体を削除することを決定すると、通常、このファクトがトランザクションマネージャーに登録され、トランザクションマネージャーがその一部として削除します。コミットの場合、ロールバックが必要ないことが確立されたら。オブジェクトの変更に関しては、それは契約の問題です。多くのアプリケーションには、ある種の外部識別子をオブジェクトにマップするために使用されるマッピングオブジェクトがあります。多くの場合、オブジェクトを変更できるようにすることを目的としています。

于 2012-08-28T18:01:11.677 に答える
0

私の理解と経験から、それは一般的に、あなたがやろうとしていることと、ポインターを使用する言語(C ++とObjective-Cなど)を中心に展開します。

ただし、通常、C ++の用語では、参照によってスマートポインター(など)への参照(状況によっては参照でstd::shared_ptrさえも)を返すか、単にクラス内のポインターを非表示にするのが最善であることがわかりました。constまた、外部からアクセスまたは使用する必要がある場合は、ポインターをコピーして返すか、ポインターへの参照を返すgetterメソッドを使用します(もちろん、AFAIKref-to-ptrはC++でのみ可能です)。 。ほとんどの状況でref-to-ptrを削除してはならないことを誰かが知らない場合(もちろん、その割り当て解除がクラスによって内部的に処理される場合)、準備ができているかどうかを本当によく考える必要があります。チームでC++を実行している。

ヒープに割り当てられたオブジェクトを内部で管理しながら、スタックに割り当てることができる場合(つまり、メモリをあまり消費しない場合)、クラスメンバーのパブリック参照を使用することはかなり一般的です。クラスメンバーをクラスの外部に設定する必要がある場合は、直接アクセスするのではなく、必要な値を取得するsetメソッドを使用することができます。

于 2012-08-28T17:38:16.923 に答える