例えば、
学校クラス--学年クラス--学級クラス--班クラス
というクラスがあった場合、それぞれのクラスには集約といわれる関連があると思いますが、この場合の実装は一般的にどのようにされているのでしょうか。
自分の考えでは、
class Gakko
{
vector<Gakunen> GakunenObj;
};
class Gakunen
{
vector<Gakkyu> GakkuObj;
};
class Gakku
{
vector<Han> HanObj;
}
class Han
{
void ShowName();
}
このように学校クラスが消えれば内包される学年クラス・学級クラス・班クラスも消える必要があるので、オブジェクトの寿命を親のクラスと同じにするため、各クラスに子クラスのインスタンスを持たせています。
この方法だと班の名前を表示したい場合、
Gakko Obj;
Obj.GakunenObj[a].GakkuObj[b].HanObj[c].ShowName();
といった感じでアクセスすることになると思います。
ただ、こんな長たらしいプログラムコードを見たこともありませんし、実際は通常の関連としてクラスのポインタを持たせた方がいいでしょうか。
突っ込みどころ満載ですが、よろしくお願い致します。
No.3ベストアンサー
- 回答日時:
>この方法だと班の名前を表示したい場合、
>Gakko Obj;
>Obj.GakunenObj[a].GakkuObj[b].HanObj[c].ShowName();
>といった感じでアクセスすることになると思います。
上記の例の場合、直接Hanに対してアクセスするのではなく、
Gakko Obj;
... Gakko の中身生成 ...
const Gakunen& GakunenObj = Obj.Gakunen[a];
const Gakku& GakkuObj = GakuenObj.GakkuObj[b];
const Han& HanObj = GakkuObj.HanObj[c];
HanObj.ShowName();
のような流れになると思います。
また、個人的にはGakkoオブジェクトから直接班の名前を参照する、という状況自体が間違っているのだと思います。
大概「どこのクラスのどこの班の名前だけを表示する」という状況は余りなく、学年単位、クラス単位で処理を行うことが多いと思います(そのためにクラスが別になっているわけですし)。
なので、オブジェクト指向的には、「班の名前を表示する」というのが実は「その学校に所属している班の一覧を表示する」という処理の一部だとしたら、Gakkoクラスに所属している班の一覧を表示するというメソッドを実装するのがより正しいと思います。
お返事ありがとうございます。
参照を利用してアクセスできるんですね。
あとご指摘の通り、Gakkoクラスに適切な操作としては「所属している班の名前を一覧表示する」が適切ですね。
集約の実装としては、親クラスに子クラスのインスタンスを持たせ、参照を利用して子クラスの目的の操作にアクセスする。
という事でよろしいでしょうか。
あと、
Obj.GakunenObj[a].GakkuObj[b].HanObj[c].ShowName();
で直接アクセスすることに比べ、
const Gakunen& GakunenObj = Obj.Gakunen[a];
const Gakku& GakkuObj = GakuenObj.GakkuObj[b];
const Han& HanObj = GakkuObj.HanObj[c];
HanObj.ShowName();
で参照を使ってアクセスすることの方がよいメリットというのがいまいち分かりません。(前者の方がオーバーヘッドが大きいとか、コードが読みにくくなるとかでしょうか?)
No.4
- 回答日時:
>const Gakunen& GakunenObj = Obj.Gakunen[a];
>const Gakku& GakkuObj = GakuenObj.GakkuObj[b];
>const Han& HanObj = GakkuObj.HanObj[c];
>HanObj.ShowName();
>で参照を使ってアクセスすることの方がよいメリットというのがいまいち分かりません。(前者の方がオーバーヘッドが大きいとか、コードが読みにくくなるとかでしょうか?)
この場合はHanObj.ShowName();単体ですからメリットが見えませんが、オブジェクト指向プログラムで組んでいると、大概において「同じオブジェクト群に対して複数の操作を行う」ということが良くあります。
例えば、あるクラスの班員全員の名前を表示して着席させる、という場合、
const Gakunen& GakunenObj = Obj.Gakunen[a];
const Gakku& GakkuObj = GakuenObj.GakkuObj[b];
cont int n = GakkuObj.length();
for( int i=0; i<n; ++i)
{
const Han& HanObj = GakkuObj.HanObj[c];
HanObj.ShowName();
HanObj.SitDown();
}
というコーディングになります。
HanObjのオブジェクトを取り出すのにアドレスの計算は
・ObjからGakunenObjを取り出すのが1回
・GakunenObjからGakkuObjを取り出すのが1回
・GakkuObjからHanObjを取り出すのがn回(=Hanの数)
となり、合計n+2回です。
これを
cont int n = Obj.GakunenObj[a].GakkuObj[b].length();
for( int i=0; i<n; ++i)
Obj.GakunenObj[a].GakkuObj[b].HanObj[i].ShowName();
Obj.GakunenObj[a].GakkuObj[b].HanObj[i].SitDown();
}
とした場合、同じことをしているはずなのに、アドレスの計算は
・GakkenObj[a]
・GakkuObj[b]
・HanObj[i]
をforループのたびに計算しなおしていますから、n×3×2回(ShowNameとSitDownの分)となり、参照を利用した場合と比べ6倍近いアドレス計算量が必要となります。
最近のコンパイラですと上記のような単純な計算については最適化してくれるかもしれませんが、量が増えれば増えるほどバカにならない重さになる場合があります。
また、単純に添え字が大量にあるよりも現在どのオブジェクトを操作しているのか、パッとみで分かりやすい、というのもメリットかと思います。
あと、個人的にはちゃんとしたオブジェクト指向の本を一度読まれることをお勧めします。
お返事ありがとうございます。
分かりやすくて大変勉強になりました。
オブジェクト指向の本は1冊しかまだ読んでいませんので他にもいろいろ読んでみたいと思います。
あと、基本的な本しか読んだことがないので他の人が書いたコードもたくさん読んで、コーディングのスタンダード?を知ったほうが良さそうですね。
No.2
- 回答日時:
いきなり
Obj.GakunenObj[a].GakkuObj[b].HanObj[c].ShowName();
なんてアクセスをするのかなぁ? 参照で逃げられることも多いような気がするけど....
ところで, 「クラスのポインタを持たせる」として, どのような実装を考えていますか?
No.1
- 回答日時:
>クラスのポインタを持たせた方がいいでしょうか。
int array[20][20][30][10][30];
array[a + 1][b][c1 * 3 + c2][d][e1 + e2] = 13 - array[a + 1][b][c1 * 3 + c2][d][e1 + e2];
n = array[a + 1][b][c1 * 3 + c2][d][e1 + e2] + 22;
array[a + 1][b][c1 * 3 + c2][d][e1 + e2] = n + array[a + 1][b][c1 * 3 + c2][d][e1 + e2 + 1];
と
int array[20][20][30][10][30];
int *p = &array[a + 1][b][c1 * 3 + c2][d][e1 + e2];
*p = 13 - *p;
n = *p + 22;
*p = n + *(p + 1);
と、どっちの方が良いと思いますか?
答え、聞くまでもありませんよね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・【大喜利】【投稿~1/31】『寿司』がテーマの本のタイトル
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・【大喜利】【投稿~1/20】 追い込まれた犯人が咄嗟に言った一言とは?
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PIC12F1822でLED調光器を作りたい
-
最初に聞かれたこと
-
C言語 関数、変数の宣言について
-
C言語について(初心者)
-
gccを行ってもexeファイルが生...
-
C++でデスクトップGUIアプリ開...
-
10進数からN進数に変換するプロ...
-
今ってプログラミング言語は何...
-
逆コンパイルと逆アセンブルの...
-
プログラミングの課題がわから...
-
C言語について。
-
c#のTLS1.2での通信について
-
プログラミングc++を全く分か...
-
DNCL(共テ用プログラミング言語...
-
DNCL(共テ用プログラミング言語...
-
プログラミングでArduinoのc++...
-
swift言語の最適化 swift最適化...
-
バッチファイルで以下のような...
-
MACで動く実行ファイルをWindow...
-
LinuxカーネルのCFSで用いられ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
既定のコンストラクタがない?
-
FriendとPublicの違い。。。
-
ダイアログ表示時にチェックボ...
-
(UWSC) 「#32770」の意味わかり...
-
クラスのアドレスを引数として...
-
イベントにAddHandlerされてい...
-
エディットコントロールでEnter...
-
MFCのCListCtrlでスクロールを検出
-
MFCアプリのコマンドラインでパ...
-
エディットコントロールのイベ...
-
【ASP.NET】 独自で作成したク...
-
C++ protectedにアクセス不可
-
[MFC] CWnd::MessageBoxの警告...
-
C++/CLIからC++の呼び出しで例外
-
C#で通常のbuttonコントロール...
-
C++で継承元のクラスの代入演算...
-
C#で定数クラスをシングルトン...
-
ボタンのオーナードローについて
-
MFCのドラッグ&ドロップについて
-
オーバーライド関数の呼び出し...
おすすめ情報