こんにちは。C++のことで質問です。
例えば、
class C { public: Data _data; }; class B { public: C _objectC; Data _data; }; class A { public: B _objectB; Data _data; }; class Data {};
このように、AがBをメンバに持っていて、BがCをメンバに持っている状況で、DataというクラスのオブジェクトをA、B、Cそれぞれに共通して持たせたいのですが、(色々省略して書きます)
class C { public: Data _data; void setData(Data& d) { _data = d; } }; class B { public: C _objectC; Data _data; void setData(Data& d) { _data = d; _objectC.setData(d); } }; class A { public: B _objectB; Data _data; void init() { _data.addData(/*データを色々セット*/); _objectB.setData(_data); } }; class Data {};
のように、参照渡しで_dataを渡していくという方法はC++的にアリなのでしょうか?参照渡しを使ったのは、Dataクラスはなんらかのデータを保持したりその中かから検索したりするだけのクラスなので、中身の全く同じオブジェクトのコピーをわざわざ3つも作るより、1つのオブジェクトを共有したほうがメモリの節約になるんじゃないかと思ったからです。それとも、
class C { Data* _data; void setData(Data* d) { _data = d; } }; class B { public: C _objectC; Data* _data; void setData(Data* d) { _data = d; _objectC.setData(d); } }; class A { public: B _objectB; Data _data; void makeData() { _data.addData(/*データを色々セット*/); _objectB.setData(&_data); } }; class Data {};
のように、Aでオリジナル?のDataオブジェクトを作り、そのポインタをB,Cに渡していくという方法のほうが良いでしょうか?というより、ポインタを使うこと以外でこの2つのやり方に違いはあるのでしょうか?同じ値を参照しているという点ではどちらも同じに思えるのですが、、、イマイチ参照渡しが理解できていないのかもしれません。よろしくお願いします。
<2017/1/26 追記>
こんばんは。皆さん回答ありがとうございます。僕の例えが少し大雑把すぎたので、もう少し付け加えさしてください。
AはB、Cを管理する1つのおおきなクラスで、プログラムの最初から最後まで生きている?(すみません、言葉が見つかりません。。)寿命の長いオブジェクトです。AはメンバにBをいくつか持っていて、そしてBもCを複数持っている、そしてCはこの中で言うと最小単位のようなオブジェクトです。また、B,CはAが削除されるまで削除されないオブジェクトです。このABCのオブジェクト全体で共有したいデータがいくつかあり、それをどうやって共有しようかと思い質問しました。
例えば、クラスCの中にData型のオブジェクトdataを用意して、clsAobj.clsBobj.clsCobj.dataのようにすればアクセスできますよね(public指定を前提とする)?
majiponiさんのおっしゃった、この方法ももちろん考えたのですが、Cは複数あるので、内容の同じオブジェクトをいくつも持つのは無駄ではないかと思い、使いませんでした。
質問しておいてなんだという話になりますが、少しでもメモリが節約できればと思い参照を使おうとしたけれど、実際ポインタを使った方法と参照を使った方法でメモリの使用量に大きなさはあるのでしょうか?
オブジェクトの共有目的で参照を使った場合、寿命の管理が難しくなり、また、混乱しやすいと思っています。
raccyさんのおっしゃったように、自分があとで見て混乱しないようにするためにも、ひねくれて参照なんて使わずに、ポインタを使ったほうがまだ安全なのではないかと、回答を読んでいるうちに思いました。また、シングルトンというのもあるようですが、そこまでするほどの物でもないしなぁといった感じです。結局、どうするのがベストなのでしょうか?
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/01/26 03:42
2017/01/26 11:29
2017/01/26 17:34
2017/01/28 20:06