2011-02-09 8 views
0

私は、いくつかの異なるオブジェクトが意味論的にリンクされているプロジェクトで作業しています。オブジェクトを互いに参照させるための良い方法を探しています。通常、私は各オブジェクトにポインタを置き、一緒にリンクします。この特殊なケースでは、ヒープオブジェクトはありません(少なくとも、コードを記述する際には作成しません。ベクターは内部的に別のページにある可能性があります)。ユニークIDのリストを格納し、このIDをそれらを知る必要のあるオブジェクトと共有するクラスを持つというアイディアを思いつきました。オブジェクトを参照するための良い方法

これは良い方法ですか?これを行うための他のより良い方法がありますか?

背景:このプロジェクトは、学問的な背景で解決されています。私たちは、学生や他の人々がこれに貢献していることを明確には知りません。また、スキルレベルは知られていませんが、おそらくそれほど高くはありません。ポインタを使用しないことで、少なくとも誤ってオブジェクトが削除されないようにすることができます。

編集:データを格納するためのベクトルの私達の使用を何だった一意のIDの考えに私を導い

。 STLコンテナが大量に行うことの1つは、コンテナをコピーすることです。これが私がポインタがうまくいくかどうか分からない理由です。ベクトル要素の単純なインデックスと同じですが、内容や順序が変更される可能性があります。

+2

"偶然にも偶然にもオブジェクトが削除されないようにすることができます。"決して愚かさのパワーを過小評価しないでください。 –

答えて

1

いいですか?

私の経験では、ユニークなIDのいたずらは、管理され、正しく管理されなければならないもう1つの事です。あるいは、すべての種類の奇妙な駄々をすべて吹き飛ばしてしまうでしょう。私はこのアイデアを使用した製品に一度取り組みました。私たちのバグのかなりの部分、さらにはメンテナンスの問題は、愚かなIDトラッキング変数について覚えなければならなかったことが原因でした。確かに、実装は非常に複雑で(境界線が狂っている)、実行されていたよりもはるかに簡単ですが、システムによって生成された一意のIDをすでに持っているときに対処するのはもう一つのことです。 。

これを行う他の方法がありますか?

ええ、ポインタを使用してください。

残念ながら、私はとにかく知っているようなスマートなポインタはありません。これは単に他の場所にあるオブジェクトを参照するために使うことができるので、ポリシーとドキュメントを通じて問題を強制する必要があります。これは弱点ですが、トラッキングやIDの方がはるかに優れていますが、これと同じように簡単に同じ問題が発生する可能性があります。

このような目的で使用できるスマートポインタに興味があるなら、私の最新のブログエントリに興味があるかもしれません。

0

ポインタを使用するだけで、その機能が実現します。何らかの理由で参照をシリアル化する必要がある場合は、一意のIDのようなものを使用してください。プロセス間で参照を送信する必要のないコードのみを書く場合は、ポインタを使用します。特にヒープオブジェクトがなく、所有権を考慮する必要がない場合は特にそうです。

0

実際にはポインタを使用できます。

インスタンスを削除しないようにするには、デストラクタをプライベートにします。 このようにして、インスタンスを破棄することはできません。

しかし、James McNellisが指摘したように、決して愚かさのパワーを過小評価することはありません。誰かが空き(ptr)を呼び出したり、インスタンス内のメモリを上書きしたりするのを防ぐことはできません。

+0

私の経験では、私の同僚や学生はC++に関する基本知識を持つ傾向がありますが、ソフトウェア設計や基礎的なメカニックに関する知識は限られています。つまり、彼らは「削除」について知っているが、「無料」についての手掛かりはない。 – DaClown

1

ベクトルを変更すると、ベクトル内のオブジェクトへのポインタが無効になる可能性があります。ベクトルの内容への長時間のポインタの作成を避けるべきです。

スマートポインタをベクターに格納する方がよい場合があります。

関連する問題