2ちゃんねる スマホ用 ■掲示板に戻る■ 全部 1- 最新50    

■ このスレッドは過去ログ倉庫に格納されています

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

1 :以下、?ちゃんねるからVIPがお送りします:2018/10/23(火) 22:29:46.710 ID:NJmy1iRfp.net
例えばクラスAがクラスB型のメンバ変数を持つとする
Aのインスタンス生成時にそのメンバ変数はコンストラクタで初期化されるとする
逆にクラスBはクラスA型のメンバ変数を持つとする
Bのインスタンス生成時にそのメンバ変数はコンストラクタで初期化されるとする

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

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

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

4 :以下、?ちゃんねるからVIPがお送りします:2018/10/23(火) 22:33:01.689 ID:NJmy1iRfp.net
>>2
これコンパイル出来ないの?
文法的にはおかしくないと思うのだが2クラスが互いに相手をメンバとして持つのは不可みたいなルールあるの?

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

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

7 :以下、?ちゃんねるからVIPがお送りします:2018/10/23(火) 22:35:05.127 ID:NJmy1iRfp.net
循環参照で調べたわ
C++だとエラーになるみたいだな
JavaとかC#でもそうなんだろうか

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

9 :以下、?ちゃんねるからVIPがお送りします:2018/10/23(火) 22:36:03.705 ID:ImtiPHlD0.net
コンパイラによってはワーニング吐くな

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

11 :以下、?ちゃんねるからVIPがお送りします:2018/10/23(火) 22:37:15.312 ID:NJmy1iRfp.net
文法的にはおかしくないのにこれでエラー吐けるコンパイラは賢いな

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

13 :以下、?ちゃんねるからVIPがお送りします:2018/10/23(火) 22:39:12.125 ID:k8PlZm4Q0.net
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; }
}

でいいじゃん

14 :以下、?ちゃんねるからVIPがお送りします:2018/10/23(火) 22:40:04.180 ID:NJmy1iRfp.net
>>12
初期化でループ作るとエラーになるのか
どうやって無限ループ判定してるんだろ

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

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

17 :以下、?ちゃんねるからVIPがお送りします:2018/10/23(火) 22:43:06.814 ID:0E/TnsgL0.net
>>14
クラスAをコンパイルするにはクラスBがどういうものか判明している必要がある
じゃあクラスBをコンパイルしようとするとクラスAが判明していない
となる気がするな
実際にどうなるかは試したことないから気になるが

18 :以下、?ちゃんねるからVIPがお送りします:2018/10/23(火) 22:43:29.168 ID:NJmy1iRfp.net
>>13
俺が想定してたのは

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

こうかな

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

20 :以下、?ちゃんねるからVIPがお送りします:2018/10/23(火) 22:44:47.550 ID:k8PlZm4Q0.net
>>18
そんな馬鹿な書き方はしないのが正解

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

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

class A;
class B {
 A m_a;
};

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

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

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

25 :以下、?ちゃんねるからVIPがお送りします:2018/10/23(火) 22:51:27.970 ID:k8PlZm4Q0.net
実際にはこっちのほうが正しいか

void newA() { ctorA(); }
void ctorA() { newB(); }
void newB() { ctorB(); }
void ctorB() { newA(); }

26 :以下、?ちゃんねるからVIPがお送りします:2018/10/23(火) 22:51:54.228 ID:0E/TnsgL0.net
>>23
気になったら実際に試せよ

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

class A {
 static A a
}

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

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

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

namespace A{
 class A a;
}

class A {}

みたいなもんだからな

30 :以下、?ちゃんねるからVIPがお送りします:2018/10/23(火) 22:56:10.956 ID:UwQWSxwZ0.net
最近、Arduinoを始めたおれにはどうでもいい話だった

31 :以下、?ちゃんねるからVIPがお送りします:2018/10/23(火) 22:58:45.035 ID:NJmy1iRfp.net
>>29
切り離した方がしっくりくるね

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

33 :以下、?ちゃんねるからVIPがお送りします:2018/10/23(火) 23:07:49.033 ID:NJmy1iRfp.net
>>32
VBは使ったことないけどstaticの代わりにSharedってキーワードなのか
abstractはまだしもvirtualは単語選び悪いよな

34 :以下、?ちゃんねるからVIPがお送りします:2018/10/23(火) 23:08:05.385 ID:0E/TnsgL0.net
>>28
無能
Javaはコンパイルはできるけど実行するとエラーだった
コンパイルの実装に依存するっぽいな
動的ライブラリを利用している場合なら事前に実装が定まっていなくてもコンパイルできる
そういった方式を可能にするコンパイラであればBがコンパイルされていなくてもAはコンパイルできるんだな
JavaもAとは無関係にBを変更できるからコンパイルできるんだな
なるほど

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

36 :以下、?ちゃんねるからVIPがお送りします:2018/10/23(火) 23:14:57.031 ID:k8PlZm4Q0.net
>>33
たぶん、「普通の関数呼び出しと同じ構文だけどコンパイル結果が違うからvirtual関数だな!」って感じに決めたんだろうな
35年前はそれでよかったんだろうけど、まあ歴史的経緯ってやつだ

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

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

と書いてあるよ

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

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

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

42 :以下、?ちゃんねるからVIPがお送りします:2018/10/23(火) 23:29:08.816 ID:9InZUz+Ma.net
メンバをポインタにして
A* a = new A(new B);
みたいにすれば?

43 :以下、?ちゃんねるからVIPがお送りします:2018/10/23(火) 23:29:46.092 ID:9InZUz+Ma.net
A a(new B);
だった

44 :以下、?ちゃんねるからVIPがお送りします:2018/10/23(火) 23:30:46.904 ID:k8PlZm4Q0.net
>>39
特定の実行アドレスと関連づけられない、という意味ではやっぱり当時の感覚だと「virtual」なんだよ
現代的な考え方をすればもっと抽象的に「関数の形式で書ければ関数」と考えるべき、というだけで

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

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

総レス数 46
13 KB
掲示板に戻る 全部 前100 次100 最新50
read.cgi ver 2014.07.20.01.SC 2014/07/20 D ★