クラスベースのプログラミング言語に詳しい人来てくれ!!

就職
Programming concept isometric icon, laptop with program code on screen, data visualization dark neon vector
スポンサーリンク
1: 以下、5ちゃんねるからVIPがお送りします 2018/10/23(火) 22:29:46.710 ID:NJmy1iRfp
例えばクラスAがクラスB型のメンバ変数を持つとする
Aのインスタンス生成時にそのメンバ変数はコンストラクタで初期化されるとする
逆にクラスBはクラスA型のメンバ変数を持つとする
Bのインスタンス生成時にそのメンバ変数はコンストラクタで初期化されるとする

この状況でAあるいはBのインスタンスを生成したらどうなる?
Aのインスタンス生成→B型のメンバ初期化→B型のメンバが持つA型のメンバ初期化→B型のメンバが持つA型のメンバが持つB型のメンバが初期化→…以下ループ
で無限にメモリ消費するのでは?
という気がするのだが

引用元: ・クラスベースのプログラミング言語に詳しい人来てくれ!!

2: 以下、5ちゃんねるからVIPがお送りします 2018/10/23(火) 22:31:29.408 ID:1TTybdWLa
コンパイルエラーじゃん?

3: 以下、5ちゃんねるからVIPがお送りします 2018/10/23(火) 22:32:08.662 ID:ImtiPHlD0
循環参照は悪い設計
初期ループ書いてるならエラーなる

5: 以下、5ちゃんねるからVIPがお送りします 2018/10/23(火) 22:33:47.181 ID:NJmy1iRfp
>>3
循環参照っていうのかこれ
エラーになるのか

6: 以下、5ちゃんねるからVIPがお送りします 2018/10/23(火) 22:34:10.105 ID:IB1mbN5z0
やったことないからわからんけどコンパイル時に検査する言語があってもおかしくはない

12: 以下、5ちゃんねるからVIPがお送りします 2018/10/23(火) 22:37:25.201 ID:ImtiPHlD0
>>7
コンパイラ通っても初期化ループ作ったらどのみち実行時エラーだぞ

15: 以下、5ちゃんねるからVIPがお送りします 2018/10/23(火) 22:41:18.618 ID:k8PlZm4Q0
>>14
単にメモリを全部食い潰してメモリ不足になるだけ

19: 以下、5ちゃんねるからVIPがお送りします 2018/10/23(火) 22:44:40.447 ID:NJmy1iRfp
>>15
>>16
あー、やっぱメモリが死ぬのか
怖いな

16: 以下、5ちゃんねるからVIPがお送りします 2018/10/23(火) 22:41:19.786 ID:ImtiPHlD0
>>14
いやいや判定じゃなくてスタックかメモリの枯渇で

22: 以下、5ちゃんねるからVIPがお送りします 2018/10/23(火) 22:46:30.859 ID:k8PlZm4Q0
>>17
C++の場合、それが原因で「そもそも書くことができない」だな
必ず、どちらか片方を宣言のみで定義しない状態にしたまま使わなければならない
そして宣言のみのクラスを(ポインタでも参照でもなく)メンバーにするには定義が必要
ループせずとも、

class A;
class B {
 A m_a;
};

だけでコンパイルエラーだ

8: 以下、5ちゃんねるからVIPがお送りします 2018/10/23(火) 22:35:48.266 ID:H252qrWK0
最初にクラス宣言するほうで失敗するだろ

10: 以下、5ちゃんねるからVIPがお送りします 2018/10/23(火) 22:37:01.346 ID:OTJlRgHm0
3すくみ?

13: 以下、5ちゃんねるからVIPがお送りします 2018/10/23(火) 22:39:12.125 ID:k8PlZm4Q0
class A { private B m_b; }
class B { private A m_a; }

ってこと?

class A {
 private B m_b;
 public A() { m_b = new B(this); }
}
class B {
 private A m_a;
 public B(A a) { m_a = a; }
}

でいいじゃん

23: 以下、5ちゃんねるからVIPがお送りします 2018/10/23(火) 22:46:31.839 ID:NJmy1iRfp
>>20
>>21
それは尤もなのだが単純にどうなるのか気になった

24: 以下、5ちゃんねるからVIPがお送りします 2018/10/23(火) 22:47:19.126 ID:k8PlZm4Q0
>>23
普通に無限ループになるだけ
void f(){ g(); }
void g(){ f(); }
と同じ

27: 以下、5ちゃんねるからVIPがお送りします 2018/10/23(火) 22:52:14.113 ID:NJmy1iRfp
>>24
なんかクラスって定義が循環しててもコンパイル通ったりするから無限ループでもなんとかなったりするのかなって思ったけどそんなことはないのか

class A {
 static A a
}

こういうのはコンパイル通るからさ

29: 以下、5ちゃんねるからVIPがお送りします 2018/10/23(火) 22:55:40.894 ID:k8PlZm4Q0
>>27
staticメンバーは

namespace A{
 class A a;
}

class A {}

みたいなもんだからな

28: 以下、5ちゃんねるからVIPがお送りします 2018/10/23(火) 22:53:35.560 ID:NJmy1iRfp
>>26
今手元にPC無くて試せない…
すまぬ

35: 以下、5ちゃんねるからVIPがお送りします 2018/10/23(火) 23:14:18.114 ID:NJmy1iRfp
>>34
おお、サンクス
実行エラーになったか

38: 以下、5ちゃんねるからVIPがお送りします 2018/10/23(火) 23:20:46.109 ID:0E/TnsgL0
>>35
Javaはコンパイルはできるけど実行するとエラーだった

と書いてあるよ

40: 以下、5ちゃんねるからVIPがお送りします 2018/10/23(火) 23:27:00.236 ID:NJmy1iRfp
>>38
PCが返ってきたら試してみる

41: 以下、5ちゃんねるからVIPがお送りします 2018/10/23(火) 23:28:08.953 ID:0E/TnsgL0
>>40
ん?
実行エラーが発生したと言ってるのだが

46: 以下、5ちゃんねるからVIPがお送りします 2018/10/23(火) 23:31:11.682 ID:NJmy1iRfp
>>41
自分が使ってるコンパイラではどうかなって

21: 以下、5ちゃんねるからVIPがお送りします 2018/10/23(火) 22:45:29.037 ID:ImtiPHlD0
マトモに設計したらそんな作りにはならんよな

32: 以下、5ちゃんねるからVIPがお送りします 2018/10/23(火) 23:03:15.285 ID:k8PlZm4Q0
staticはC++時代にキーワードを使い回したのをそのままJavaにもC#にも継承してる悪しきキーワードだからなぁ
VBは糞と事あるごとに言う俺だが、同じものがSharedキーワードになってるのは評価してる
MustOverrideとかOverridableとかもabstractやvirtualより意味が明確で好き

39: 以下、5ちゃんねるからVIPがお送りします 2018/10/23(火) 23:25:18.515 ID:NJmy1iRfp
>>36
普通の関数呼び出しとコンパイル結果違うとしてもvirtualの本来の意味は「実質的な」とか「事実上の」みたいな意味だしうーん…って感じだ
Overridableは良いな
これぐらい直接的にするべきだ

37: 以下、5ちゃんねるからVIPがお送りします 2018/10/23(火) 23:16:25.067 ID:x6Ix/fhU0
sharedはスレッドグローバルの意
https://i.imgur.com/AWau1RV.jpg

45: 以下、5ちゃんねるからVIPがお送りします 2018/10/23(火) 23:31:02.055 ID:ih5nR3+80
なんかチェックスタイルみたいなやつで指摘されるはず

就職
スポンサーリンク
りょうたろうをフォローする
スポンサーリンク
プログラミングまとめ速報ちゃんねる

コメント

タイトルとURLをコピーしました