なぜC++はあんなに難しいのか?

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
なぜC++はあんなに難しいのか?

オブジェクト指向やUMLを理解し
巨大な仕様のC++を理解し
モノを作るのは骨が折れます。

C++ってCと比べて(あえてこう書かせてもらう)成功したと
言えるのでしょうか?
普及したから良いものか?
普及したのは良いから?

多重継承ってなに?
純粋仮称関数ってなに?
多態性ってなに?
レイトバインディングってなに?
アーリーバインディングってなに?
フラストレーションが溜まってます。

K&Rとストラウス〜の考え方は違うとおもう今日このごろ。

つうかOOPが理解できない小生のぐちだね。やれやれ。
2デフォルトの名無しさん:2001/02/21(水) 21:40
ストラウストラップ。ストラウス罠と覚えましょう
3デフォルトの名無しさん:2001/02/21(水) 21:55
ストラウストラップの衝撃発言がありましたね。
C++はタチの悪いジョークだと。どこに載ってたかは失念。

COMはC++のものではないですが、COMバイナリ互換と
インターフェイスの分離はたとえ理想的なメカニズムでは
ないにしろ、単なる創意工夫を越えて1歩前進、なのでは
ないですか? 実際にはC++の果たしている役割は大きいと
思いますが。
実装の継承よりインターフェイスの分離のための純粋仮称関数。
しかもC並の動作効率を望めるということで、逆にこれ以外なにが
あるの?と思いますけど。 環境として。
妥協の産物であるけれどもそれは偉大な妥協、現実からの逃避を
しない仕様、ということで。どうですか?
4デフォルトの名無しさん:2001/02/21(水) 22:00
C++は//コメント〜
って書き方が出来るから使いだした(笑)
5デフォルトの名無しさん:2001/02/21(水) 22:00
文法を理解出来ても、それだけじゃプログラムが組めないところがイタイ
何をどうクラスにして良いかわからんよ。

C好きじゃ〜、お前だけが頼りだ・・・asmにperlも愛してるぜぇ〜
61です:2001/02/21(水) 22:10
>3

>ストラウストラップの衝撃発言がありましたね。
>C++はタチの悪いジョークだと。どこに載ってたかは失念。

ほんとですか?
C++の仕様はどう考えても頭に入りきる大きさじゃないしね。
Cのバイブルと比べてもC++は異常ですね。
ストラウス〜もベルの人ですよね。
抽象的でパワフルなUNIXやその先のPLAN9の研究者との
関わり合いはどうなのでしょうかね?

ベルの産物にしては疑問・・・
7デフォルトの名無しさん:2001/02/21(水) 22:10
>>1
えーとねぇ。
後半の多重継承云々ってところから下のごちゃごちゃしたの
全てを覚えるよりも、オブジェクト指向(用語じゃなくて概念を)
をきっちり理解さえすればそれだけで他の化石プログラマ達を
駆逐することができる分野があることが魅力でしょうか?
逆にオブジェクト指向が理解できない人にとってはゴミ同然の
物であることは確かだと思います。
8デフォルトの名無しさん:2001/02/21(水) 22:19
STLが便利なのだ。。。
9デフォルトの名無しさん:2001/02/21(水) 22:22
>>1
むずかしくねぇよ。おめぇの頭が悪いの。
10名無し:2001/02/21(水) 22:25
オブジェクト指向を知りたいなら、GUIを作ることだね。
ありがたみがわかるよ。
111です:2001/02/21(水) 22:26
>7

今は言語からはなれてオブジェクト指向&UMLをやってます。

C++とJAVAを同時に習得しろという上からの命令で
苦しんでいる小生。鬱。
その前にオブジェクト指向を・・・でもわからん。
XML,CORBAも同時進行。
全部中途半端。
でもうごく。こぇー。
上のひとはそれで満足。
機能追加拡張なんて絶対できん。
12デフォルトの名無しさん:2001/02/21(水) 22:27
>>9
いやぁ、この人(1)言語の仕様を全て覚えようとしてるみたいだぞ。
C++ってオブジェクト指向を覚えてから何が必要なことか
わかってないと覚えることばっかり多くなっちゃって
役に立たないし、すげー複雑だからハマっちまうと最悪の部類だと思うぞ。
先輩から最短コースで教えてもらった俺は幸福な奴だと思う。
131です:2001/02/21(水) 22:31
>9

どうしたら頭よくなりますか?
どうやっておぼえた???
おぼえたときC++に対する疑問とかあった?
14デフォルトの名無しさん:2001/02/21(水) 22:32
シロートですけど。
人様の作ったクラスを便利&お気楽に
使うには、これほど極楽なものもないと思うんですが。
ま正しい理解とは違うでしょうが、極楽。
15デフォルトの名無しさん:2001/02/21(水) 22:33
かぶった…
おれ9じゃないです。
161です:2001/02/21(水) 22:35
>12

サンキュー。
とりあえずざっくり覚えることにする。
要領よくやることにするよ。
17デフォルトの名無しさん:2001/02/21(水) 22:36
>>11
まずは何よりこの↓本ですよ奥さん。
http://www.fry.is.sci.toho-u.ac.jp/~takada/twosoft/technic/81.html
もし、もってなかったら、さっそく買ってくることをお勧めします。
なんか紹介にはC++の入門書が必要だかなんだかと書いてありますが、
とりあえずこの本を読むことが1番いいと思います。
次にやることはオブジェクト指向関係の本を片っ端から
読み漁る事だと思います。駄目な概念を知るため。
基本的に駄目な本の方が多いから。
C++の言語それ自体は二の次。
181です:2001/02/21(水) 22:45
>>17
ありがとう。

C++の言語それ自体は二の次というのは承知です。
でも仕事でC++すぐ使うんでやらざるをえません。
まわりもシロート。おれはバカ。

19C++は簡単だよ:2001/02/21(水) 22:48
class,template
この二つを完全に理解すればC++は8割理解したも同然。
ね!簡単でしょ(藁>1
201です:2001/02/21(水) 22:52
C++で動けばいいと良しとする上司。
作ったプログラムはユーザ管理の基礎のぶぶん。
でも仕様は変てこ。
ここから発展させるのでこのシステムの行く末は見えてます。
211です:2001/02/21(水) 22:55
>>19

とりあえずC++組めるよ。
とりあえずね。

わからないところはなんとなく組んでる。
22デフォルトの名無しさん:2001/02/21(水) 23:13
お、おれも>>17の本はお勧めだ〜。
実はおれは1以上にC++組めないと思うけど、
この本読んだら元気出たよ。
がんばれ1。
23デフォルトの名無しさん:2001/02/21(水) 23:14
ストラウストラップのインタビューはジョーク記事だよ。
URL忘れたけどさ。

修得困難な仕様にしてプログラマに仕事を与えるためだとか云々

でも、ジョークにならないよなあc++の場合。

24デフォルトの名無しさん:2001/02/21(水) 23:20
俺にとってもOOPは、ものすごい壁だったよ。
COBOLを4年Cを3年した後のC++。
受け入れるのに3年かかった。

しかし、受け入れる事ができた今、OOPはやっぱ素晴らしいと思う。
俺の場合は、ポリモーフィズムの現実の利点が理解できたところが
壁を越えたと思ったところでした。

がんばれ1
25デフォルトの名無しさん:2001/02/21(水) 23:44
1です。
元気が出てきたみたい。がんばるよ。
ありがとう。2CHの人は好きだ。
なんかつよくなれるよ。
26デフォルトの名無しさん:2001/02/22(木) 00:13
Windowsで
軽い開発はVBにのっとられ
思い開発はVC#

マクでも先端開発はObjectiveCだっけ?

CGIにしてもPerl開発が体勢かな。
JAVAが今受けているのもあるね。

すべてC++がむちゃくちゃだから
C++から脱却したいわけです。

生産効率の低いC++は滅びていくだけでしょうね。
アセンブラと同じ運命。
27デフォルトの名無しさん:2001/02/22(木) 00:19
C++ とレイトバインディングって直接関係あったっけ?

>>17
の本は OO の本としては良い本ですが、C++ の本としては微妙です。
ポインタの配列をデフォルトで使われると泣きます。
どっちかつーと Java っぽいコーディングだと思う。
28デフォルトの名無しさん:2001/02/22(木) 00:20
VC#で重い開発はないと思うが…
CLRがネイティブコードより速い事はないはずだ…

C++で生産効率が悪いのは最初のうちだけ。
馬鹿な開発者が再利用性のないコード書き散らしてる間は
「使えない」という判断にならざるをえない。
でも、性能の良いライブラリがそろえば、開発はクラス同士
を結合する作業だけになってくはずっすよ。それがOOPっす。

C++をけなす奴==「自分は馬鹿です」と公表してる奴、だと思うが。
天に向かって唾を吐くって知ってます?
29デフォルトの名無しさん:2001/02/22(木) 00:21
>26
ふぅ〜。
Perlじゃ機能的に制限ありすぎて掲示板やメール程度が限界。
JavaはMSに見切りをつけられ死亡寸前。
VBはVCで作ったCOMオブジェクトがないと何も出来ない。
VCは不滅だよ。
ただ扱えない人間が無理してVC使う必要がなくなるだけ。
30デフォルトの名無しさん:2001/02/22(木) 00:30
Java出来なくなったWinが滅亡寸前ではないのか。
かつてWin3.0(2.0もあったらしいが)が日本に入ってきた頃、
劣悪OSだが数でUNIX/X-Windowを凌ぐだろうと言われていた。
同じように劣悪携帯Javaが数でWinを凌ぐんでわ...あ、C++スレだった。
C++は機能は足りなくないんだが、後発のOO言語より記述が多く習得し難い。
でもOO言語習得したら第三世代言語にはもう戻れない...
31デフォルトの名無しさん:2001/02/22(木) 00:35
>30
iモードは自滅しました。
無理にJava対応にしなくても専用の言語作ればいいのに。
基本的にiモードJavaってJava互換ってだけで
似て非なるものなんだしさ・・・
それにしてもJavaは開発環境が悪い。
32デフォルトの名無しさん:2001/02/22(木) 00:38
>>31
Javaスレではないが…
JavaにIDEは要らん。もし作るならVJ++みたいに
ネイティブで作れ。あほベンダども。

10年後ならかまわんけどね。マシン速いだろうし。
33デフォルトの名無しさん:2001/02/22(木) 00:42
10年後は量子コンピュータの登場によりVB厨房は死滅します。
と思ったが死滅するのはVCか?
量子アルゴリズムでプログラム書ける奴はいるのだろうか?
すこぶる優秀な人間のみネイティブコードプログラムを作り
一般人はスクリプトが限界か?
34デフォルトの名無しさん:2001/02/22(木) 00:45
>>それにしてもJavaは開発環境が悪い。
そうか?
私には、SDKで十分だが(C++スレだって)
C,C++は滅びないと思うが、VC++は無くなってもかまわんな。
35デフォルトの名無しさん:2001/02/22(木) 00:49
>31
Javaが劣悪環境だって?
Winだって昔は、C言語なのにfarとnearとポインタが2種類あったり、
640KByteまでしか線形でメモリとれなかったりスゴかったんだぜ。
それに比べたら、携帯でメール出来た上、アプリ動くなんてスゴイじゃん。
36デフォルトの名無しさん:2001/02/22(木) 00:51
>10年後は量子コンピュータの登場によりVB厨房は死滅します。

VBスレで叩かれた注坊がC++叩いてる。自分の能力を高めるまで静かにしてなさい。
37デフォルトの名無しさん:2001/02/22(木) 00:52
↑引用文一行足りなかった。

>と思ったが死滅するのはVCか?
38デフォルトの名無しさん:2001/02/22(木) 01:31
C++は開発規模が大きくなればなるほど、破綻してる言語仕様のおかげで生産性鈍ってくる。
単体で性能の良いライブラリを複数組み合わせれば、それぞれが自分の世界を主張し合う
ので、ほとんど実現不可能でしょう。28はまともに開発したことないんだな。
39けろ:2001/02/22(木) 01:33
クラスを使っていくのは簡単だけど、キチンとしたクラス作るのは
なかなか大変。
Effective C++読んでたらC++が嫌になった、っていうような書き込み
が以前あったけど、それはわかるなあ。
ある程度のモノを作るのはそれほど難しくないし、バグ削減にも
非常に効果あるっていうのは実感してるけど、それを他人様に使って
もらいたいかというと話は別になるけろ。
40デフォルトの名無しさん:2001/02/22(木) 01:47
C++ というよりVCが難しい。何故にあんなに難しいの
41デフォルトの名無しさん:2001/02/22(木) 03:12
私はBCBでC++おぼえたよ。VCL激ラブ♥
42デフォルトの名無しさん:2001/02/22(木) 08:06
>C++ というよりVCが難しい。何故にあんなに難しいの
>私はBCBでC++おぼえたよ。VCL激ラブ♥

VCはMFCで作られてる(んだよね?)から固定ダイアログ画面が一杯開いて使いにくい。
BCBはVCLで作られてるからGUIの動きが良い。
43デフォルトの名無しさん:2001/02/22(木) 08:40
>>42
>VCはMFCで作られてる
VC++はVC++で作られました。とは書いてあったけど
MFCで作ったとは書いてないね。
俺はMFCなんて使ってないと思うな。
あれってでかいプロジェクトには全く向いてね−もん。
VC++を使い始めると必ずやらんでもええMFCを始める
ノータリンが多いのは何故?挙句の果てにはVC++で作ると
必ずMFCを使って組まなければならないとまで勘違いしてる奴まで
いてかなり鬱。
44デフォルトの名無しさん:2001/02/22(木) 09:12
今時MFC使ってる人はいないでしょ…
45デフォルトの名無しさん:2001/02/22(木) 09:29
>>43
スマソ、かつて俺がそのノータリンだった。
パッケージ同梱の入門書がMFCだからつられて始めちゃった。
で、3日も持たず撃沈。「MFCのプロフェッショナル」って
すごい人なんだろうなー。
46厨房:2001/02/22(木) 10:19
>>43
上に同じ。ノータリンです。

Winアプリは仕事上は社内ツールくらいしか作らないので、最近のトレンドは
知らないデス。
今時は何を使ってWinアプリ組めば良いですか? オススメは何ですか?
47デフォルトの名無しさん:2001/02/22(木) 10:27
4828:2001/02/22(木) 10:30
>38
コレクション用のテンプレートライブラリとか、
ホスト間通信のラッピングライブラリとか、
データベースとのコネクション管理のライブラリとか、
共有メモリ領域の管理モジュールライブラリとか、
最近ならXMLパーサとか、暗号化関係とか、

ミドルレベルのモジュールとして扱えるライブラリを
お借りしてプログラム組めば、非常に楽だぞ。

凝集度の低いモジュールを組み合わせようとしている
時点で設計者があほですな。
49デフォルトの名無しさん:2001/02/22(木) 11:23
>>47
そのジョークはもう飽きたよ。
まさか、お前そのジョーク、本気で信じてるわけじゃないよな?
50デフォルトの名無しさん:2001/02/22(木) 11:36
>>49
事実そのまんまじゃん。
51デフォルトの名無しさん:2001/02/22(木) 11:54
>>50
オブジェクト志向は、小さいプロジェクトには
あまり意味は無い。
プロジェクトが大きくなるほど
オブジェクト指向のありがたさがわかるのだよ。

一人ぼっちでプログラムしてる人には
C++の良さは理解できんかもね。プッ(w
52デフォルトの名無しさん:2001/02/22(木) 12:21
CとC++は明らかに設計時のコンセプトが違うような気がする。
Cはシンプルを目指している感じがするが、
C++は何でも詰め込もうとしている感じがする。
53デフォルトの名無しさん:2001/02/22(木) 12:35
うまく使えないからといって言語仕様のせいにするのは恥ずかしいね。
Cとの互換性や実行効率を確保しつつ機能拡張していった言語としては
非常によくできてると思うけどなあ。確かにとっつきは悪いけどプロの
道具と感じで使い込むほどに良さがわかるんだよね。
54デフォルトの名無しさん:2001/02/22(木) 12:47
>>53
うまく使えないとも、
それが言語仕様のせいであるとも言ってないのに、
勝手に勘違いするお前の方が恥ずかしいけどな(ワラ
55デフォルトの名無しさん:2001/02/22(木) 12:51
ダテュラやベッキやエドやエムエヂタ、WWWCは
MFcでないかな?DonuTはSDKか。
5653:2001/02/22(木) 12:57
>>54
仕様が破綻してるとか言ってるやついるじゃん
57デフォルトの名無しさん:2001/02/22(木) 12:58
ずいぶん上の>>28にレス

>C++をけなす奴==「自分は馬鹿です」と公表してる奴、だと思うが。
>天に向かって唾を吐くって知ってます?

アセンブラをけなすヤツ==「自分は馬鹿です」と公表している...

とアセンブラ使いは高慢チキに天狗になっていたら
生産性が低かったので滅びていました。

C++使っていても、もっと使いやすいものを知って
認める考えは持っておいたほうがいいよ。

JAVAやC#を批判する時には現状の使用感と言語仕様
というものをわけて考えたまえ。
58名無しさん@お腹いっぱい。:2001/02/22(木) 13:02
もともとCだから
以上
59デフォルトの名無しさん:2001/02/22(木) 13:07
組込型とクラスを同じように扱えるようにしようとしたのが
きっと悪夢の始まりだったんだな
60デフォルトの名無しさん:2001/02/22(木) 13:58
こうなったらObjective-Cの復活が望まれます。
http://users.pandora.be/stes/compiler.html
61デフォルトの名無しさん:2001/02/22(木) 13:59
MFCは要領よく使えばいいだけ。
まだ分らん奴が中にまぎれてるな・・。
62デフォルトの名無しさん:2001/02/22(木) 14:12
MSDNから使うものだけFavoritesとかに分けとけば、
超整理法ぽくAPIもMFCも分類ワケできるはずなんだけど。

他のOSに関してはしらないぷー。
63デフォルトの名無しさん:2001/02/22(木) 18:14
プログラム作法って、言語とは独立したものだと思うのね。
だから、C++が難しいというのは、OOPが理解できてないからであって、
言語のせいではないと思いまふ。MFCは必要な部分だけ使えばいいし、
使わなくたっていいわけだし。

関係ないっスけど、JAVAのsuperって表記、C++でも使えると便利だなぁと
思いません? 派生元が変わると書き直すの面倒だし(笑)
64デフォルトの名無しさん:2001/02/22(木) 18:31
>>57
28じゃないけど
28の人はどっちかっていうとC++マンセーな意見じゃなくて
オブジェクト指向マンセーの意見でしょう。
それに今オブジェクト指向+C++を受け入れることができる
柔軟性があるなら別に問題は無いんじゃないでしょうか?
65Del厨:2001/02/22(木) 18:50
C++は難しいのでオブジェクト指向まで到達するのにも時間がかかる。
66デフォルトの名無しさん:2001/02/22(木) 18:52
>>63
>関係ないっスけど、JAVAのsuperって表記、C++でも使えると便利だなぁと
便利だと思うので、たいていのクラスでは
class A : public B
{
  typedef B Super;
としてる。
67デフォルトの名無しさん:2001/02/22(木) 20:12
多重継承があるから文法には組み込みにくいのだろうね。
6838:2001/02/22(木) 20:21
C++に躍らされてる奴らが多いな。特に >>53 なんか(藁

本気でオブジェクト指向プログラミングというものを考えれば、
C++なんて欠点だらけのじゃじゃ馬だということがわかるはず。
自分がC++に操られてるだけって気付かないなんてかわいそーだぜ。(藁
もうちょっとおべんきょうしたらー?
6963:2001/02/22(木) 20:37
>>67
多重継承してても、同じ関数名がダブってなければ特定できるわけで。
本当にピンポイントで指定したいなら、今の文法と同じでSuperClass::func()と
呼べばいいかなと思ったわけ。モダンなライブラリでない(笑) MFCは多重継承
ほとんどしないんもんで、ほとんどがsuperで済んじゃう。

そういや、ベースクラスのポインタで引き回したい時、多重継承してると
先に指定した方の型にしかならないんだよね。構造的には理解できるけど、
これもなんか解決する方法ないかなぁ。 > C++
#設計が悪いという話もあるな。

Javaは new するなりその場で? 派生クラスを定義できるのが便利。
わずか1個の関数の挙動を変えたいだけで派生クラスを宣言しなきゃ
ならんC++に比べると便利な点が多い。可読性は下がるけど、妙な
クラスが大量に出来るよりはスマートな気がする。

C#ってこの辺りどうなんでそ。全然知らないんだけど...。
70デフォルトの名無しさん:2001/02/22(木) 21:00
>>69
superが型名だったらsuperクラスの関数呼び出しにしか
使わないわけじゃないでしょ? 
71デフォルトの名無しさん:2001/02/22(木) 21:13
>>68
具体的にどこが欠点だらけなのか指摘してみろよ。(藁
72デフォルトの名無しさん:2001/02/22(木) 21:16
>>63
C++が難しいのは言語仕様のせいではないって?
じゃあ、「Protected Abstract Virtual Base Pure Virtual Private Destructor」
がどんなもので、それを最後に使ったのがいつか説明できるかい?(藁
73デフォルトの名無しさん:2001/02/22(木) 21:27
C++は言語ではない。
Cでイベント駆動型フレームワークを作るための
拡張ライブラリである。
74デフォルトの名無しさん:2001/02/22(木) 21:37
>>72
63じゃないが、そりゃ論理のすりかえというものだろう。
それがわかるかどうかと実用の難しさとなんの関係もなかろう。
どんな言語だって探せば大概微妙なところあるぞ。
75デフォルトの名無しさん:2001/02/22(木) 21:41
アセンブラとC++を同じ土俵で語る無かれ。
76デフォルトの名無しさん:2001/02/22(木) 21:49
つーか、プログラムを作るという行為(実装する)で、その言語を
完全に理解する必要はあるまいに。(知ってるといいけどな)
自分にとって使いやすい概念だけ取り入れればいいだけでは?

言語の開発屋が言ってる「C++が難解である」ってのと
それを使う側の「C++が難解である」ってのは違う意味でがしょー

それなりに便利だけどなぁ。++は。
とはいえ、制御屋だから、あんまし出番ないけど・・・^^;;

77デフォルトの名無しさん:2001/02/22(木) 22:35
>>ALL
ではこのスレの命題である
「なぜC++はあんなに難しいのか?」
の答えは
「言語仕様の前にオブジェクト指向を理解しないといけないから」
ということでよろしいでしょうか?
78デフォルトの名無しさん:2001/02/22(木) 23:01
いいわけないだろ
79デフォルトの名無しさん:2001/02/22(木) 23:06
Cと互換性を保つ意味が分からん。
++するときにCのソースをそのまま転用することは
そんなにないと思うのだが…。
実行効率もObjectiveCより格段に良い訳でもないし。
80デフォルトの名無しさん:2001/02/22(木) 23:13
>>77
「なぜJavaはあんなに難しいのか」という質問が
あまりきかれないことからその答えは否定できる。

>>79
Cプログラマが少しの勉強でC++プログラマになれることが期待できる。

C++の失敗を踏まえてのJava、Javaの失敗を踏まえてのC#だな。
81デフォルトの名無しさん:2001/02/22(木) 23:23
C++は難しいって言ってるけど C++は簡単だよ
というか、難しく使う方向性が間違っている

Javaは言語仕様で難解にならないように注意しているだけ
82デフォルトの名無しさん:2001/02/22(木) 23:29
>>77
オブジェクト指向は理解してるつもりだけど(Objective-CとRubyは使える)、
C++はさっぱり分からんぞ。

まあ、道具としては使えないことはないがな。

83デフォルトの名無しさん:2001/02/22(木) 23:44
C++とオブジェクト指向を身に付けるまで4年かかりました。
この4年という数字は、本を読んでの4年ではなく、
実際に開発に使用して、プロジェクトの中でもまれた4年です。
Cやアセンブラなんて数ヶ月もあればマスターできることと比較すれば、
難しいといえるのでしょう。

C++をプロジェクトで使って、最初の1年は最悪でした。
プログラムはぐちゃぐちゃで、Cで作ったのと変わらないばかりか、
C++の動きをよく把握していなかったことによるバグも頻発しました。
しかしそのプロジェクトを通して、オブジェクト指向の正体が、
すこしづつ判るようになってきました。同僚たちも理解が深まり、
オブジェクト指向をふまえてレビューができるようになりました。
それから3年、いまになってようやく、ほぼマスターできたのではないかと
思えるようになったのです。

しかし、時間をかけて身に付けた今、
身について正解だったと断言できます。
その間に覚えたものの価値を考えれば、
4年は決して長い期間じゃなかったと思います。
だからそういう意味では必ずしも難しいとはいえません。

ご存知のようにC++には多くの欠陥があります。
だけど誤解しないで下さい。C言語のほうがはるかに
欠陥だらけで危険な言語なのですよ。
オブジェクト指向を良く知らない人は、
C++に対する批判の意味を理解できないため、
C++が批判されているという事実だけに目を奪われ、
C言語のほうが優れているかのような錯覚を引き起こすのです。

車に例えれば、C++という車はドアをロックしておかないとエアバッグが
作動しません。ロックを忘れたら、エアバッグが動かず危険です。
しかしC言語という車にはエアバッグそのものがついていないのです。
だからC言語のオーナーが、C++のエアバッグについての批判を読んで、
「C++は危険で、C言語は安全だ」というのは明らかにおかしいのですよ。

Javaは言語的にはC++より優れていますが、活用できる分野が非常に限定的で、
そういう意味ではまだまだC++にとってかわることができません。
JavaがC++にとってかわるには、まだ何年もかかるでしょう。
少なくともウチの開発ターゲットには、環境すら存在しません。
84デフォルトの名無しさん:2001/02/22(木) 23:45
>>82
C++も、もともとは単純な言語だったのだが、
「型付の強いオブジェクト指向言語だったらこういう機能が不可欠だよ〜」
っていう現場の要求が多くて、それに従って大きくなってきたってところが
大きいからな。歴史を知らないと難しく思うのも無理もないかも知れん。
歴史を知ってればあるべきものがあるところにあるだけなんだが。
85デフォルトの名無しさん:2001/02/22(木) 23:53
C#が出たら++はほとんど絶滅すると思う。
あれはjava風のObjectPascalだよ。
CよりPascalのほうが寿命が長かったってことだね。
86デフォルトの名無しさん:2001/02/22(木) 23:53
C#に期待♪
ぜんぜん手つけてないけど・・(笑)

Perlもオブジェクト指向してるけどどうかね?
ネイティブコンパイラが完成して処理速度さえ問題無くなれば
結構良い言語だと思う。
.Netに対応するらしいし俺は結構期待してるよ。
87デフォルトの名無しさん:2001/02/22(木) 23:54
C++は難しいよ。
ルール1とルール2だけ、一つずつ見れば、簡単そうに見える。
でも、ルール1とルール2が組み合ったらどういう動作をするのか?
というのがわかりにくいんだよ。
さらに、ルール3も有効になるとどういう動作になるのか?
とか、無限に組み合わせが出てくるね。
非常に複雑になる。
88デフォルトの名無しさん:2001/02/22(木) 23:58
C++の難しさが分からない。
C++(.cpp)でもCと同じコーディングしてる。
クラスってなんですか?
インヘリタンスって?
89デフォルトの名無しさん:2001/02/22(木) 23:59
>>87
ルール同士の整合性は考えずに、
そのルール単体での必要性から導入されてるからな。
STL大好きさ(笑)
90デフォルトの名無しさん:2001/02/23(金) 00:06
C++は難しいという人に難解なC++ソースの提示をきぼー。
どんなソースが難しいのか知りたいなぁ。
91デフォルトの名無しさん:2001/02/23(金) 00:09
C++のソースは見た目が汚い、
Javaは綺麗で読みやすい。
92デフォルトの名無しさん:2001/02/23(金) 00:17
見た目だけかい(藁)
93デフォルトの名無しさん:2001/02/23(金) 00:26
C++は「オブジェクト指向も使える」Cのスーパーセットだと思っておけば難解とかソースが汚いとか言われるんだと理解してるけど。

Cは高級言語だという人もいるし、Cなんて言語の皮をかぶったアセンブラだというひともいて、そこから中級言語だと言われるんだけど、
Javaはそんなこと言われないからたぶん高級言語。

高級言語より中級言語の方が難しいのは仕方ないんでは・・・

え?C#?・・・実際に触ってないから知らないな。マシン一台しかないし。
9493:2001/02/23(金) 00:27
一行目、日本語変だね。
鬱だ・・・追試の勉強しよ。
95デフォルトの名無しさん:2001/02/23(金) 00:28
>>85
C#は、設計者が設計者だしねぇ(藁
まあ俺は好きだけどね。あの人の言語は。
96デフォルトの名無しさん :2001/02/23(金) 00:36
>91
>C++のソースは見た目が汚い
ヘボイ人が作ったソースでも見たのだろう。

>Javaは綺麗で読みやすい。
センスのある人が作ったソースでも見たのだろう。

97デフォルトの名無しさん:2001/02/23(金) 00:45
>>90

>>72参照
9890:2001/02/23(金) 01:04
>97
さんきゅー。でもこういう構文はないんじゃない?
syntax error がでるよ。、

「Protected Abstract Virtual Base Pure Virtual Private Destructor」

そーすりすときぼーん。
99デフォルトの名無しさん:2001/02/23(金) 01:05
ちょっと質問なんですが、
私、テンプレートとか全然使わないんだけど駄目でしょうか。
その他、多重継承とか多態性とか使わないです。
クラスを上手く組み合わせて全てできてしまうのですが問題ありでしょうか?
あまり必要性を感じないのですが。
100デフォルトの名無しさん:2001/02/23(金) 01:06
>>72
には
>>74 >>76
で反論されてるじゃろ〜
10198=90:2001/02/23(金) 01:07
んー。でも思い出してみればMFCみてれば
いくらでもきたないC++そーすはあるねー。

もういらないかも。
102デフォルトの名無しさん:2001/02/23(金) 01:07
>>98
それはただの用語でしょ。
「プロテクテッド抽象仮想基底純粋仮想プライベートデストラクタ」
ソース言ったら答え言ってるのと同じじゃん。
103デフォルトの名無しさん:2001/02/23(金) 01:09
>>96
んだんだ。
なんできれいでなんで汚くなるかも書かないと説得力ゼロだな。

でも、Cと地続きにしたのは汚いソースをあふれさせた原因かもな。
104デフォルトの名無しさん:2001/02/23(金) 01:09
>>100
>>74
「プロテクテッド抽象仮想基底純粋仮想プライベートデストラクタ」
みたいな複雑なのがでてくる言語はさすがに限られてると思うぞ。
105101:2001/02/23(金) 01:10
>なぜC++はあんなに難しいのか?
>難しいという人はソースきぼーん。
>C++のソースは見た目が汚い
>ヘボイ人が作ったソースでも見たのだろう。

この考えに一票かも。
10698:2001/02/23(金) 01:12
悪いけど意味不明。>>102
107デフォルトの名無しさん:2001/02/23(金) 01:12
108デフォルトの名無しさん:2001/02/23(金) 01:13
>>106
意味不明なら、君のとってC++は難しいってこと。
分かってないってことだから。
10998:2001/02/23(金) 01:15
ありがと。見てみるよー。>>107
11098:2001/02/23(金) 01:16
はいはい。>>108
111デフォルトの名無しさん:2001/02/23(金) 01:22
>>108に一票
ついでに言えば、ソースで見ればそんな難しいものでも無さそう
112デフォルトの名無しさん:2001/02/23(金) 01:25
文化の差はあると思う。
出力引数なんて Java じゃほとんど使わないけど
C++ ではよく使うよね。

C++ で綺麗に書くことはできるけど、
C をひきずってしまうので綺麗に書いてる人は少ない
というのが経験的な感想。
Microsoft のソースが汚いというのも
そういうイメージの原因かと(
113デフォルトの名無しさん:2001/02/23(金) 01:36
>>104
その辺は結局、型付の強い言語で多重継承を認めるとどうなるか、っていう
失敗例といっていいと思う。でも、Java的なimplement interface の方法論を
導入すれば回避できる、というよりもその辺は俺の感覚だとほとんど記憶から
削除されてるし、削除してしまっても何ら問題ないよね。OOPを同時に勉強し
ないでそっちのほうに迷い込んじゃった人はかわいそうだと思うけども。

誰かも言ってたけど、処理系の実装の難しさと実用の難しさをごっちゃにしちゃ
いかんと思うが。
114デフォルトの名無しさん:2001/02/23(金) 09:22
C++ はシステムレベルでも記述できる、非純粋?オブジェクト指向言語なんで、
普通にアプリを書いている人には必要ない(というか危険な)機能がいっぱい。
ポインタが無ければCじゃないが、ポインタは初級者には危険すぎる。

Java がもっと普及すればいいのに。。。。
115デフォルトの名無しさん:2001/02/23(金) 09:45
ポインタも理解できないような奴を
プログラマとは呼びたくないな

とは言ったものの多重継承も
その他のごっちゃごっちゃも
使いたくないんだったら使わなくたっていいんだぜ
72の奴も普通つかわないし

いっぺんに重箱の隅まで覚えようとするから大変なんだよ
116デフォルトの名無しさん:2001/02/23(金) 09:48
>>114
Javaがネィテェブコード吐けりゃ、俺も乗り換えてたよ…
117116:2001/02/23(金) 09:49
ネィテェブってなによ
11863:2001/02/23(金) 10:32
>>72
だから、こんな言葉の説明が出来る事とプログラムの本質は関係ないでしょ(藁
プロとして仕事するなら一番求められるのは結果であって、クライアントの
要求するものを提供できれば、どんな言語を使おうが、どんなアルゴリズムを
使おうが、そんな事はどうでもいいこと。

逆にプログラムの本質はそこにあって、OOPの概念は言語とは独立したものなわけ。
たまたまC++では、72の様な用語(一部予約語)で説明されたり記述したりするって
だけの事。やはりJavaでもほとんど同じ様な用語が用いられるし、他のObject
Orientedな言語でもそうでしょう。

だから一度OOPを理解してしまえば、どんな言語でも、この概念を実践するに
あたって、具体的にターゲット言語上ではどの様な方法で実現されているかを
知れば、慣れの問題を除いて、開発言語は問わないわけ。
特に言語体系に用意されていなくても、例えばアセンブラでさえ、独力で
似た様なことは実現可能だしね。

よって、OOPを理解すればC++もJavaも難しくなく、逆に理解していなければ
同様に難解なはず。よって、他のObjectOrientedな高級言語と比較して、
特にC++が「難解」とは言えないとおいらは思いますけどね。
119デフォルトの名無しさん:2001/02/23(金) 11:08
設計は開発言語とは無関係とかよくいわれるけどね。
実際には開発言語や環境を考慮せずに設計したものは
ロクなもんじゃないぜ。
120デフォルトの名無しさん:2001/02/23(金) 11:14
>>118
だからほかの言語に比べて慣れるのが大変ってことなのよ。
慣れてしまえば生産性はオブジェクト指向言語として
他と変わらないと思うけど。
121Del厨:2001/02/23(金) 11:18
OOPは当然理解していますが
糞C++は難しくて使うの嫌です。

「猫でも...」のコーナー見てるとわかりますが
OOPと全く関係の無いテクニックが山積ですよ。

テクを知らなければソース読めないし
それでわけわからなくなってたら
k仲川あたりに「プログラマの勉強不足」
なんて酷評されるわけでしょ。

慣れの問題とはいえ、その慣れるまでが
腐れC++を使っていて嫌になるのです。
言語仕様がグチャグチャだから覚える事が多すぎる。

生産性低いから。
滅びてくれて結構ですよ。C++

コンパイル遅いしね(藁
変なキャストしても警告でないしね。
122デフォルトの名無しさん:2001/02/23(金) 11:18
C++の難しい理由・・。
C言語をごちゃ混ぜになるから・・。
123デフォルトの名無しさん:2001/02/23(金) 11:20
C++が難しい→ソースみせろ→C++のソースは汚い
→へぼい人が作ったのだろう→ヘボい人がいるのはC++が難しいから→

(w
ごくろうさん。
124デフォルトの名無しさん:2001/02/23(金) 11:26
> よって、OOPを理解すればC++もJavaも難しくなく、
> 逆に理解していなければ 同様に難解なはず。
OOPを理解すれば楽にはなるがC++の場合、templateとゆーもう一つの山がある

あとC使いの俺の場合、「Cでも作れてしまう」とゆー
誘惑を断ち切る必要がある。

> 生産性はオブジェクト指向言語として他と変わらないと思うけど。
templateがないJavaよりは生産性が高いと信じたい...。
125デフォルトの名無しさん:2001/02/23(金) 11:31
>>124
テンプレートってそんなに「使える」んですか。
ちょっと齧っただけの俺にとっては何かマクロ言語みたいでつらくて‥
126デフォルトの名無しさん:2001/02/23(金) 11:39
糞みたいなC++をようやくマトモに使わせたいだけの存在。

ANSIに沿わなくてよければ
特に必要ありません。

どうせ覚えるために工数かかるのなら
他の言語を覚えておいたほうがまし。
127デフォルトの名無しさん:2001/02/23(金) 11:41
Templateはコレクションクラスには非常に便利。
でもコレクションクラス以外では使う場面無いんじゃない?
128デフォルトの名無しさん:2001/02/23(金) 11:50
>>125
C++のテンプレートは、言語仕様で定義しているマクロです。
オブジェクト指向的な考え方の上に考えられたものではありません。
例外処理のようにプログラムのあり方を根本的に変えるものではなく、
熟知していないと使いこなせないわりには、罠が多くプログラマの
ストレスを高めていきます。神経質すぎる人は発狂してしまいます。
そして、強烈なアンチC++野郎として生まれ変わるでしょう。恐いですね。
129デフォルトの名無しさん:2001/02/23(金) 11:52
>>126
>他の言語を覚えておいたほうがまし。
C++以外で普及している言語はVB, Delphi, Java, Cなどがありますが。

VB, Delphiはwin以外の環境では無理だし。
(C#ってwin以外の環境でも使えるの?)
Javaは遅いし、いまさらCに戻りたくありません。
130デフォルトの名無しさん:2001/02/23(金) 11:53
>>118
Procedure-Orientedに関しても同じこといわれてたよ。
と言うことは、そう言われていく中でCが定着したように、
これもC++が定着していく過程なのかな。
131デフォルトの名無しさん:2001/02/23(金) 12:28
>>129
あんたが使うプラットホームにあわせて言語も変えろって事。

どうせプラットホームにあわせてライブラリ変えて
そのライブラリの使い勝手は違うのだから

C++標準で済まそうと思うというバカな考えでいるから
生産性が低いまんまなのだよ。
132デフォルトの名無しさん:2001/02/23(金) 12:42
ねえねえ、>>129

あなた何のプログラム書いてるわけ?

実際プログラムなんてかいてなくて
どれをべんきょうしたらいいのかなー
と考えてる初級ドキュオタなんじゃない?

自分がこれからC++を勉強するにあたって
マルチプラットホームで動作するC++を
覚えた方がいいとか考えてる?

どうせ挫折するから、止めたほうがいいんじゃない(w
13363:2001/02/23(金) 13:15
>>124

Templateは必須では無いでしょ。使うライブラリがTemplateの固まりなら
覚えなくてはならないかもしれないが、特に習得せねばならないものではない。
要するにマクロだからね。もちろんOOPともあまり関係がない。
同様に、operatorの存在意義も、記述時の利便性が主な目的だと思う。これも
無理に使う必要ナシ。うまく設計しないと、見えないバグが潜む可能性が大きい。
だから、そういうものは無理に使わないこと。

要するに、沢山用意されている機能のうち、自分の使いやすいものだけを使えば
それでいいんじゃないのかな。
C++文法の生き字引とでも呼ばれたいなら別だが(藁
134デフォルトの名無しさん:2001/02/23(金) 13:22
templateをOOPと関係ないって堂々と言う人が多いなあ。
あれは多態のスタティックなやつだと思ったほうが
わかりやすいんじゃがねー。

まあ別にマクロの延長線上のものだと思ってたっていいけど、
そうするとSTLなんか理解しずらいとおもうんじゃがのう。

そのあげく、「STLはOOPと関係ない」とか言われると萎える。
135129:2001/02/23(金) 13:26
> あんたが使うプラットホームにあわせて言語も変えろって事。
あるプラットホームで開発した物を別のプラットホームに移植するときに
別の言語で移植しろという事でしょうか?
そんなのいやです。

> C++標準で済まそうと思うというバカな考えでいるから
> 生産性が低いまんまなのだよ。
C++標準で済ませられたらそれに越した事がありませんか?
(まぁ全部標準で済ませられませんが)
また、標準でない部分は最小ですまそうと考える事は生産性が低い事でしょうか?
あなたの生産性の定義を教えて下さい。

一応、いままではCで開発していましたが、
Cぐらい移植性・性能が高く、Javaくらいオブジェクト指向のC++が
現在では再有力と私は考えています。
もちろん、その汎用性の為、かなり覚える事が多く、難しいと感じている
ことも認めますが...。

ねえねえ、>>132
あなた何のプログラム書いてるわけ?

実際プログラムなんてかいてなくて
C++のべんきょうに挫折してC++って難しいなー
と考えてる低級ドキュオタなんじゃない?

自分が低級ドキュオタだからって他人もそうだと考えない方がいいよ。
136デフォルトの名無しさん:2001/02/23(金) 13:40
標準っていうとさ。

*BSD(せめてFreeBSDだけでも),Linux,Windowsで動く
日本語が表示/入力出来てC言語で書かれたGUIツールキットがほしいですね。
何かないかな。
137デフォルトの名無しさん:2001/02/23(金) 13:46
>>135
モナヂラだよ(藁
138デフォルトの名無しさん:2001/02/23(金) 14:45
OOPを理解したと自認している人に聞きたいのですが、多重継承はOOPにとってな
くてはならないものですか?もしなくてもいいならどのような代替策が優れてい
るのですか?
139デフォルトの名無しさん:2001/02/23(金) 14:58
必死だね。ま、ガムバッテネ
140デフォルトの名無しさん:2001/02/23(金) 15:01
>>138
インターフェースの継承と機能の継承は分けて考えろなんて
いいますね。前者は多重継承があっても良いと。
COM も Java もそういう方針だと思います。
機能の再利用は継承を使わなくても実現できる場合が多いから
無くてもいいということではないでしょうか

必要/不必要という観点より、使った場合の利点/欠点の
バランスが問題かと。
141デフォルトの名無しさん:2001/02/23(金) 15:13
>>140
インターフェースだけ継承して、他の機能は包含でも実現できるやん。
142デフォルトの名無しさん:2001/02/23(金) 15:30
>>134
テンプレート関数はどう説明する?
143デフォルトの名無しさん:2001/02/23(金) 15:48
>>138
Is a関係ではなくて
Has a 関係にして内包してしまえばよい。

多重継承は無くてもいいのではないでしょうか。
144デフォルトの名無しさん:2001/02/23(金) 15:55
>>142
template関数全体のことを言ってるなら、
staticなgeneric。closみたいなやつ。
STLにおける使い方について言ってるなら、
まさにStrategyデザインパターンそのもの。

前者はちょっと屁理屈くさいけど。
145144:2001/02/23(金) 16:02
144補足
もちろんマクロ的な使い方もするけど、
そう思った方がtemplateの存在意義とか理解しやすいし、
STLとかの意味もわかるよ、といいたいだけだよ。
146デフォルトの名無しさん:2001/02/23(金) 16:12
ふと思ったが、STLの実装は
汚いC++コード(C++はこんなに汚くなる)の
見本みたいなものではないか。
147138:2001/02/23(金) 16:36
>Has a 関係にして内包してしまえばよい。
徹底すれば多重継承はしなくていいと思いますが
コードがタブることになりませんか?

Javaのインターフェイスもちょっと凝ると混乱するし。俺だけ?(藁

Rubyのmix-inというのは比較的分かりやすいけど、
モジュールというのがクラスとは別個にあってなんか折衷案っぽい
気がする。
148デフォルトの名無しさん:2001/02/23(金) 17:07
どこから継承したかわからなくなるよりいいかも。
149デフォルトの名無しさん:2001/02/23(金) 19:57
>Has a 関係にして内包してしまえばよい。
この論理はそっくりそのまま継承が要らないという論理にもなる。

「継承」にはコードの再利用とインタフェースの継承という側面があり、
1.インターフェイスの多重継承は認めるが、実装の継承は1個のみ(JAVA)
2.インターフェイスの多重継承は認めるが、実装の継承は許さない(COM)
3.インターフェイスの多重継承も実装の多重継承もOK(C++)
4.多重継承はいかなる理由でも禁止(???)

2は極めて中途半端な立場で実装の継承を1つに限りOKするのは経験上これ
が一番便利だと判断したからに違いない。
150デフォルトの名無しさん:2001/02/23(金) 20:04
>2は極めて中途半端な立場で実装の継承を1つに
1の間違い…
151デフォルトの名無しさん:2001/02/23(金) 20:32
1です。

ちょっと見ないうちにいろいろな意見が飛び交って参考になります。

早速「憂鬱なプログラマの〜」を購入し
オブジェクト指向&UMLを勉強しています。
152デフォルトの名無しさん:2001/02/23(金) 21:37
>この論理はそっくりそのまま継承が要らないという論理にもなる。

実際、継承のない言語で実装する場合はそうなります。

また、実装継承のないCOM、CORBAオブジェクトの場合も、
実装時には包含するかまったく新規に実装することになりますね。
153デフォルトの名無しさん:2001/02/23(金) 22:31
>>151(1)
おおう。
その選択は最高に正しいよ。
154デフォルトの名無しさん:2001/02/24(土) 00:07
templateは今の仕事に欠かせないなぁ。構造的に。
確かに易しい言語ではないが。
155デフォルトの名無しさん:2001/02/24(土) 00:45
>>146
同意
デバグ死にます。
typedef マクリの半分くらいは STL の仕様のせいだと思うけど。
156デフォルトの名無しさん:2001/02/24(土) 00:46
>>146
どのSTLを見たのかは知らんが、まったくそうだな。
つーか、見んなよ。使うだけにしとき。
そして、STLは見せないようにしろ。
157デフォルトの名無しさん:2001/02/24(土) 01:29
>>146
でも技巧の勉強にはなるわな... テンプレートグルを目指す人には良い参考資料だ。
158デフォルトの名無しさん:2001/02/24(土) 01:55
STLの実装が汚い? なんで?
159デフォルトの名無しさん:2001/02/24(土) 01:58
VC++のやつはかなり厳しいよ。
C++Bのやつは結構きれい。
160デフォルトの名無しさん:2001/02/24(土) 05:08
>>159
見れるなら見たいにゃー。
161デフォルトの名無しさん:2001/02/24(土) 13:22
あのー・・・STLは、その性格上ヘッダファイルに丸々実装かいて
あるんだにょ。C++使いが知らないと恥ずかしいかもしれないにょ。

\Program Files\Microsoft Visual Studio\Vc98\Include
にMAPだのVECTORだのってファイルがあると思うにょ。

いい機会だからちょっと見てみたけど、凄いにょ…
嫌がらせみたいなソースだにょ。
162161:2001/02/24(土) 13:36
テンプレートライブラリの公開は、ソースの大公開になるので、
仕事でやるなら気をつけてくれにょ。

昔、ミカ○系提供のテンプレートライブラリに致命的なバグが
有ったことがあったにょ…
163デフォルトの名無しさん:2001/02/24(土) 14:42
継承をつかわないで包含を使う方が良い場合が多いとか。

テンプレートは STL を利用する場合には使えると思うけど、
自分でテンプレートを使うかと言ったら使わない。

個人的にはすべて Object として収納する Java風のコンテナ の方が
わかりやすいとは思います。
164デフォルトの名無しさん:2001/02/24(土) 15:08
>>163
dynamic_cast を躊躇なく使える立場のヒトはいいけどさ。
165デフォルトの名無しさん:2001/02/24(土) 18:00
>>164
おいら、クライアント側でキャストするなんて事はあんまりしないっす。

コンテナをあるクラスのプライベートメンバにして、アクセスメソッド
書いてラップして使いましょう。(しまえるのも取り出すのも特定の
オブジェクトだけ)クラス階層1っこ増えちゃうけどね。

・・・つうか常識でしょ。
166デフォルトの名無しさん:2001/02/24(土) 18:06
>>164-165
微妙に話がずれてるなきみたち
167デフォルトの名無しさん:2001/02/24(土) 23:46
>>165
そのラッパの中では static_cast で済ましてるわけね。
・・・まあ、それでいい気もするけど。
168デフォルトの名無しさん:2001/02/26(月) 02:13
>>165
それをプログラム中の配列すべてに対して行うのか?
JAVAやNON-STLではそれが面倒だからどうしても[]を使ってしまう。
169デフォルトの名無しさん:2001/03/02(金) 01:35
多重継承バリバリのソースを解析するのは疲れるんで嫌いです。
はぁ…
170名無し戦隊ナノレンジャー!:2001/03/02(金) 02:09
>>169
キチンとspecを出させるべき
171デフォルトの名無しさん:2001/03/02(金) 06:09
C++はできた方がいい?
ほとんどCでかいてるけど、
C++の本読んでもクラスとかの便利さってよく分からなかった。
17293:2001/03/02(金) 06:27
クラスが勝手にデストラクタで壊れてくれるので、ファイルの閉じ忘れ等を防ぐことが出来ます。
一番簡単にいえるのはこれぐらいか・・・。

あとはCでも出来ないことはないしね・・・。
(OOPとか)
173デフォルトの名無しさん:2001/03/02(金) 07:56
1さんじゃないけど

クロージャって何?
リファクタリングって何?
委譲って何?Listener ってどう使うのさ?

他にも最近よくわからん用語が多すぎる・・・
オブジェクト指向はパラダイムが違うって言うけど用語もずいぶんわかんない。
174デフォルトの名無しさん:2001/03/02(金) 08:50
クロージャはOOP用語じゃないぞ、別に。
175デフォルトの名無しさん:2001/03/02(金) 12:31
委譲というのはあるオブジェクトが受けたメッセージを別の
オブジェクトに丸投げしてしまうことです。
176デフォルトの名無しさん:2001/03/03(土) 10:58
ってことはMFCのメッセージルーピングマクロなんかは委譲のいい例だな。
177デフォルトの名無しさん:2001/03/08(木) 23:43
元請けが下請けに設計・実装全てを丸投げして
うわまえだけピンはねしている日本のゼネコン体質は
”異常”といいます。
178デフォルトの名無しさん:2001/03/10(土) 01:08
AGE
179デフォルトの名無しさん:2001/03/10(土) 09:07
>>177
class GeneCon {
private:
 Shitauke * sitauke;
 Money uwamae;
public:
 BOOL GetShigoto( Money yen, Task shigoto) {
  keihi = yen / 10000;
  uwamae += yen - keihi;
  shitauke->Shigoto( keihi, shigoto);
  return True;
 }
 void GetKujyo( Money support_yen, Kujyo kujyo)
 {
  shitauke->Kujyo( kujyo);
  uwamae += support_yen;
 }
180デフォルトの名無しさん:2001/03/12(月) 16:36
>>179
class Dokenya {
private:
 Shitauke * sitauke[];
 Money uwamae;
public:
 BOOL GetShigoto( Money yen, Task shigoto) {
  keihi = yen / 10000;
  uwamae += yen - keihi;
  shitauke->Shigoto( keihi, shigoto);
  return True;
 }
 void GetKujyo( Money support_yen, Kujyo kujyo)
 {
  shitauke->Kujyo( kujyo);
  uwamae += support_yen;
  }
};

class GeneCon : public Dokenya {
private:
  Seijika* seijika[];
}

class Shitauke : public Dokenya {
};
181デフォルトの名無しさん:2001/03/13(火) 00:25
age
182デフォルトの名無しさん:2001/03/13(火) 00:49
い・1万分の1・・
孫請けは更に1万分の1・・・
苦情は無償・・・
あ、でも関連づけがされてないから大丈夫だ。
183名無しさん:2001/03/13(火) 03:42
2ちゃんねるはメガネオタクの集まり!!
どうしょうも出来へんな!!
スキルも無いくせに能書きだけは一人前の奴ばっか!!
ほんまにスキルある奴は軽く遊んだるから、かかってこいや!!
アホが!!2ちゃんねるはメガネオタクの集まり!!
メガネ割りたい!!
文句あるなら、かかってこいや!!
アホが!!
http://www.rju666.com/


184デフォルトの名無しさん:2001/03/16(金) 16:30
こいつアホ?>>183
それとも騙りか?
185デフォルトの名無しさん:2001/03/17(土) 16:47
C, C++って
書き方に自由度がありすぎるせいか
ソースコードに個性が出まくって困る。

ある程度制限されていても
みんなのコードが似かよるPascalの方が好き。
DelphiだとOOPきれいに書けるし。
186デフォルトの名無しさん:2001/03/17(土) 16:52
きれいなOOPにはガベコレが必須な気がする今日この頃。
187デフォルトの名無しさん:2001/03/17(土) 16:58
>185
>Delphi
interface と class の名前の prefix が違うのがいや。(TとI)
GC が無いのはとりあえず良いとしてもね・・・。
188デフォルトの名無しさん:2001/03/17(土) 17:50
>>187
? 嫌なら別に俺様流で全部Cにしたら?
189デフォルトの名無しさん:2001/03/17(土) 17:57
DelphiでBoehm GC使えるかな。
190デフォルトの名無しさん:2001/03/17(土) 18:20
Delphiで無理にGC使わなくても interface使えばいいんじゃないの?
191187:2001/03/17(土) 19:09
>188
"Delphi" だったら付属ライブラリがそういう規約だから、
自分流でいくとごっちゃになるからイヤ、と思っている。
interface と class をわざわざ分ける必要が無いと思うんだけれどなー。

それよりも、最近 interface がどうしても必要になることが無いことに気が付いた。
(全部 single inheritance で済んでいるんだよなー。< Java)

>189
delphi 用の gc を探していて、今まで確保したメモリを全部クリアする
gc があった。役にたたねー。

>190
一瞬何を言っているのか理解できなかった。
TInterfacedObject を使え、ってことでしょ?
メモリ管理が面倒なだけだったらそれでも良いけれれど、
参照カウンタを利用しているから、
結構オーバーヘッドがあるのでダメです。
192turbo type D:2001/03/17(土) 20:52
ネイティブでガベコレ是非ほしいよ。
C++でもDelphiでも
リファレンスカウンタを持ったクラスと
その使い方、破棄の仕方を教えてほしいな。
193デフォルトの名無しさん:2001/03/17(土) 21:07
>192
参照カウンタの基礎はoperator=のオーバーロードじゃない?
194191:2001/03/17(土) 21:15
>192
Delphi Tech
http://piza.2ch.net/test/read.cgi?bbs=tech&key=970606624
上のあたりに参照カウンタを利用した複素数クラスがある。
195turbo type D:2001/03/17(土) 21:21
サンクユウ。
Techスレ、先頭から見たことなかったよ。(w、
今後ともよろしゅうに。
196turbo type D:2001/03/17(土) 21:24
・・・DelphiTechスレ、の先頭の方、まじでレヴェル高すぎ。
オレTechに投稿するの控えるよ。、ウツシ....
197デフォルトの名無しさん:2001/03/19(月) 05:10
>>132の文章に女性の匂いを感じたのは俺だけでしょうか?
198デフォルトの名無しさん:2001/03/20(火) 11:37
>>197
だから何?
お前は女を見たことが無いのか?
199デフォルトの名無しさん:2001/05/02(水) 01:13
俺はC++よりもJavaの方が難しいけどなあ。
テンプレートつかえねーからコレクションクラス使うとキャストの
嵐になるしさ。きたねーったらありゃしねえ。クラスライブラリは
どでかくて把握できねえし。
200デフォルトの名無しさん:2001/05/02(水) 01:45
>>197
男の小説家があーいう文章(?)を書けなければ、
その小説家の小説は男キャラだけになってしまうと思うが?

>>196
俺もはじめて見た。びびった。
というか、ますます燃える(笑)
201デフォルトの名無しさん:2001/05/02(水) 01:57
>>187
interfaceのprefixはマイクロソフトのやり方に従っているのでは?
あとclassとinterfaceでは、意味が全然違うのでprefixを分けた方が
良いと思う。
202デフォルトの名無しさん:2001/05/02(水) 02:04
>>189
どうなのかなあ。できるといいなぁBoehmGC。
ところでガベコレされるときにdestroyを呼んでもらうための
Boehm側の仕掛け(の説明英文(笑))が理解できません(T_T)。
誰か教えてください(T_T)

>>192
ガベコレの方式は参照カウンタだけじゃないよね。
BoehmはMark&Sweapとやらだったっけか。
参照カウンタのほうがヨイという意思表示(^^;でしょうか?
俺も「どっちがよい」と言えるわけじゃないけど、
循環参照こわいんで他の方式のほうが安心…。

>>199
そういやGenericJavaはどうなったんでしょうか?
軽量(笑)テンプレートを搭載するとかいう話。
203 :2001/05/03(木) 06:13
優れているうんぬんではなくて
普及してるから使うってのが正しい考えでは。
VHSみたいに
204デフォルトの名無しさん:2001/05/03(木) 17:07
C++はフェラーリ。
Javaはインプレッサ。
VBはカローラ。
COBOLは2トントラック
Fortranは初代クラウン
Smalltalkはトヨタ2000GT
Perlはファミリア
Rubyはアルテッツァ
アセンブラは徒歩
205187:2001/05/03(木) 19:07
>201
>あとclassとinterfaceでは、意味が全然違うのでprefixを分けた方が
意味が違うとは、たとえばどのあたり?
僕は、すべて仮想メソッドな class みたいなものとして捕らえているから
同じに見えるのだけれど・・・。
206デフォルトの名無しさん:2001/05/03(木) 21:08
Javaはパフォーマンスをまったく無視して、
ドキュソプログラマにも扱えるようにした言語。
あんなものがネイティブで動いてもパフォーマンスが出るわけがない。
いくら言語仕様が美しくても、できるのがウンコソフトなら意味がない。

だいたいC++やアセンブラすら解らないような奴が、プログラム組むな。
207デフォルトの名無しさん:2001/05/03(木) 21:10
>>206
VBのみ触れたことのある一流VBプログラマですが何か?
208デフォルトの名無しさん:2001/05/03(木) 21:17
>>207
サブッ
209デフォルトの名無しさん:2001/05/03(木) 21:35
>>206
激しく同意。

ガベコレは便利だけど、実行効率を全く無視しているし、
安全性は結構だけど実行のたびにべリファイかけて
全パターンを検証するから起動が異常に遅かったり、
RunAnywareは結構だけど、実際はDebugAnywareだし。
仮想関数は便利だけど、それがメソッドコールの
パフォーマンスにどれだけ影響するか無視してるし。

とにかく糞。ほんとサーブレットぐらいにしか利用価値がない。
210デフォルトの名無しさん:2001/05/03(木) 22:43
ここC++のスレですよね・・・。
211デフォルトの名無しさん:2001/05/03(木) 22:52
まあ、話題が尽きないのはいいことでしょ。
212デフォルトの名無しさん:2001/05/03(木) 22:53
>>209
GC はともかく、関数の仮想化によるペナルティは

1. クラスごとに一つ仮想関数のテーブルを保持
2. 呼び出しに際して、一回余分にデレファレンスが必要

だけですよね。

性能差は空の関数呼び出しでも最大 20% 程度、実際に関数内で
処理を行う場合には誤差に過ぎないと思いますが、それほど性能
に悪影響が出ますか? もし実測値などあるようでしたら、示し
てもらえると嬉しいです。
213デフォルトの名無しさん:2001/05/03(木) 23:17
彼らはC++に固執しているのです。
怖いんですよ。
214デフォルトの名無しさん:2001/05/03(木) 23:29
>>212
小さいクラスほど問題が大きくなる。
たとえばテーブルのセルクラスとかがいちいち関数テーブルを持って
いて仮想関数呼び出しが発生するのははっきり言ってむかつく。
俺のところでは50カラム2000行のすべてのセルの色を変更しようとす
ると5MBくらい食うのでGCが発生して10秒くらいかかる。
215デフォルトの名無しさん:2001/05/03(木) 23:35
そういう場合ってとりあえず違う形で保持しません?
セルオブジェクトを大量に生成・保持している時点で終わり・・・。
216>214:2001/05/03(木) 23:45
設計が悪いだけな気がするのは気の性でしょうか
217デフォルトの名無しさん:2001/05/03(木) 23:46
>>212
Javaはデフォルトが仮想関数だからねぇ。
private final属性にするとか気をつけて組めば、
それほど深刻ということもないけど、
バイトコードレベルの知識のない大多数の似非Javaプログラマが
使い分けを意識しているとは思えないなぁ。
バイトコードレベルのインライン展開も明示できないし、
ループの内側で仮想関数をコールしている可能性は否定できないかも。

あと通常、仮想関数コールは2回余分にメモリ参照が必要だよ。
仮想関数テーブル->関数ポインタ->コールだからね。
さらにインターフェイスメソッドのコールは
インタフェイステーブル->仮想関数テーブル->関数ポインタ->コールだから
3回余分に参照が必要だよ。
218217:2001/05/03(木) 23:49
それから、これはJITコンパイラが賢い場合の話で、
さらにコンスタントプール参照が入る可能性も否定できない。
219デフォルトの名無しさん:2001/05/04(金) 00:16
>217
良くも悪くも
Javaでプログラミングをしている時点で仮想関数のコストを気にするのもどうかと。
220214:2001/05/04(金) 00:22
あ、セルクラスっていってもセルスタイルクラスね。
現実問題としていちいちnewするしかないと思うけど?

同社のC++ライブラリも使用経験あるんだけど、その場合は1Mくらいだった。
もちろんオペレーターnewも書き換えてあった。
221デフォルトの名無しさん:2001/05/04(金) 00:26
C++の参照(&)って必要なのですか?
222215:2001/05/04(金) 00:30
>220
大量にセルのデータ(スタイル)を保持するなら、
とりあえず配列か何かで保持してメモリを稼ぐ。
で値を返すときに(newのコストがかかるけれど)毎回 newして返すか、
セルへの参照をもらってそいつの値を変えてやるとか。

ところでメモリの使用量ってどーやって調べたの?
223デフォルトの名無しさん:2001/05/04(金) 01:05
>>221
参照なんかなくてもポインタで十分じゃないか、って話?

参照とポインタの最大の違いは、ポインタが NULL を許容するのに対して
参照は必ず実体を指していること。参照を使うと、いちいち NULL かどう
かチェックしなくて良いことが、言語レベルで保証されるのが便利。

逆に NULL (何も指していない)状態を表現する必要があるなら、参照で
はなくポインタを使うべし……と Effective C++ か何かに書いてあった
ような気がする。
224214:2001/05/04(金) 01:08
>>220
メモリの使用量はオペレーションをする前と直後のJAVA.exeのメモリ使用量から
前半部分はよくわからない。
俺が言いたいのは一個数バイトですむようなクラスの場合、vtbl(ポインタ)を
保持するのは無視できないパフォーマンス低下を招くと言うこと。
まあJAVAの場合問題はvtblだけじゃないと思うけど。
225デフォルトの名無しさん:2001/05/04(金) 01:10
>>221
少なくとも演算子のオーバーロードには必要だわな。
それ以外で使ってるのはほとんど見たことない。
226デフォルトの名無しさん:2001/05/04(金) 01:16
>>215 >>216
言語仕様に気を使ってプログラム組むのなら最初からC++を使ったほうがマシ。
CやC++はマシンアーキテクチャとその動作を想定しながら書く言語だが、
JavaがVMの動作を想定してどうする?
高速なVM用と低速なVM用とか分けて書き出したら、Javaのメリットはなくなる。
227デフォルトの名無しさん:2001/05/04(金) 01:18
つうかJavaは構造体が無いのが痛い。
可読性とパフォーマンスやメモリ効率を両立できない。
228215:2001/05/04(金) 10:45
>224
セルオブジェクトのフィールドごとに配列を用意してやる、ってこと。
boolean[] isBold;
int[] fontSize;
...
みたいに。するとメモリをかなり稼げると思う。
で、newするとか参照がどうしたってのはこいつの値の返し方のこと。
229215:2001/05/04(金) 10:48
>224
>メモリの使用量はオペレーションをする前と直後のJAVA.exeのメモリ使用量から
たいていのJVMは一度に大量のメモリをOSから確保するのでそれはあてにならないと思うよ。
どちらにしろJavaはメモリ食いだが。
230221:2001/05/04(金) 11:12
>223,225
どうもありがとう
演算子のオーバーロードというと、<<
シフトだけど
ほとんどのC++の解説書が cout << ....
については、何の説明も無しに使ってますね。
良くないとおもう。
231デフォルトの名無しさん:2001/05/04(金) 12:04
>>223
*pを実体で渡して、pがNULLだったらおしまいさ。

>>225
参照渡しするよ。よくしないでC++プログラム書けるね〜
232デフォルトの名無しさん:2001/05/04(金) 13:48
>>221

1:コピーコンストラクタを作るのに必要

CFoo::CFoo(CFoo x) というコピーコンストラクタを定義するとする。
コピーコンストラクタを呼び出すときに、さらにコピーが発生するので、
永久にコピーコンストラクタが呼び出され続けて暴走する。
従って CFoo::CFoo(CFoo &x) でなければならない。

なお CFoo::CFoo(CFoo *x) はオブジェクトのコピー時には
呼び出されないのであしからず。

2:代入演算子(operator=)を作るのに必要。

1と同じ理由。
コピーコンストラクタと代入演算子は、基本的に全てのクラスに書いてくれ。
各必要がないときだけ、意図的に省くように。
理由は Effective C++ 参照。

3:例外をcatchするのに必要。

throw をコピーで catch すると、例外オブジェクトのコピーコンストラクタ内で
さらに例外が発生してややこしくなる。
ポインタで catch すると、開放されたゴミメモリをポイントすることになる。
例外ハンドラは参照で catch しないといけない。
233デフォルトの名無しさん:2001/05/04(金) 15:05
>>232
こういう話を聞くたびに、delphiを思い出すんだよね。
C++でいう参照が無いのに、別に困っていない言語。
#delphi以外の多くの言語でもソウだけど。

delphiとかに言わせれば、

1:コピーコンストラクタなんざ要らない。

2:代入演算子なんざ要らない。

1と2の理由は要するに、変数埋めこみObjectを許していないために
変数の宣言と「同時に」Objectが作られるという抱き合わせ(笑)を
食らわずに済むから、です。

3:newで作った例外Objectをcatch部で受けとって始末すればよい。
たしかC++って未だに(笑)例外専用クラスって無いんでしたよね。
#つーか大元の基本クラスすらないんだっけか
となると、言語レベルで例外Objectの扱いにお約束を与えることも
できないわけで、それが面倒をもたらしている。

C++って、ある一部に拘ってしまったばっかりに、
他の全ての利便性を獲得できなくなってしまった
という風に思える。
234デフォルトの名無しさん:2001/05/04(金) 16:19
>>229
1000行だとちゃんと2Mくらい増えるから当てになると思う。

>boolean[] isBold
2000行だったら無条件にboolean isBold[2000]ってするのか?
デフォルトではすべてのセルは同じセルスタイルオブジェクトを共有して
いるからそんなにメモリを食わないのだけど、配列になんかしたら常にメ
モリ食いになっちゃうじゃん。
第一isBoldとかはビットフラグだと思う。
235デフォルトの名無しさん:2001/05/04(金) 16:28
>>233
>1と2の理由は要するに、変数埋めこみObjectを許していないために
>変数の宣言と「同時に」Objectが作られるという抱き合わせ(笑)を

デルの事は知らないけど、変数埋め込みがあろうがなかろうが宣言と
ともにnewが呼ばれるなら抱き合わせは発生するんじゃないの?

で、変数の宣言とともにnewが呼ばれることには非常に意味があると思う。
なぜなら変数の文法的スコープとともにデストラクタを呼べるから。
236デフォルトの名無しさん:2001/05/04(金) 19:53
事前に言葉が抜けてるよ。
「独自仕様で勝手に拡張可能なら」代入演算子は要らないだろうな。
「過去の資産が不用なら」コピーコンストラクタは要らないだろうな。

C++は、普及のために多目的・標準化・資産継承・効率を選んだ言語だからね。
独自拡張で安易に組み込み型を増やした方が、特定目的のためなら使いやすいし、
特定環境でなら便利に使えるさ。

String型なんて無いからね。
代入したくもなるさ。

Complex型なんて無いからね。
足したくもなるさ。

え、特定OSで特定目的しか考えてないからComplexなんて要らないって?
そうだろうな。普通はFORTRAN資産の置き換えなんて考えないだろうな。
なら、Variant型なんて無いからね。
COMを呼びたくもなるさ。
237デフォルトの名無しさん:2001/05/04(金) 21:22
てか、オブジェクトの複製をキチンと言語レベルで考慮してるのが
C++。
ポインタはないとか大々的に宣伝してるクセに、Stringを==で比較
するとポインタの概念無しには説明不可能な挙動をする某Java
みたいなクソ言語とは違う。
なんでStringクラスだけ+演算子が使えるんだよ。汚ねえ言語だ。
反吐がでるぜ。
238Java:2001/05/04(金) 21:44
StringBufferも使えるぞ。ゴルァ。
239デフォルトの名無しさん:2001/05/04(金) 21:54
どうしてStringとStringBufferが別になってるの?
ださいんだけど。
240デフォルトの名無しさん:2001/05/04(金) 21:56
>239
Stringがimmutableな方が便利だからじゃない?
241デフォルトの名無しさん:2001/05/05(土) 01:30
>デルの事は知らないけど、変数埋め込みがあろうがなかろうが宣言と
>ともにnewが呼ばれるなら抱き合わせは発生するんじゃないの?

デルでは宣言と共にnewは呼ばれないっす。
Javaからガベコレをとったようなもんです。

>「過去の資産が不用なら」コピーコンストラクタは要らないだろうな。

なんのこと?
あぁ。もしかして「C/C++の」過去の資産のこと?

Cの資産ならわざわざ請け負う奴が悪いとしか言いようが無い(笑)し、
#てゆーか我こそが継承者っていうでかい顔。
#C似のゲンゴなんか一杯あるのに。
そもそもCとはまた微妙に違うでしょOOPは。
同一性を重んじる必要があるかどうか?で
構造体とObjectは違う…のだけど
そこをわざわざ端折って混同してしまったのがC++。

C++のなら、それは単にC++の自慰だ。
いや、そりゃユーザーはいるのかも知らんが。#それじゃVBと同じ論法だ。

>特定OSで特定目的しか考えてないからComplexなんて要らないって?

関係ないなあ。
とりあえずデルについて言えば、言語仕様そのものには
別に環境依存な部分なんか無いもん。
#Kylixも出たし、という話もあるわけで。

>C++は、普及のために多目的・標準化・資産継承・効率を選んだ言語だからね。
>独自拡張で安易に組み込み型を増やした方が

それって矛盾してない?
標準化するならStringクラス(のInterface)を与えてくれても
良さそうなもんでしょ。
効率という旗印と標準化という旗印の間で
おろおろしちゃってる面が、あると思うぞC++には。
そういう意味では、重たくて困るが、Javaの
なんでも与えちゃうアプローチだって
十分認められるものだろうし。

>Stringクラスだけ+演算子が使えるんだよ。汚ねえ言語

無節操に増やせるゲンゴもどうかと思うが。
演算子なんて手ぇつけないほうが幸せだよ。
なまじさらりと読みやすいんで、勘違いを招きやすい。
関数形式で書いとけ。

>変数の文法的スコープとともにデストラクタを呼べる

そんなに役立つと感じないんだよな、あれ。
まぁたまには役立つと思えるのかも知れないが、
Scopeに従属した寿命をもつObjectがそんなに多いのか?という
根源的疑問が。
#以前Niftyで「スタック指向」とかいうドキュな考えを
#ぶちあげていた奴がいたっけな。
#ObjectをできるだけStackに積むように設計するんだってさ(笑)。
242デフォルトの名無しさん:2001/05/05(土) 01:43
ということで、
Javaはポインタすら理解できないアホ向けに作られた言語ということで
よろしいですか?

C++マンセー
243デフォルトの名無しさん:2001/05/05(土) 01:46
>とりあえずデルについて言えば、言語仕様そのものには
>別に環境依存な部分なんか無いもん。
>#Kylixも出たし、という話もあるわけで。

おまえ、何にも知らないんだな。
エラそうな口たたく前にちゃんと仕様書読みな。タコ。
244デフォルトの名無しさん:2001/05/05(土) 01:56
>ちゃんと仕様書読みな

は?ナニの?デルの?
C++のじゃないよな?この文脈だと。

>242
ポインタすら理解できないアホを
ポインタの道にはめる罠、じゃなくて?
#いや、ポインタそのものは勿論良いものなんだが。
245>241:2001/05/05(土) 02:00
>Scopeに従属した寿命をもつObjectがそんなに多いのか?という
>根源的疑問が。
ほとんどの変数はスコープに従属してると思うぞ。

#以前Niftyで「スタック指向」とかいうドキュな考えを
#ぶちあげていた奴がいたっけな。
#ObjectをできるだけStackに積むように設計するんだってさ(笑)。
俺はそうやって組んでる。newなんて一回も使わないことだってある。
C++の話な
246デフォルトの名無しさん:2001/05/05(土) 02:20
Forth系もスタック指向
こちらは定義そのものもスタックに積まれる。
領域が連続する利点はデカイよ。
気にするのはスタックのオーバーフローのみ。
247デフォルトの名無しさん:2001/05/05(土) 02:41
>>241

>標準化するならStringクラス(のInterface)を与えてくれても
>良さそうなもんでしょ。

C++標準にstringはあるが……。
俺なんか外してる?
248デフォルトの名無しさん:2001/05/05(土) 02:46
>>241
C++ でも class と struct を、それぞれ参照指向・値指向で使い分
けてれば幸せだったかも、と思うことはあるね。

しかし C++ の言語の成長過程を見てると、いきなり string を突っ
込むのは無理だったろうし、class と struct を同じセマンティクス
にしたからこそ、早期に C++ コンパイラの実装が出てきて、普及の目
処がたったというのも確か。

当時の事情を一切無視して、現在の視点から批判するのは簡単だけど、
あまり意味ないでしょ。とりあえずC♯に期待しとけ。
249デフォルトの名無しさん:2001/05/05(土) 10:14
おーい、デル厨よー、こんな所で吼えてないで
DelphiでOSを作ろう!
DelphiでCGI向けスクリプト言語を作ろう!
Delphiを組み込み分野に浸透させよう!
DelphiでJVM,CLRを作ろう!
運動でもしたら?
250デフォルトの名無しさん:2001/05/05(土) 10:26
俺、Delphiは好きだけど、デル厨は大嫌い。
251デフォルトの名無しさん:2001/05/05(土) 11:21
>>245
newを一度も使わないことがあるぅ?
それ痛すぎ。オブジェクト指向をちょっと勉強したら?
252デフォルトの名無しさん:2001/05/05(土) 11:28
>251
あなたの方が痛いようなきがする・・・・。
253デフォルトの名無しさん:2001/05/05(土) 12:12
(笑)と#ばかり使う奴、他スレまで出張してうざすぎ(ワラ
254デフォルトの名無しさん:2001/05/05(土) 12:26
>>252
オブジェクト指向とはnewを使うことと見つけたり
255254:2001/05/05(土) 12:28
>>251だった。逝ってくる。
256デフォルトの名無しさん:2001/05/05(土) 20:15
age
257デフォルトの名無しさん:2001/05/05(土) 21:22
ここの住人はどこ逝った?age
258デフォルトの名無しさん:2001/05/05(土) 21:25
ここにいるぞ。
259デフォルトの名無しさん:2001/05/05(土) 22:39
>>251
きっとあなたはJAVAしか触ったことがないのでしょう。
そしてオブジェクト指向とデザインパターンを修得した気になって
それを知らない厨房をこき下ろす快感のためにネットを徘徊している
のでしょう。
でもかわいそうに、OOPやデザインパターンを知らないのが厨房の証である時
代はとうの昔に過ぎ去ったのです。いまや誰でもOOPやデザパタを知っていて
不注意にこの言葉を使うとすぐに厨房であることがばれます。

まあ学生ならしょうがない面もありますが、将来この道で食っていこうと思って
るのならもうちっと勉強されたし。
260教えて訓:2001/05/05(土) 23:06
教えてください。
C++言語の設計コンセプト、設計思想ってどんなものなんですか?
261デフォルトの名無しさん:2001/05/05(土) 23:08
混沌
262デフォルトの名無しさん:2001/05/06(日) 02:42
デザインパターンは小技集だよ。
まずはオブジェクト指向をキッチリ覚える事の方が大事だと思う。
もともとデザパタなんて覚えなくてもいいようにできたものだと思ってたんだけどな。
どうもプログラマってマニュアル化が好きだよね。
263デフォルトの名無しさん:2001/05/06(日) 02:49
>262
>どうもプログラマってマニュアル化が好きだよね。
当然だろ。
264デフォルトの名無しさん:2001/05/06(日) 10:52
>>263
基本的にオブジェクト指向をしっかりと理解できていれば
デザインパターンなんて本なくてもあんなのはすぐに思い浮かぶねん。
逆に設計のレパートリーがあれしかないとかいったらそれは
使えないやつだと思うのだが。また、今後デザインパターンが増えるたびに
アレを敬愛するやつはその都度暗記していくのだろうか?
オブジェクト指向が理解できないやつってなんでもかんでも
覚えようとする傾向があると思う。「デザインパターンって本が
いいよ」いいよって聞いて読んで見たら「?」って感じだった。
あれは今更だよな。
265デフォルトの名無しさん:2001/05/06(日) 10:56
デザインパターンは他のプログラマとの意思疎通に役立つんじゃないのか?
266デフォルトの名無しさん:2001/05/06(日) 10:57
>>264
そんな人っているのかぁ。
でもあなたと仕事するのもつらそうね。
あれはコミュニケーションのための道具と理解してちょーだい。
267デフォルトの名無しさん:2001/05/06(日) 11:04
>>265-266
だからそれじゃC言語の時の構造化なんたらのときとまるで
変わらないじゃん。あのときも色々と出たよね(笑)(色々とね)
また色んな流派を作って破綻させるか?
結局他のプログラマが知らなかったらそれでおしまい程度の
トンでも本のような気がするなぁ。
実際、オブジェクト指向で組んでるうちにアレの存在理由も
かすれてくるでしょ。
268デフォルトの名無しさん:2001/05/06(日) 11:10
>>267
PLoPにいって皆説得しておいで。
269デフォルトの名無しさん:2001/05/06(日) 11:22
>>264
今ごろGamma本詠んでてそのせりふはないだろ。
270デフォルトの名無しさん:2001/05/06(日) 11:28
>>269
遅い?(藁
すまん逝ってくる。
271デフォルトの名無しさん:2001/05/06(日) 11:35
>実際、オブジェクト指向で組んでるうちにアレの存在理由も
>かすれてくるでしょ。

あの本の存在理由が薄くなる時代はすぐくるんじゃないかな。
なんか、あたりまえよ、って皆が思うようになるものだし、
Gammaらのねらいもそこらへんにありそうだし。

>>270
にーちゃん、学生とかにはあの本結構いいんだよ。実際USの大学
は結構つかってっぞ。なかなか0から思いつく人間もいないから、
先人の足跡は見せとくのがいいんだ。
272デフォルトの名無しさん:2001/05/06(日) 11:41
>>259
 あー? なんだ? 主語が欠落しすぎて何いってんだかよくわからん。
かわいそうなのは誰だ? この言葉とはなんだ? ちゃんとした日本語
書いてくれ。
 ってか、OOPって言葉、かなり懐かしいぞ(w
273デフォルトの名無しさん:2001/05/06(日) 12:29
>>272
懐かしすぎて憶えてもいないか? (w
274デフォルトの名無しさん:2001/05/06(日) 12:39
>>272
 そら言えるな。オブジェクト指向は分析設計に価値がある
ってことがとっくの昔に一般的になった昨今、OOPなんて
言葉を使うと素人だと思われるからね。ってか、この言葉は
素人判別用語だな。
 OOAとかOODってのすら最近聞かないよな。
275デフォルトの名無しさん:2001/05/06(日) 12:51
>>274
またプログラミングの重要性に気づいて
一周してきた気がするけど。ここ1,2年ってそんな感じしない?

2ちゃんで求めちゃいけないのかもしれないけど、
もちっと建設的にいこうや
276教えて訓:2001/05/06(日) 13:35
>>274
教えてください。
玄人判別用語はなんですか?
277デフォルトの名無しさん:2001/05/06(日) 14:44
今日はエンジェリックレイヤーがやるから後でな。
278デフォルトの名無しさん:2001/05/06(日) 17:58
>>275 一周してきたというのは、最近の XPブームのことを指してますか?
XP: 使うかどうか判らない部分までねちねち設計せずに、
さっさと必要部分「だけ」コード書いて、
まずけりゃ後からちゃちゃっと直そうぜ。
279デフォルトの名無しさん:2001/05/06(日) 17:59
>>277
みさきち萌え〜。

なんかPGにアニオタ多くない?
280デフォルトの名無しさん:2001/05/06(日) 20:12
>ほとんどの変数はスコープに従属してると思うぞ。

おーい。変数じゃなくてObjectっすよ。
ObjectはScopeに従属してるたぁ限らないだろ?
#そしてObjectは変数だけを束縛してるわけじゃないだろ?
#配列の要素とかさ。

もし変数とObjectを分けて考えられないとしたら
前述のStack指向(の間違えている部分)に嵌っている人
ということになる。

>Forth系もスタック指向

Forthは知らぬが、PostScriptなら、
Stackと辞書(原始的な変数管理物みたいなものであり、
これでヒープ(?)にとったObject(?)も管理できる)とを
両輪として使い分けるものだな。
Stackだけで頑張るのは不健全でし。
最適化の一環としてStackにおくものを増やすことは有るけど。
ちなみにPSの変数は参照です(^^;。Forthは違うのかな?

>>249
なに言ってんだ?
delphiとまるっきり同じObjectモデルを採る言語が
他にない(俺が知らない)ので名を挙げてるだけだが?
Javaはかなり似ているがGCの有無とかの違いが有るし。

>>253
今更なんだぁ?既にあちこちに出現してるが(笑)

>>259
でもnew(C++で言うところの)をメインに使わないと
結局OOPとしては半端な代物になるぜ。
同一と同値を区別しない世界にどんどん突入するからな。

そういう意味では>>248の意見に賛成。
classとstructをほぼ同じものとしてしまったC++の仕様は無意味に痛いし、
C#(boxingとかいうんだっけ。いざというときに変数埋めこみを使えるっていう)
に良くも悪くも期待するってのは言えてる。
尤もwinでないと使えないのなら困るが。
281デフォルトの名無しさん:2001/05/06(日) 20:54
>>280
>おーい。変数じゃなくてObjectっすよ。
>ObjectはScopeに従属してるたぁ限らないだろ?
もちろんObjectの意味で使った。でもあなたの最初の意見は
>Scopeに従属した寿命をもつObjectがそんなに多いのか?
でしょ?なぜ「従属してるたぁ限らないだろ」になってしまうのだ?
もちろん従属するとは限らないし、必要とあらば(Objectの寿命が不確定なら)new使うよ。

>同一と同値を区別しない世界にどんどん突入するからな。
まったくわからん。
  CGiko *pG = new CGiko();
  funcMona(pG);
  delete pG;

  CGiko g;
  funcMona(&g);
になるだけなのだが。
282デフォルトの名無しさん:2001/05/06(日) 21:25
4月後半から、この板全体がうざいね。
仕切りたがり、自己主張の押し付け、他方を貶める発言。

このスレに登場したきっかけが、
参照は何故必要か?
→コピーコンストラクタと代入演算子に必要
だけなのに、
わけわかんないこと言い出してかきまわしてるだけだもんな。

コピーコンストラクタはいらない、とか、
Cの後継はC++が勝手に主張しているだけだ、とか、
たった2,3のOSで特定のOSではない、とか。

言語仕様の話に限定しようとしても
クラスライブラリがカバー、とか、
IDEの補完機能が、とか、
言い出すんだろ。
283デフォルトの名無しさん:2001/05/06(日) 22:46
280の言う
>そういう意味では>>248の意見に賛成。
って、
>時の事情を一切無視して、現在の視点から批判するのは簡単だけど、
>あまり意味ないでしょ。とりあえずC♯に期待しとけ。
の最後の14文字だけなのか。
前半部分には賛成してないんだろうな。
そのものずばりの言動をしているんだから。
284デフォルトの名無しさん:2001/05/07(月) 01:05
そもそも言語仕様に限定する意味がわからないなぁ。
クラスライブラリーやIDEも考慮されての仕様だろ。
285デフォルトの名無しさん:2001/05/07(月) 01:45
>>280

>でもnew(C++で言うところの)をメインに使わないと
>結局OOPとしては半端な代物になるぜ。

C++ は純粋なオブジェクト指向プログラミング言語(=オブジェクト指向
じゃないとプログラムを書けない言語)ではないので、私はそのプログラ
ミングスタイルでも良いと思うよ。

デザパタ本でも言われてる「インターフェースに対してプログラミングすべ
し」という教義で解釈すれば、仮想関数を使いようがない値指向のクラスは
確かにクズな仕様。

しかし C++ の class はオブジェクト指向のクラスだけではなくて、従来
の C 言語で使われてきた実装の隠蔽方法(多態は関係なしに、単に実装を
隠すだけ。fopen(), fclose() みたく、関数へのポインタだけ外に出すよ
うな方法の延長)を効率的に支援することも意図している。

こちらの用途では、クラスは値指向で、その生成と破棄もスコープに縛られ
ていた方が都合が良い。Java みたくオブジェクトの解放タイミングを GC
まかせにすると

CFile file("filename.txt");
..
// ここで file オブジェクトが破棄されるので、自動的にファイル記述子も
// 解放される

とか書けなくなるし。

多様なプログラミングスタイルを効率的にサポートする、言語使用の美しさよ
りも実用性というのが C++ の思想なんだから、それに目を瞑って C++ の言
語仕様を批判しても意味がない。
286285:2001/05/07(月) 01:47
>>285
誤:fopen(), fclose() みたく、関数へのポインタだけ外に出す
正:fopen(), fclose() みたく、構造体へのポインタだけ外に出す
287デフォルトの名無しさん:2001/05/07(月) 08:24
>>282
 主語が欠落しすぎて何いってんだかわからないなあ。
fj.comp.lang.cみてーなつまんねー突っ込みだな
fjニカエレ
289.:2001/05/07(月) 16:33
>>285
「みたく」ってなに?おいしいの?
290デフォルトの名無しさん:2001/05/07(月) 20:53
ごたくの入門版
291デフォルトの名無しさん:2001/05/07(月) 22:47
>>281
> >Scopeに従属した寿命をもつObjectがそんなに多いのか?
>でしょ?なぜ「従属してるたぁ限らないだろ」になってしまうのだ?

なぜって?なんか変か?
1行目と2行目はつまり「同じ主張(の繰り返し)」なのだが?

>必要とあらば(Objectの寿命が不確定なら)new使うよ。 │

当然そりゃそうだが、一方で埋め込みなObjectって
存在価値がかなり薄いと思われるわけよ。

というか変数のScopeとObjectの寿命を同期させたいなら
別に埋め込みにする必要があるわけじゃなく、
たとえばauto_ptrみたいなものを最初から言語機能として、
用意すりゃ良かったろうに…と思う。
少なくとも「同期させたいから埋め込みを使う」っていう論は変。

> >同一と同値を区別しない世界にどんどん突入するからな。
>になるだけなのだが。

そりゃそうだが、それは最初の一歩でしょ。
292デフォルトの名無しさん:2001/05/07(月) 22:48
>>282
>このスレに登場したきっかけが、

きっかけだけでゴールまで決めつけないでよね。

>たった2,3のOSで特定のOSではない、とか。

実装がそれしかないってのが、なんか関係あるのか?
同じ仕様の別実装を作ればいいだけだろ?
FreePascalがどれだけやってるんだかは
不勉強なんで知らぬが。

#javaでRunAnywhereとかいうよりは、負荷が少ないと思うが。

>言語仕様の話に限定しようとしても
>クラスライブラリがカバー、とか、

話題によるね。 C++にルートクラスが無いのは痛い
(=おかげで色んな場面で面倒が生じる)と思うんで。
つまり、ライブラリと言語仕様の線引きは
一意に決まるとは限らない。

つーか>>284みたいに逆の意見もあるようだし(^^;
293デフォルトの名無しさん:2001/05/07(月) 22:49
>>283
> >時の事情を一切無視して、現在の視点から批判するのは簡単だけど、
> >あまり意味ないでしょ。とりあえずC♯に期待しとけ。
>の最後の14文字だけなのか。

その通りだ。それがなにか?なんで意味が無いといえる?
(C++を)使うのは今のおれたちなんだぜ。
ここは骨董マシン&OSで(骨董言語を(笑))動かす人のスレってわけじゃ
ないんだろ?
ならば今の視点で我慢ならん点を挙げるのがおかしいわけない。

まして「簡単」かどうかはどうでもいいことだ。
294デフォルトの名無しさん:2001/05/07(月) 22:50
>>285
>私はそのプログラミングスタイルでも良いと思うよ。

まぁ最終的にはそうなんですけどね…。

>隠すだけ。fopen(), fclose() みたく、関数へのポインタだけ外に出すよ
>うな方法の延長)を効率的に支援することも意図している。

で、その話をしようとすると、structとclassを
ほぼ同じモノだとしてしまう必然があったのかとか
#それこそC#か…
いう話になるわけですよね。

>Java みたくオブジェクトの解放タイミングを GC まかせにすると

でですね、参照ベースだけどGCにも頼らないという言語の一例として
delphi辺りを挙げる(のが無難だし単に自分が知ってるし)、という。

C++からdelphiに移行して、なるほどこんな(楽な)手があったんだなと
感心したわけですよ。

で、単に参照ベースにするだけじゃ駄目でして、
たとえばデストラクタ(のInterface)をバイナリレベルで共通化
できていないと、統一されたObject(の消去)の管理なんて出来ないので、
するとルートクラスは結局必要だ、だとか、
芋づる式に色々出てくるわけですよ、C++方式から「どんどん」離れていく理由が。

で、随分違う所に来てしまってふと後ろ(?)を振り返ると、
今までなんであんなところに居る「必要」があったのか?と
首をかしげるばかりなんですよ。

>// ここで file オブジェクトが破棄されるので、自動的にファイル記述子も
>// 解放される
>とか書けなくなるし。

とりあえずはauto_ptrでも書けますよね。

あ。そういや昔のTransTECH(99年12月)を開いたら
operator->*をいじることで楽になろうという話が
載っているなあ。読んでみます。C++を批判する理由が
減るならそれに越したことは無いんで。

まぁ、たこのようにナンデモ有りな言語仕様なんで
自分で好きな形に整形(限定)したうえで使う、
という手は使えます(けど)ね。C++は。
295デフォルトの名無しさん:2001/05/08(火) 01:06
>>291
>Scopeに従属した寿命をもつObjectがそんなに多いのか?
だと「ほとんどのものは従属してない」と読める。
>従属してるたぁ限らないだろ
だと「ほとんどのものは従属してるけどそうじゃないものもある」と読める。
で俺の主張は「ほとんどの(80%位か)Objectの寿命はスコープに従属している」
だけどこれに異論はあるの?
#ほとんどっていうのは実際にインスタンス化される回数ではなくてプログラ
#ムに表れる回数ね。

>たとえばauto_ptrみたいなものを最初から言語機能として、
だからauto変数こそ言語機能が用意してくれたauto_ptrなのだが。

なんか埋め込みと言う言葉を多用しているけどもしかしてメンバオブジェ
クトのことしか考えてないんじゃない?
オブジェクトの多くは関数ローカルなものでしょ。

それともオブジェクト同士が複雑に絡み合ってメッセージを投げ合って
いるようなものを想定してるのか?(シミュレーションとか)
モデル化する対象がそういうものならそう実装するしかないけど、おいら
がやってる仕事はもっと単純なものばっかなんで。
でもそっちのほうがメジャー。
296デフォルトの名無しさん:2001/05/08(火) 01:47
C++ほど強力な武器はないよ(アセにはかなわないが).
C++を一通りやってからほかの環境で作業してみると、
あれがない、この機能がないと不満が出てしまう....

仕事でPHPとかで書いていてもなぜか気が付くと
オブジェクトがたくさんできあがっている.
もう、オブジェクトなしでは生きていけない体になってしまったようだ.

Rubyちゃんにでも手を出してみるか.
297デフォルトの名無しさん:2001/05/08(火) 10:16
>>従属してるたぁ限らないだろ
>だと「ほとんどのものは従属してるけどそうじゃないものもある」と読める。

なぜ?多いとか(少ないとか)は一言も書いてないぞ?
ちなむと、

>「ほとんどの(80%位か)Objectの寿命はスコープに従属している」
(中略)
>オブジェクトの多くは関数ローカルなものでしょ。

異論あり。あなたのソースはそうなんでしょうけどね。

>#ほとんどっていうのは実際にインスタンス化される回数ではなくてプログラ
>#ムに表れる回数ね。

うーん。その数え方がすでに、Objectと変数の混同の
一歩手前ってかんじなんですけど…

>だからauto変数こそ言語機能が用意してくれたauto_ptr

ん?auto_ptrって、所有権を他のauto_ptr変数に
移すことができるでしょ?
一方で生のauto変数には出来ないっしょ?
そこが重大な差なんだけども。こっちのScopeから
Objectを救出(笑)したいと思ったらauto_ptrなら出来る。

>オブジェクト同士が複雑に絡み合ってメッセージを投げ合って

そこまで大げさ(?)に言わずとも、たとえば
ふつーのGUIアプリを作るときなんかも、
窓とコンポーネントがCompositeパターンを成すわけじゃん。
ローカル変数なObjectばっかりだと、それもうまく表現できないよ。
ああ。コンポーネントの数が最初から最後まで変わらないアプリなら
ローカル変数でも済むかも知れないけど、
逆にいえばnewを使うのが当然になると、コンポの数を
動的に変えるようなアプリを作ることの「障壁」が減る
感じがする。

>>296
Objectとそれ以外の有りがたみの「比率」を知る
(答えは人によって色々だろうけど)には、
rubyみたいな純粋っぽいOOP言語も触って
対比してみると良いっすよ。
298デフォルトの名無しさん:2001/05/08(火) 10:36
>>297
>異論あり。あなたのソースはそうなんでしょうけどね。
まあここが決定的な差なんだろう。あなたのソースではそうなんだね。

>ん?auto_ptrって、所有権を他のauto_ptr変数に
>…
>Objectを救出(笑)したいと思ったらauto_ptrなら出来る。
それってスマートポインタ?俺の中では
リファレンスカウント付きポインタ->スマートポインタ
スコープ脱出後自動消滅->auto_ptr
だった。(用語の正確さには確信無し)

>ローカル変数なObjectばっかりだと、それもうまく表現できないよ。
あたりまえだ。最初からいってるように寿命が不確定なものはnewするよ。
おれはnewなしでどんな物でも作るって言ってるわけじゃない。
逆に聞きたいけどあなたは関数ローカルなObjectを一切使わないのか?
もし使うならそれはauto変数の出番だろ。
299デフォルトの名無しさん:2001/05/08(火) 10:36
sageぐらい覚えてほしいよな。
300デフォルトの名無しさん:2001/05/08(火) 10:51
こっちは煽りレス
>#ほとんどっていうのは実際にインスタンス化される回数ではなくてプログラ
>#ムに表れる回数ね。
>うーん。その数え方がすでに、Objectと変数の混同の
>一歩手前ってかんじなんですけど…
アホか?インスタンス化される回数で数えたらループの中で100万回生成される
オブジェクトが一番になっちゃうだろ?
いまは実行時の効率の話をしてるわけじゃなくてコーディング時の話しなんだから
実際にインスタンス化される回数が一回だろうが、100万回だろうが、ソースコード
に現れる回数が重要だろ?違う?
301デフォルトの名無しさん:2001/05/08(火) 11:16
まあ、C++が汚くて他の言語の方が優れてるなんて事は、
(この板にいる)ほとんどの人は知っているのさ。
それを今更声を大にして叫ぶ奴がいるなんて思わなかったな。

美しい言語仕様と華麗な実装が好きなら、
C++などに目を向けないほうがいいだろう。
趣味や研究なら、それでいい。
それに、数年前ならいざ知らず、今なら、
Javaを始めとする、「C++よりはるかに美しい言語」で
仕事をすることも多々ある。

でも、現実にC++が標準となっていて、
難しいC++を理解できれば他の言語の理解も比較的容易であり、
未だにプログラミング入門にC/C++を用いる場所が他数存在し、
現実にC++を理解できなければ話にならない世界が存在する。

C++を理解しようとした努力と時間が、今の自分にも、仕事の上でも
何の役にも立っておらず、全て無駄だったと感じているなら、
そして、(特に仕事として選びたいと考えている)多くの人にとっても
無駄であると断言するつもりならば、
これからもずっとC++の悪口を並べていればいいさ。

残念ながらね、俺のまわりはC++を無視できるほど進歩的ではないし、
理論だけで食べていけるほど恵まれた世界には生きていない。
難しくて、ドロドロして、不合理で、過去のしがらみを捨てきれない、
そんなC++に対して悪口を言うのは簡単だけど、
それでは何も進まない。
正面から向かい合わないとやっていけないのさ。
302デフォルトの名無しさん:2001/05/08(火) 11:42
>リファレンスカウント付きポインタ->スマートポインタ
>スコープ脱出後自動消滅->auto_ptr

というか1と0しか数えられないカウンタを持った
スマートポインタでしょか(笑)、auto_ptrって。
リファレンスカウンタだって自動消滅を支援するだろうし。

排他的所有権を持つっていう考え方は面白い。
まぁ、ポインタを代入される側(=Object)に
なんら支援機能が期待できない状況(だから
ルートクラスくらい用意しようよ…)での、
スマートポインタに対する代案ではあろうけど。

>逆に聞きたいけどあなたは関数ローカルなObjectを一切使わないのか?

そりゃ使わないことはないが、(下に続く

>もし使うならそれはauto変数の出番だろ。

だからといって(生の)auto変数(に埋め込む)Objectの出番だと
言いきれるものでもないよね?という話です。
スマートポインタとかauto_ptrとかを使えば、
ローカルに使いたいObjectを消す面倒の問題と
Objectを他所にやるときの面倒の問題が
いっぺんにおおむね解決するよね。

そういやJavaは遅いわけだけど、VMの遅さとGCの遅さはともかくとして、
参照ベースであることは遅さにどれだけ寄与してるんでしょう?
#というわけで、参照ベースだけどVMもGCもない言語の例としてdelphi…以下略
#ただしdelphiにはスマートポインタ(やそれを自作する仕掛け)は無いけど(笑)。
303デフォルトの名無しさん:2001/05/08(火) 11:43
>>300
あんまり煽りには見えないけどね(^^;

>インスタンス化される回数で数えたらループの中で100万回生成される
>オブジェクトが一番になっちゃうだろ?

その数え方でいいじゃん。
100万個生成されてCollectionに所有される
っていうObject(たち)ならどう?

>いまは実行時の効率の話をしてるわけじゃなくてコーディング時の話しなんだから

そうだっけ?
というか、この話を効率の話に直結しちゃうところが
既に微妙に痛いと思うんですけど。
304デフォルトの名無しさん:2001/05/08(火) 11:54
>>301
>それを今更声を大にして叫ぶ奴がいるなんて思わなかったな。

っていうか、それを言うならスレタイトルからして既に
わかりきったことなのでわ…

>でも、現実にC++が標準となっていて、
>未だにプログラミング入門にC/C++を用いる場所が他数存在し、

うーん。多数論になっちゃうわけ?

>難しいC++を理解できれば他の言語の理解も比較的容易であり、

そうか?他の(メジャーな)言語では聞いたことない概念や
自分が言語自作するような日が来ても絶対サポートしないだろうなと
思われるような概念が、C++には色々有る、ということなのだが。
まぁ、反面教師(=装備しないほうが良い機能だなと考える)の
重要な候補を教えてくれたのは助かるが。

>全て無駄だったと感じているなら、

無駄とは思わないよ。でも、もっと良いもの(が有ること)を
知ってしまった以上は、無駄ではないとは言っても
それの在るべき場所は人の心の中および博物館だけでしか
ないんじゃないの?という話。反面教師。

>そして、(特に仕事として選びたいと考えている)多くの人にとっても
>無駄であると断言するつもりならば、

うん。自分で駄目だと思っているものを他人に「おすすめ」する訳無いじゃん。

>そんなC++に対して悪口を言うのは簡単だけど、
>それでは何も進まない。
>正面から向かい合わないとやっていけないのさ。

それを正面と言うか?C++を克服することから逃げてるだけじゃん。

本当の「正面」は、たとえばもっとマシな言語を
作るとか実装するとか持ってくるとか、じゃないの?

もちろん、正面でないのが「あなたの」せいだとは言い切らないけど。
不可避な理不尽は世の中いっぱいあるから。
でもそれはあくまで正面ではないね。
305デフォルトの名無しさん:2001/05/08(火) 12:17
欠点を指摘しあうスレは大抵こうなる。
http://mentai.2ch.net/test/read.cgi?bbs=prog&key=986993653
306デフォルトの名無しさん:2001/05/08(火) 12:18
さげろっての、ボケ。
307デフォルトの名無しさん:2001/05/08(火) 12:47
結局、「オブジェクト指向を」学ぶのにC++は向かないってことでしょ。
世の中にはC++で書かれた資料やサンプルやアルゴリズム等が蔓延している。
CS機・制御系等、事実上C/C++しか選択肢がない環境も多い。
それらを踏まえて「C++を」学ぶ人がいる。
もちろん、選択肢がC++以外にあれば、
いくらでも移行する人はいるだろうけどね。俺を含めて。

「C++を」学ぶ人に対して(タイトルどおり)、C++の欠点を指摘する。
とっても建設的だね。感動しちゃった。
308デフォルトの名無しさん:2001/05/08(火) 16:09
>「C++を」学ぶ人に対して(タイトルどおり)、C++の欠点を指摘する。
>とっても建設的だね。感動しちゃった。

欠点を指摘しないのが建設的なのか?
そんなに1を迷走させたいか?(w

スレタイトル見ろよ。問いは「なぜ難しいか?」なんだぜ。
そう問われて、欠点を指摘しないほうが変だろ?
309デフォルトの名無しさん:2001/05/08(火) 19:39
>>305
好きだね、キミも。
310>>302:2001/05/08(火) 20:17
>スマートポインタとかauto_ptrとかを使えば、
>ローカルに使いたいObjectを消す面倒の問題と
>Objectを他所にやるときの面倒の問題が
>いっぺんにおおむね解決するよね。
他所ってのは自分が呼び出す関数のことではないよね。それなら&で渡せるし、
そういうのを含めてローカルで使用するってことだ。
それ以外の意味で「他所」ならそのオブジェクトは「ローカルに使いたいObject」
という前提じゃないんだからパス。その2つを混同するのは痛くないのか?

まあauto_ptrで書いても別に問題がないのは確かだ。なんでauto変数にすればす
むものをいちいちauto_ptr?ってのは残るが、目的は達成できる。

あとauto_ptrだってスコープと共に自動的にデストラクタを呼んもらう、という
機能を使って実現されてるのだぞ。
まさにauto変数に埋め込むことの良い例ではないか?

もうひとつプリミティブ型はさすがにauto変数にしていると思うが、なぜnewで
作ってauto_ptrでラップしないのか、理由が聞きたい。
311デフォルトの名無しさん:2001/05/09(水) 01:02
 俺はC++の方がJavaよりも美しいと思うけどバカかな(笑)
 Stringクラスだけに演算子が使えたりするのって、美しい?
 多重継承が無くて、実装継承が1つ「だけ」使える、って美しい?
 クラステンプレートみたいなデータ型とアルゴリズムを分離する
方法が無くて、配列とかコレクションクラス使うたびにキャストの
嵐になるって美しい?
 言語仕様とクラスライブラリの境界が曖昧で、ユーザには絶対に
作れないようなクラスがどかどか存在してるって美しい?
 ロジックのみが単体で存在できず、Mathクラスみたいに強引に
クラスにいれないといけないって美しい?
 パッケージをpackage句とディレクトリの二重で管理しないと
いけないって美しい?
 多重継承のアンチテーゼみたいに言われているインターフェースが、
結局多重継承の最大の弱点と言われていたメソッド名のバッティングを
実はまるっきり解決できてないって美しい?

 わからないなあ。Javaってそんなに美しい?
312デフォルトの名無しさん:2001/05/09(水) 01:15
とりあえずプログラム言語にに「美しい」って言葉を使うの止めれば?
313デフォルトの名無しさん:2001/05/09(水) 01:36
scheme言語は美しい
314デフォルトの名無しさん:2001/05/09(水) 01:42
>>313
同意
315デフォルトの名無しさん:2001/05/09(水) 03:29
C++ ってむやみに強力だけど、美しくも汚くもないと思う。
型変換(時にオペレータ)とかが暗黙で呼ばれるというのは
タイプ数を減らすという妙なところにこだわっていて変だけど、
これは C の後継である以上いたしかたないし。

template はひじょーーーによいと思う。Java にも☆い
316デフォルトの名無しさん:2001/05/09(水) 03:45
>>312
 これは>>301さんが

>まあ、C++が汚くて他の言語の方が優れてるなんて事は、
>(この板にいる)ほとんどの人は知っているのさ。
>それを今更声を大にして叫ぶ奴がいるなんて思わなかったな。
>Javaを始めとする、「C++よりはるかに美しい言語」

 っておっしゃるもんだから、「この板のほとんどの人」が僕の疑問に
サクッと答えてくれるかな、と思って書いてみたんですよ。
 僕の意見としては、C++は美しくはないけど、C言語の素直なオブジェ
クト指向拡張だと思う。
Javaは美しくない。素直でもない。どっちかっていうと、地方出身の
女を専門に食い物にしているナンパ師のような、うさんくさい優しさを
感じるね。ただ、GCやってくれるのは便利だし、クラスライブラリは
強力だから、使える処理系ではあるかな。ただ、ひたすらうさんくさい。
317デフォルトの名無しさん:2001/05/09(水) 03:57
>>312
 なんで? 美しいって言葉使うのやめるとなんか良いことあるの?
318デフォルトの名無しさん:2001/05/09(水) 04:01
>>316
でCはじじい(職人)ですか。
319デフォルトの名無しさん:2001/05/09(水) 04:37
C++はテンプレートが便利ってことに尽きる。
320デフォルトの名無しさん:2001/05/09(水) 06:16
>>318
いいねぇ。じじいC。
321デフォルトの名無しさん:2001/05/09(水) 14:13
>それ以外の意味で「他所」ならそのオブジェクトは「ローカルに使いたいObject」
>という前提じゃないんだからパス。その2つを混同するのは痛くないのか?

区別しなくて済むのが有りがたいのだが。
Collectionとかにぶち込むとき、これはStack上のObjectかHeap上のかを
いちいち悩むのは、うっとうしくないっすか?

>あとauto_ptrだってスコープと共に自動的にデストラクタを呼んもらう、という
>機能を使って実現されてるのだぞ。
>まさにauto変数に埋め込むことの良い例ではないか?

そりゃC++のauto変数の特徴(利点?)を使って成り立ってるってのは
確かだが、同時にあれは、auto変数直接埋めの「欠点を克服」
することに使われているわけじゃん。実装手段と目的の話は別。
乱暴に言うならば、
「二度とauto変数を使わないために、auto_ptrはauto変数を使っている」わけ。

>もうひとつプリミティブ型はさすがにauto変数にしていると思うが、なぜnewで
>作ってauto_ptrでラップしないのか、理由が聞きたい。

それはまぁ…効率(笑)。Delphi/Javaも同罪。

ちなむとrubyあたりは、整数はMutableつーか識別可能にする意味が
無いっていう立場らしく、整数はauto変数と同じ扱い(文法に
そう明記されてるわけじゃないが)。

>>316
>C言語の素直なオブジェクト指向拡張だと思う。

素直じゃないと思うぞ。ObjectiveCあたりのほうがよほど素直でわ?
templeteとかの非OOPな要素が絡んでくるし。

あとメタクラス無いのも「素直じゃない」といえるかも(^^;


>>315
型変換の考え方がヒネリ過ぎってのは言えてる。

Javaにtempleteっすか。GenericJavaっすかねやっぱり。
ただしあれはC++のよりよくも悪くも軽量らしいっすね。
322デフォルトの名無しさん:2001/05/09(水) 14:22

>>311
Javaは決して言うほど美しくない面も多い。が、
C++のほうが美しくない面が多いってのと、
Javaと同じような面(???)をC++と比較してどっちがマダマシ
(ここでいうマシとはあくまで美しさだけの比較)か?という
やらしい面も有るし、ということも言えそう。

>多重継承が無くて、実装継承が1つ「だけ」使える、って美しい?

「C++の無制限な多重継承」よりは、「美しい」かも。
C++ももう少し色んな制限を設けたら良かったのに。
structとclassの話にしても、C#みたいに(笑)両者をはっきり
区別すべきだったろうと思う。

あと、OOP言語としての美しさを言うときに付きまとうのが、
機能を「Objectが」持っているかどうか?だったりもする。
C++はコンパイル時にObjectと関係なく処理が済んじゃう場面が
凄く多いので、OOP至上主義者には不気味に見えるよ(笑)。
たとえばtempleteはOOP畑でいえばTempleteMethodsやStrategy
だったりするわけだけど、C++はほぼ同じ(実行時に交換出来ないので
柔軟性において同等じゃないが)ことをコンパイル時にやってしまう。

>ユーザには絶対に作れないようなクラスがどかどか存在

JNIじゃ駄目か?(笑)

ん?実装の話だけしてる訳じゃないだって?
だって、C++だって「C++のObjectモデル」を破る合法な方法は
存在しないじゃん。同じことだ。メタクラスを俺にくれ。

>パッケージをpackage句とディレクトリの二重で管理しないといけないって美しい?

あれは二重管理じゃないと思うんだけど、間違ってますか?

>結局多重継承の最大の弱点と言われていたメソッド名のバッティングを
>実はまるっきり解決できてないって美しい?

ん?どこが?
Interfaceはバッティング問題を「逃避」してるだけだが、
逃避だけで十分な解決策だと考えてるわけじゃん。
なんか不味いの?
委譲とかのコードをうだうだ書かないとならんのはしんどいが、
それは別の話だし。
323デフォルトの名無しさん:2001/05/09(水) 14:26
>>321
無条件にヒープ上にオブジェクト作られたら、ゲームや組み込みなんか
で C++ を使えなくなってしまう。Win32 みたいに、プロセス毎に広大
で疎な仮想メモリ空間が提供されてない世界も、まだまだ多いですよ。
324お仕事中:2001/05/09(水) 14:31
ヒープは組み込み用用途にはあんまりむいていないからね。
C++まんせー
325>231:2001/05/09(水) 14:49
>区別しなくて済むのが有りがたいのだが。
>Collectionとかにぶち込むとき、これはStack上のObjectかHeap上のかを
>いちいち悩むのは、うっとうしくないっすか?
だからコレクションに(参照で)ぶち込むものは基本的に寿命不確定なんだからnew
するでしょ。その点では全面的に賛成してるんだけど。

>>もうひとつプリミティブ型はさすがにauto変数にしていると思うが、なぜnewで
>>作ってauto_ptrでラップしないのか、理由が聞きたい。
>それはまぁ…効率(笑)。Delphi/Javaも同罪。
じゃあ効率を意識しなくて良いときにはプリミティブもnewで確保するのかい?
C++では、あなたが
・プリミティブを値として保持するか
・プリミティブを参照として保持するか
を選択できるんだよ。
326デフォルトの名無しさん:2001/05/09(水) 15:02
>>324
うーん。するとJava(でEmbedded)については
どう考えると良いでしょうか?
「あんなの全然駄目だよ」で終わり、ってことですか?

Wabaなんていうふざけた処理系も有りますね。
まだZ80に移植した人は居ないのかな?
ラピュータになら居るけど。

>>325
選択できることのありがたみって結局なによ?という
話になると思う。二つモデルが有っても、その
デメリットよりメリットが多いならば、という。
327デフォルトの名無しさん:2001/05/09(水) 15:07
おっと。見落とした。

>・プリミティブを参照として保持する

ってナニ?参照で「保持」はできんでしょ。
C++の参照はマスター(笑)の変数の存在に依存するから、
結局はプリミティブを値として持つ奴が存在する。

それとも古典的ポインタの話?
じゃないよね?
328デフォルトの名無しさん:2001/05/09(水) 16:15
現在のOSが何言語で作られているかを
考えれば、C++言語とその他の言語の比較は甚だ奇妙と
言わざるを得ない。
さらに言えばJava言語はC++言語のサブセットであり、
もちろん実装の多くの部分はC++言語である。

Javaにとって重要なのは、その巨大なライブラリが
無料であるということに他ならない。
皮肉なことは、Java言語が、すでにC++言語よりも
古いプログラミングパラダイムに居るということだ。
329>:2001/05/09(水) 16:32
>選択できることのありがたみって結局なによ?という
>話になると思う。二つモデルが有っても、その
>デメリットよりメリットが多いならば、という。

???
>>もうひとつプリミティブ型はさすがにauto変数にしていると思うが、なぜnewで
>>作ってauto_ptrでラップしないのか、理由が聞きたい。
に対して
>それはまぁ…効率(笑)。Delphi/Javaも同罪。
って答えたわけだ。だから効率が重要でない局面ならauto_ptr使うのか?
#違うだろ?C++はあなたが選択できるんだってことを忘れてはいないかい?
#という意味を込めて
と聞いたんだけど。わかりにくかったなら謝ろう。
結局
「効率が重要でない局面ならプリミティブに対してauto_ptr使うのか?」
答えてくれ。

>それとも古典的ポインタの話?
そうだ。
値を保持する->auto変数
参照を保持する->ポインタをラップしたauto_ptr
330デフォルトの名無しさん:2001/05/09(水) 17:07
>「効率が重要でない局面ならプリミティブに対してauto_ptr使うのか?」

再考したんだが。
プリミティブってintとかだよねえ。
すると「同値性と同一性を区別する意味」が
あんまり無いモノである場合が多いだろうな。
それならば、
かつ、そのサイズの極端な小ささ(笑)により
ポインタを経由することでコストをちっとも削減できないので、
auto_ptr使わなくてもいいっか。

構造体(やソレによくにたObject)は話が別ね。
331デフォルトの名無しさん:2001/05/09(水) 17:24
OSは微妙なところだなあ。
C++だとObjectモデルが二重管理っぽくなっちゃうでしょ。
あるいはマクロとかでC++言語に事実上手を加えるか。

C++ってコンパイルしてナンボなんで、
かつて見たこともないような全く新しい
実装とInterfaceを持った新たなModuleを
「動的リンク」しようとすると、
C++の範囲では手の打ちようがないよね。

リフレクションとかが強い言語のほうが
OSを作り、かつそのモデルをシームレスに
アプリとかの環境にまで展開するには(^^;、
ずっと便利でしょうね。

というわけで、

>現在のOSが何言語で作られているかを
>考えれば、C++言語とその他の言語の比較は甚だ奇妙と

>Java言語はC++言語のサブセットであり、
>もちろん実装の多くの部分はC++言語である。

それって関係有るの?
単に二重管理しているだけ、というか、
C++のObjectモデルとは関係なく
フルスクラッチで新たなObjectモデルを作って
それをOSなりJavaなりに提供してるっていう構図
だと思うが?

単に、超メジャーな言語で、Cよりは便利な面も多い言語、
として使われているだけだと思う。

いや、単にそのことを指摘したい文章だったなら、ごめんな。

>皮肉なことは、Java言語が、すでにC++言語よりも
>古いプログラミングパラダイムに居るということだ。

新旧を言うなら、Smalltalkが一番古いわな(笑)。
進歩と変化は別概念だよ。

新しいパラダイムの部分って、例えば他の言語をC++で実装するときに
どれだけ活用されてるの?
あんまり活用されていないならばそれは「蛇足」なのかも知れないよ。
332>:2001/05/09(水) 17:28
>プリミティブってintとかだよねえ。
>すると「同値性と同一性を区別する意味」が
>あんまり無いモノである場合が多いだろうな。
なぜだ?
 int *pInt1, *pInt2;
 if (pInt1 == pInt2)// 同一性
 if (*pInt1 == *pInt2)//同値性
はぜんぜん別のものでしょ?

それに多くのオブジェクトは同値性を使わないのだから
それこそ「同値性と同一性を区別する意味」がないんでないの?
333デフォルトの名無しさん:2001/05/09(水) 17:29
>>326
組み込みといっても分野が広くて、ある程度の広さのメモリ領域を
使えて、リアルタイム処理もさほど厳しく要求されないケースもあ
る。たとえば i アプリとかね。こういうケースでは Embedding
Java が活用できる。

ただし次のようなケースでは Java は使えないし、組み込みでは、これ
は珍しくない話。

- メモリリソースやリアルタイム処理の制限が厳しい
- OS の機能が限定されている、もしくは、そもそも OS がない
- OS やデバイスドライバを書く

こういう用途では、アセンブラと C/C++ が活躍する。Java や Delphi
の出番はない。

p.s.

少しは自分で考えなよ……。自分が知らない分野のことは「見ない・
聞かない・言及しない」って態度だと、いつまで経っても Delphi 厨
房を卒業できないよ。
334デフォルトの名無しさん:2001/05/09(水) 18:35
>>331
実際の OS のソースコード読んだ上で言ってる?
335デフォルトの名無しさん:2001/05/09(水) 19:46
>int *pInt1, *pInt2;
>if (pInt1 == pInt2)// 同一性
>if (*pInt1 == *pInt2)//同値性
>はぜんぜん別のものでしょ?

区別する意味あるの?

>それに多くのオブジェクトは同値性を使わないのだから
>それこそ「同値性と同一性を区別する意味」がないんでないの?

いや、正確に言おう。区別するかどうかというよりも、
「同一性が使えないと困る」。
コピーばっかりしまくると困るわけだよね。


>>333

Javaについて。それって参照ベースのObjectの話と
関係あるのは何割までなんでしょうか?
VMが重いとかの話になってませんか?
まぁCPUネイティブのStackを使うと
メモリ管理の手間が最小化できる
というメリットはありますけど。

>少しは自分で考えなよ

逆だよ。自分で考えたからこうなってるんだよ(笑)。

つーわけですまん。OSのコードはあんまり読んでないな。
でも出来るわけないのは「自明」じゃん。
まぁ継承の替わりになんでもかんでも委譲でやれば
ある程度のことは出来るが。
336デフォルトの名無しさん:2001/05/09(水) 21:46
JavaはCで作られたUNIXを既に超えていると思う。
Javaを言語なんて言ってると大事なところをとりこぼしちゃうでしょ。
もちろんOS無しには動かないけどあれだけのライブラリがあると
もうアプリケーションみたいだよね。

そういう意味で.NETも面白そうだとは思うけど、、、
二つもいらないなぁ・・
337デフォルトの名無しさん:2001/05/09(水) 22:42
>>336
UNIXを越えるとアプリケーションか。
つまりOSを越えたものがアプリケーション。
近藤君病院へ逝って良し。
338336:2001/05/10(木) 00:00
>>336
実現されていない理念を狂信するのはやめたほうがいいよ。

頼むから、簡単だからって安易にスレッド作ったりJDBCコネク
ション切ったり繋いだりを繰り返さないでほしい。
ソース上は簡単でも実行時は半死体状態。「99%以上ちゃんと
動く」ようにするには、スレッドスケジューリングとかいろいろ
難しいことがありすぎて死ぬ。結局、各種リソース確保解放の概念や
同期プログラミングの基本的な手法を知らない馬鹿をJavaで凄い
プログラム出来た気にさせてしまっているのは、VBと同じで長期的には
犯罪だと思うんだがなあ。
339!336:2001/05/10(木) 00:01
あれ?俺なんで336なんて書いたんだろ?スマソ。
340デフォルトの名無しさん:2001/05/10(木) 01:12
>>336
「大事なところ」って何?
341デフォルトの名無しさん:2001/05/10(木) 01:18
>>336
これが結構妄言であることは俺(笑)も賛同するが、
だからといってunixのfork()はやっぱり勘弁だな…
342デフォルトの名無しさん :2001/05/10(木) 01:24
>338&341&その他
いいかげん不毛なんでsage進行でやってくれや。
343デフォルトの名無しさん:2001/05/10(木) 01:45
>>341
はいはい、fork() が云々とか言うくせに、どうせプロセス・スレッドの代表的な
Design and Implementation も知らないんでしょ? 知らないことは、批判せず
に黙っててくれないかな、邪魔だから。

C++ と関係ないんで sage ます。
344デフォルトの名無しさん:2001/05/10(木) 10:29
>>if (pInt1 == pInt2)// 同一性
>>if (*pInt1 == *pInt2)//同値性
>はぜんぜん別のものでしょ?
>区別する意味あるの?
おいおい…
C++においてはintはimmutableじゃないんだから区別しなくちゃさぁ。
「区別する意味あるの?」なんてきっとRubyかなんかの議論を聞きかじって
混同しちゃってるんでないの?

>いや、正確に言おう。区別するかどうかというよりも、
>「同一性が使えないと困る」。
>コピーばっかりしまくると困るわけだよね。
なおさら意味不明。まあ上のが分かってないならこうなるか。

もう一度次のことをヨーク考えてみよう
・C++ではプリミティブとクラスが限りなくシームレスである。
・つまりC++ではどんなものでも(intでさえ)Objectである。
・もちろんintは継承もできないし、メソッドも少ししかない
・さらにポインタもObjectである。
345デフォルトの名無しさん:2001/05/10(木) 14:28
>C++においてはintはimmutableじゃないんだから区別しなくちゃさぁ。

おいおい? intの「値」がmutalbeだってのか?
変数と値を、やっぱり混同してないか?
ここで変数の話を持ち出してもしょうがないだろ。

>・C++ではプリミティブとクラスが限りなくシームレスである。
>・つまりC++ではどんなものでも(intでさえ)Objectである。

Objectって語の定義を、そもそもOOPでの定義から
離れさせようってのかよ。
そんなことしたらそもそも会話にならないのだが?

intがObjectねえ。OOP以外の畑ではそう呼ぶこともあるが、
C++のint(値も、当然変数も)は、
OOP的にはどう転んでもObjectじゃないだろ。
もしかして多態とoverloadを勘違いしてたりせんか?

というか、C++でプリミティブとクラス(もといObject)が
シームレスに扱える理由は、両者ともObjectであるから、じゃないぞ。
両者ともObject以外のナニか(?)としての性質を持っているから、だ。

>>343
自作言語(C系とは全然似てない)に似非マルチスレッド
の仕掛けを実装しようと思っているところだが、それがなにか?
似非といってもOSネイティブスレッドを使わないというだけの意味。

そりゃそうと実装を知ってどうすんだよ?実装がどうであろうが
Interfaceていうかモデルは、同じ(でないと不味い)だろ?
346デフォルトの名無しさん:2001/05/10(木) 15:03
sageでやれ
347デフォルトの名無しさん:2001/05/10(木) 16:26
>>C++においてはintはimmutableじゃないんだから区別しなくちゃさぁ。
>おいおい? intの「値」がmutalbeだってのか?
>変数と値を、やっぱり混同してないか?
>ここで変数の話を持ち出してもしょうがないだろ。
変数の話だよ。なんで「変数の話を持ち出してもしょうがない」のだ?
あと「intの値」っていうのが
1・intが(ポインタだとして)指し示している値(オブジェクト)
->intはポインタじゃないんだからX
2・intに代入されている数字
->そんなこといったらCFileの値だってimmutableだが?

>intがObjectねえ。OOP以外の畑ではそう呼ぶこともあるが、
>C++のint(値も、当然変数も)は、
>OOP的にはどう転んでもObjectじゃないだろ。
>もしかして多態とoverloadを勘違いしてたりせんか?
多態がObjectの条件ならJavaのStringはObjectじゃないってことか?
intと普通のクラスの違いはintがfinalであること以外になにがある?
#?が多いなぁ
348デフォルトの名無しさん:2001/05/10(木) 20:04

 ども。久しぶりに来てみたです。

>>325

>>多重継承が無くて、実装継承が1つ「だけ」使える、って美しい?
>
>「C++の無制限な多重継承」よりは、「美しい」かも。
>C++ももう少し色んな制限を設けたら良かったのに。

 よくわからないな〜。美意識の違いか?
 例えばですね、オブジェクト指向的に考えると、基底クラスというのは
派生クラスにとって、ある種の関連があるわけですよね? まあ言い古された
言葉で表現すると、is-a関係とか。
 それが、基底クラスと派生クラスの関係だったとして、じゃあ、派生クラスに
とって、そのような関係となりうる基底クラスが、果たして常に1つしかないの?
ってのが僕の疑問。
 Threadクラスなんていい例だけど、「あるクラス」がマルチスレッドで動作する
とする。Threadクラスが「スレッド」そのものをクラス化したものではなくて、
「マルチスレッドで動作するクラス」をクラス化したものであるというのは
仕様を見ればわかる。つまり、その「あるクラス」is-a「Threadクラス」な
わけですね。だから、基底クラスにする。
 ところが、その「あるクラス」が既に別の基底クラスを持っていたとする。
そうなると、「あるクラス」is-a「Threadクラス」であるんだけど、それを
実現する継承機構は使えず、Threadクラスは基底クラスになれない。
 理由は一つ。「Javaでは基底クラスは早い者勝ちだから」でしょ?
 どうですかね? このルール、美しい? 僕はC++の無制限な多重継承
のほうが原理をそのまま表現しているという点で、美しいと思うけど。
(使いやすいかどうかは別の議論として)


>C++はコンパイル時にObjectと関係なく処理が済んじゃう場面が
>凄く多いので、OOP至上主義者には不気味に見えるよ(笑)。
>たとえばtempleteはOOP畑でいえばTempleteMethodsやStrategy
>だったりするわけだけど、C++はほぼ同じ(実行時に交換出来ないので
>柔軟性において同等じゃないが)ことをコンパイル時にやってしまう。

 テンプレート引数になるオブジェクトが多態性を意識した
継承構造を持っていれば、十分いけますよ? ってか、C++で
パラメタライズドクラスを使うときはそれが基本だと思います。


>>ユーザには絶対に作れないようなクラスがどかどか存在
>
>JNIじゃ駄目か?(笑)

 JNIってJavaの言語仕様の一部なのかな?


>だって、C++だって「C++のObjectモデル」を破る合法な方法は
>存在しないじゃん。同じことだ。メタクラスを俺にくれ。

 これは同意。メタクラスほしい。いろいろ工夫したけど、簡単に
やる方法はみつからなかった……

>
>>パッケージをpackage句とディレクトリの二重で管理しないといけないって美しい?
>
>あれは二重管理じゃないと思うんだけど、間違ってますか?

 僕はどっちかにしてほしいな。クラスモジュールの再利用性が落ちる。


>
>>結局多重継承の最大の弱点と言われていたメソッド名のバッティングを
>>実はまるっきり解決できてないって美しい?
>
>ん?どこが?
>Interfaceはバッティング問題を「逃避」してるだけだが、
>逃避だけで十分な解決策だと考えてるわけじゃん。
>なんか不味いの?
>委譲とかのコードをうだうだ書かないとならんのはしんどいが、
>それは別の話だし。

 いや、解決とか逃避とか、そういう言葉選びはどうでもいいんだけど、
要するに全然ダメじゃん?
 例えば、C++なんかだと、あるクラスが

class Base1
{
void foo () ;
} ;

class Base2
{
int foo () ;
} ;

 だったりすると、この二つを多重継承するともうダメ、ってのが問題点
として言われていたりしますよね? これがメソッド名バッティング問題。
 で、じゃあこれをJavaがinterfaceで解決(まあ逃避でもいいけど)して
るかというと、なぜか多くの人はinterface使えばオッケーだろ!interface
は多重継承の問題点を解決した美しい仕組みでimplementsし放題!って
思ってるらしいんだな。でも、ちょっと考えればすぐわかる。全然ダメ。
 僕がJavaを「地方出身の女ねらい専門のナンパ師」って言うのは、
ここいら辺が理由ですね。
349デフォルトの名無しさん:2001/05/10(木) 21:12
Javaには総称が無いからな……。
いや、できなくはないけど……。

List<String> lst = new List<String>();
lst.add("TEXT");

のようにクラスを指定できて、<>を省略したらObjectを指定したことになる。
というわけにはいかないのか??
Eiffelの、制限が付けられる総称みたいな。
350デフォルトの名無しさん:2001/05/10(木) 23:47
>>348
コードでもデータでも実体のあるものを継承すると(カプセル化が弱まって)いろいろ問題が起きて来るわけで、
C++ならすべて純粋仮想関数、javaならinterfaceだけ(継承は使わずに)で、作ればいいんじゃない?
カプセル化とポリモフィズムそのものはバッティングしないが、カプセル化とコードやデータの継承は、
もともと相反するものだし、それはどのOO論者でも一致していると思う。背反するものをC++もjavaも
それぞれ妥当と思う地点でバランスをとっている(つもり)になってるわけだ。どっちが優れてるとは
いえないと思うけど。どちらもベストではないというだけの話。(これはポインタやメモリ管理にも
いえる)
351デフォルトの名無しさん:2001/05/10(木) 23:51
だからあえて言えば、(データやコードの)継承はC++みたいに複数許すのも、javaみたいに1個しか
許さないのも、合理的ではなく、0個が唯一の正解、ってのはダメ?(笑)
352デフォルトの名無しさん:2001/05/10(木) 23:58
もひとつ。smalltalkでさえメタクラスなんて普通は使わない。smalltalkそのものを
実装する時以外は。メタクラスがほしいって、どういうときにほしいの?
(煽りじゃなくて素朴な質問。たとえば〜をやろうとしたときに、〜ができれば
いいなと思った、って回答を希望)
353デフォルトの名無しさん:2001/05/11(金) 00:12
>>350
 こんばんは。348です。
 どうも僕は勉強不足のせいか、継承の問題点って全然わからない
のですよ。自分がハマったことがないので。
 実体のあるものを継承するとカプセル化が弱まる、ってなんで
なんでしょうか。全然イメージ湧かないのですけど。
 例えば、派生クラスから基底クラスの属性を直接いじくるような
コードを書く人がいるってことですか? C++なら、メンバはprivate
が基本ですよねえ?
 たとえ継承を使わずに委譲で実現したとしても、結局はなんらかの
方法で、その属性を変更しないと処理が実現できないのでは? だから
いじるのだろうし。
 うーん、良くわかりません。
354デフォルトの名無しさん:2001/05/11(金) 00:30
え?
属性というのはデータってことで、データもコードも基底クラスのものを
利用するから、いろいろややこしいことが起こるわけでは。

メンバ関数のエントリしか継承しなければ、多重継承でもなにも問題は
起きないはず(コードもデータも自分のクラスで自分で実装する)。

要は基底クラスのものは「何も利用しない」。必要なのはポリモフィズム
を成立させるためのエントリだけ、という主張です。

いかが?
「それではコードの再利用ができないではないか」という以外の反論は
ないと予想しますが。
355爆弾発言?:2001/05/11(金) 00:37
JCP JSR-014がパブリックレビューが、ついこの間終わったぞ。
もうすぐ、JavaでSTLが使えるようになるよん。
356デフォルトの名無しさん:2001/05/11(金) 00:54
>>349
総称ってなに?
解説 or サイト紹介キボーン
357デフォルトの名無しさん:2001/05/11(金) 01:26
>>354
 っていうか、継承批判のあとには、必ず「委譲でGO」って
ことじゃないですか? 委譲すらしない、ってこと?
 委譲しないってことは、他のクラス使わないってことで、
それはまあありえない。しかし、委譲するなら、メソッドは
使うし、それにともなって属性も(間接的に)外からいじる。
 そうすると「いろいろとややこしいこと」がおこるのでは?

 そもそも、その「いろいろとややこしいこと」ってのが
わからないのですよ。前回もいったけど、継承でハマった
ことがないので。
358349ではないが:2001/05/11(金) 01:42
>>356
総称generic
抽象化されたデータやアルゴリズムの事です。
C++のテンプレートの様なもの。
メタクラスを作れる言語ならあたりまえの様に定義できます。
359デフォルトの名無しさん:2001/05/11(金) 01:43
>>355
Javaでテンプレート?
360デフォルトの名無しさん:2001/05/11(金) 02:03
>>357 ん〜それではあなた自身があげている多重継承の問題を
javaのinterfaceは何も解決していない、という「問題」とは何?
361デフォルトの名無しさん:2001/05/11(金) 02:17
一般にいわれる多重継承の問題というのは、class Aとclass Bが
それぞれ思い思いのfoo()を定義しているとき、AとBを継承した
class Cのfoo()は、どうしたらよいか?というものだと思う。

foo()の中身が2つあるのが問題で、選択肢は、

1)多重継承そのものを禁止する
2)多重継承は許すが、foo()の中身が0個以上あることを禁止する。
  私が上で述べたこと。両方をinterfaceに。
3)多重継承は許すが、foo()の中身が1つ以上あることを禁止する。
  一方をinterfaceに。
4)多重継承を許し、両方にfoo()の中身があることも許し、つじつまを
 あわせるために、 class Cのfoo()がA::foo()とB::foo()を駆使してが
 んばる(笑)

となるはず。で、4)は結構つらい、というのが多重継承のややこしい
問題だと思うけど?(はしょっているけど一番大きな問題はこれに
集約されるはず)
362デフォルトの名無しさん:2001/05/11(金) 02:25
書き直し^^;

1)多重継承そのものを禁止する
smalltalkとかね。(多重継承版smalltalkもあるというつっこみはなしね)

2)多重継承は許すが、foo()の中身が1個以上あることを禁止する。
  私が上で述べたこと。両方をinterface(純粋仮想関数)に。

3)多重継承は許すが、foo()の中身が1つ以上あることを禁止する。
  継承は一つにして他をinterfaceに。 javaですな。

4)多重継承を許し、両方にfoo()の中身があることも許し、つじつまを
 あわせるために、 class Cのfoo()がA::foo()とB::foo()を駆使してが
 んばる(笑)

C++は4)を含めて1)〜4)のいずれもできるようになっている。
プログラマの責任でね。一方javaは1)〜3)までの自由度しかない。

両者の違いは、プログラマに権利と”責任”を負わせるか、それとも
権利も責任も制限するか、といった設計思想の問題。
363デフォルトの名無しさん:2001/05/11(金) 02:26
鬱だ死のう

3) 1つ以上 ->2つ以上
364デフォルトの名無しさん:2001/05/11(金) 02:34
>>358
ありがとう。
genericの訳だったのね。
365デフォルトの名無しさん:2001/05/11(金) 02:53
 こんばんは、>>357です。

>>360
 >>348に書いてあります。読んでみてください。

>>361
 僕は実をいうと1-4の全てのアプローチに反対、っていうか
賛成しかねる。
 では何かというと、

5) 多重継承を許し、両方にfoo()の中身があることも許す。
 しかし、その二つの基底クラスに優先順位を持たせ、優先
 されるクラスに属するfoo()が優先的に実行される。

 いわゆるMixinですね。MixinはRubyにもあるらしいですが、
歴史は案外古くて、Lisp系のOPLのFraverが初出ではないかと
思います。(歴史については詳しくは知らない)

 で、実はあまり知られていませんが、C++はMixinを実現
できます。クラステンプレートを使うのですが、基底クラスの
指定にテンプレート引数を指定するのです。つまり、基底クラス
を静的に指定するのではなく、インスタンスを生成するときに
キミはこのクラスを基底にしなさい、と与えてあげるのですね。
 これですと、多重継承は使わずに(つまり、多重継承から
発生するいろいろな問題を回避しつつ)、機能的には多重継承
とほとんど変わらない機能を実現できます。パターンでいうと
デコレータにかなり近いです。
 もちろんこれはこれでいろいろと問題が出てくるのですが、
実際のソリューションとしては僕は一番気に入っています。
 それに比べると、Javaのアプローチは全く本質的ではない
ように感じます。あえていえば、「美しくない」ですね、全く。
366デフォルトの名無しさん:2001/05/11(金) 02:58
>>365
テンプレートを使った Mixin のサンプル希望。
367デフォルトの名無しさん:2001/05/11(金) 03:27
>>366
365じゃないけど、こんなかんじのことなんじゃないの?

template <typename DATA>
class Node : public DATA {
public:
  Node<DATA> *next;
};

Node<Hoge> *pHogeNode = new Node<Hoge>();

こうことのことだったら、よく使われることだと思ふ。
#コンストラクタがめんどいことになることもよくあるけど
368デフォルトの名無しさん:2001/05/11(金) 03:28
>>356 >>366
教えてクン? 教えてクンじゃないか!
いやあ久しぶりだね。
またあいかわず人に教えてもらっているのか?
いつまでもそんなことしてたら嫌われるぞ。
前に教えた検索サイト、使ってるか?
おっと、約束の時間だ、急がないと。
それじゃあこれで失礼するよ。
くれくれクンにもよろしくな。
369デフォルトの名無しさん:2001/05/11(金) 03:50
>>365

>>348は読んでいて、私の解釈が>>361なのだけど(書き方がまずくてスマソ)

で、5)の話なんだけど、多重継承で問題となるのは、主として、共通の基底
クラスから派生した複数のクラスを両方継承する場合だと思うけど(それ以外
であれば大抵何とかなる)、5)だとその問題が存在しないの?なんか
問題は依然として残ると思うんだけど。ただ5)の中身がよく理解できてない
かもしれないから、できればコードで例をあげてくれるとうれしい。
370369:2001/05/11(金) 04:10
補足。
私の解釈では5)がよいというのであれば、あなたの主張は「javaの欠点はinterfaceが
あること、ではなくて、テンプレートが無いこと、」ということでよい?

基本的に継承についてはC++の方がjavaの持つすべてを包含しているのだから、
まあ、〜の記述がC++ではできるけどjavaではできない、という意味では、javaは
常にC++より劣っていることに異存はないけど。。。
371369:2001/05/11(金) 04:57
補足の補足(書き直すね)

javaやsmalltalkの場合、すべてのクラスがObjectから派生するので多重継承は
必然的に>>369の状態になる。C++の場合はどういったクラスライブラリをベース
にするかで変わるけれど。この場合に抽象クラス以外を多重継承したが最後、
clone()メソッドさえ、簡単には実装できない。

だから多重継承を使わず、単一継承+委譲を勧める、というのであれば、まったく
正しく、なんの異論も無い。多重継承を使わなければ書けないプログラムなど
ないので。(多重継承を使ったほうがよりエレガントに書けるという主張はもちろん
ある。)

5)は単一継承+委譲+テンプレートであると思うので、javaにテンプレートが
ない分、javaが劣っているというのであれば、それはそのとおりと思う。
372369:2001/05/11(金) 05:32
>>365
Mixinについて少し勉強したよ。ちょうどRubyの本が手元にあったんで。
おかげで勉強にはなった。まあ自分が述べたことは間違いではないと
思っているが、あなたの言いたいことはよく分かった。ふむ。

ところで…Rubyの作者ご本人?まさかね^^;なんか文体が似てるんだけど。
373デフォルトの名無しさん:2001/05/11(金) 05:38
mix-inって、基本クラスとインスタンスを持たないMix-inクラスに
分類して、基本クラスを使って多重継承するときは必ず一つだけ
基本クラスを使うっていうルールのことじゃないの?
374デフォルトの名無しさん:2001/05/11(金) 06:12
>>366
>テンプレートを使った Mixin のサンプル希望。

ATL がほぼそんなパターンじゃない?

色付ボタンのウィンドウと、カーソルが親指になるウィンドウを

class CColorButton : public virtual CWindow { ... };
class CChangeCursorWindow : public virtual CWindow { ... };

とせずに、

template <class T=CWindow> class CColorButton : public T { ... };
template <class T=CWindow> class CChangeCursorWindow : public T { ... };

としといて、
typedef CColorButton<CChangeCursorWindow> CChangeCursorColorButton;
とかする。

こうして単一継承のチェインを簡単に指定してクラスをでっち上げられる、
template の記述能力の高さはやっぱり言語によらず便利だと思う。
375デフォルトの名無しさん:2001/05/11(金) 06:26
>>374
それだとMix-inクラス同士を組み合わせちゃってるよ。
Mix-inはMix-inクラスとそれ以外のクラスの組み合わせじゃないの?
376デフォルトの名無しさん:2001/05/11(金) 14:31
>>347
>変数の話だよ。なんで「変数の話を持ち出してもしょうがない」のだ?

変数、しかもプリミティブの変数に、mutableもへったくれもないでしょう。
内部構造の要素が1つしかないんだから、
中身の「全部」を書きかえるのと「部分」を書きかえるのとを
区別する意味がない。

>そんなこといったらCFileの値だってimmutableだが?

んな無茶な。CFileなるクラス(かな)の中身は知らぬが。
型とclassが(言語仕様上)同じ意味にはなっていない、
という(だけの)話なんだがな。

>intと普通のクラスの違いはintがfinalであること以外になにがある?

finalはどうでもいいとして、
Object「の中」に構造が有るかどうか?が差じゃないの?
377デフォルトの名無しさん:2001/05/11(金) 14:46
>>365の言ってるのってMix-inと全然違わない?
378デフォルトの名無しさん:2001/05/11(金) 17:08
>>375
こういうやり方だと、mix といっても結局シーケンシャルな継承チェインに
なってしまうので、チェイン可能でかつ継承の順序を指定できるようにどちらも
あらかじめ mix inクラスにしておく、ということだと思うんだけど。

375 のいう純粋mix-inも ATL には良く出てきていて、

template <class T> class foo { ... ((T*)this)->bar(); .. };
template <class T> class hoge { ... ((T*)this)->page(); .. };

みたいなものを使って

class A : public foo<A>, public hoge<A>
{
...
}

なんてのも、超多用されてます。こちらは typedef 一発で
混ぜられないので、decolatorとしてはちょと鬱陶しい。
何かを実装するときには便利。
379デフォルトの名無しさん:2001/05/11(金) 18:09
テンプレートなんか使わなくてもルールを守って多重継承
してればMixinになるが…
380デフォルトの名無しさん:2001/05/11(金) 19:45
多重継承なんか使わなくてもルールを守って単一継承
してれば多重継承の問題は発生しなくなるが…
381デフォルトの名無しさん:2001/05/11(金) 20:49
それじゃ非力じゃん>>379
非力なC++なんかクソの役にもたたん。
と、思う。
382デフォルトの名無しさん:2001/05/12(土) 02:02
>>380-381
ハァ?別にテンプレート使うなとは言ってない。
使わなくてもMixinになると言ってるだけだ。
383デフォルトの名無しさん:2001/05/13(日) 07:03
だから、そんな mixin は非力だろ、って言ってるんじゃん。
C++ は toy language じゃないんだから、非力ながらこれも
できます、なんて話してもしようがないじゃん。

「過剰に豪快な記述能力(だからGCは自作してね)」ってのが
C++では?
384デフォルトの名無しさん:2001/05/13(日) 09:29
つーことはテンプレートの無いC++はカスってことか?>383
385!383:2001/05/13(日) 10:14
>>384
カスだね。でもC言語ほどカスじゃない。

テンプレートが無かったら、JavaやObjectPascalに確実に負ける。
しかしそれでもC言語には楽勝。
386デフォルトの名無しさん:2001/05/13(日) 10:16
>>383
「過剰に豪快な記述能力」つったら、
ふつーlispやschemeとかのことを指すと思うが。
あえてC++を選ぶ理由はCと同様に効率が良いって点だけだよ。
あと知ってる人が多い、とか(w
387デフォルトの名無しさん:2001/05/13(日) 10:21
>>385
じゃあ、最強はgcの無い(Borlandの)ObjectPascalつーことで、
ファイナルアンサー?
388デフォルトの名無しさん:2001/05/13(日) 10:25
最強?
389デフォルトの名無しさん:2001/05/13(日) 10:42
Cをカスっていうのは違うだろ。
アセンブラをカスって言ってるみたい。
両方とも低級ってだけ。
C++と比べるものじゃないだろ。
390!383:2001/05/13(日) 11:00
>>387
最強はテンプレートのあるC++だ。
ObjectPascalなんて兄元にも及ばんな。

>>389
CとC++を比べるのと、
Cとアセンブラを比べるのは、次元が違うよ。
391デフォルトの名無しさん:2001/05/13(日) 12:34
>>386
キリ番(?)おめでと。

>「過剰に豪快な記述能力」つったら、
>ふつーlispやschemeとかのことを指すと思うが。

「なにを」記述するか?が言語によって色々じゃん。
Lispが狙う記述能力とC(++)が狙うソレとは
記述したい対象が結構違う。

Lispはいかに動的構造で何でもかんでも書けるか?に
命かけてる感じで、
かたやC系は御存知のとおり低級部分が主で
構造について言えば静的マンセーな言語。
392デフォルトの名無しさん:2001/05/13(日) 14:06
話の腰を折って悪いんだけど、なんで最近言語関係のスレがたくさん立ってんの?
393デフォルトの名無しさん:2001/05/13(日) 14:47
「おれはカレーが好きだ!」
「いや、おれはラーメンが好きだ!」
っていう議論だよね、コレって・・・。
394デフォルトの名無しさん:2001/05/13(日) 15:44
俺は迷わずカレーだぞ?
395デフォルトの名無しさん:2001/05/13(日) 16:19
札幌だとどっちも旨いぜ。
味噌ラーメンとスープカレーまんせー
いや冗談抜きにお勧め。
396デフォルトの名無しさん:2001/05/13(日) 17:01
違う違う、俺は豚骨ラーメンが好きだ
397デフォルトの名無しさん:2001/05/13(日) 20:51
カレーとラーメンはどちらがオブジェクト指向なのですか?
カレーから福神漬けをとると、ラーメンよりも弱いですか?
398デフォルトの名無しさん:2001/05/13(日) 22:18
カレーはオブジェクト指向です。
カレーライスはカレーを継承しています。
本場インドでは様々な派生がみられます。
ハヤシライスはインターフェイスのみ継承しています。

ラーメンは構造化です。
麺やスープのモジュールを組み合わせてカスタマイズします。
スープのデータフローが店の秘伝です。
麺がゆであがり状態に遷移した瞬間を見極め、
湯切りイベントを発行するタイミングが大切です。
399デフォルトの名無しさん:2001/05/14(月) 00:57
>>383
何が非力なんだ?
別にMixinを実現するのにテンプレート使う必要はないし、
別の部分にテンプレート使えば良い。
どこが強力なのかさっぱりわからんのだが。
400デフォルトの名無しさん:2001/05/14(月) 01:00
>カレーライスはカレーを継承しています

ネタとはいえこれは痛い…
どう見ても継承じゃなく集約だろ、カレーライスは。

まぁ、ライスにするかナンにするか?の部分は、
抽象クラス「主食」を継承するモノならお好み次第
(んーと。ストラテジパターンかな?)
ってことなんだろうから、おかげで我々は
カレーきしめんという一見見慣れない食い物を
すんなり受け入れられるわけだ。CoCoイチまんせー

ラーメンはスパゲティプログラムを更に悪化させたものです。
スレッド(=糸)をスパゲティ以上に複雑怪奇にしてしまったもの。
ちなみにCoCOのカレーきしめんでは汁飛ぶのを防ぐ紙が添付
されていましたが、ロイホの坦々面では紙がありませんでしたので
ロイホはCoCOに負けました。弱いぞロイホ。
401デフォルトの名無しさん:2001/05/14(月) 01:08
>>400
>どう見ても継承じゃなく集約だろ、カレーライスは。

??
カレーとライスならそうかもしれんけど、
カレーとカレーライスなのだから汎化では?
402デフォルトの名無しさん:2001/05/14(月) 01:36
>>399
具体例出さないと話がすれ違いっぱなしだと思うので、template を使わずに Mixin さ
せるコードの概略を示して欲しい。

もしかしたら、私が知らないだけで >>378 に匹敵する上手い方法があるのかも。
403デフォルトの名無しさん:2001/05/14(月) 01:42
>>401
カレーチャーハンみたいにカレーと飯が不可分に
なっていたら汎化かもだけど、カレーライスは
単に並べただけにしか見えないっす。

ん。どっちが親か知らないけど、Compositeパターンかも。
実行時に動的にコンポ(飯)を付け足した感じ。
あるいは飯というDecoratorを付けたとか。
#まぁそう解釈すると汎化に近づいては行くけど…
404デフォルトの名無しさん:2001/05/14(月) 01:45
つまり、結論としてはカレーと言えば
ボンカレーゴールドということでよろしいでしょうか?
405デフォルトの名無しさん:2001/05/14(月) 01:52
>>404
ええ。それを内包したボンカレーパンだと尚ヨシです。

#あれってどれくらいメジャーなんでしょう?>ボンカレーパン
406デフォルトの名無しさん:2001/05/14(月) 02:40
カレーはうんこを継承しています。
407デフォルトの名無しさん:2001/05/14(月) 03:32
>403
カレーライスのカレーとライスは不可分だぞ。
お前はライスだけ見て「カレーライスの片割れだ」と思うか?
408デフォルトの名無しさん:2001/05/14(月) 03:57
>>407
ん?思わないっすよ。
CompositeにせよDecoratorにせよ、
飯の相方はカレークラスじゃなくて
抽象的な具クラスだと見なす感じかな。
かけるのはカレーでも牛丼の具でも
どれでもいいわけよ。
「飯にかける」というInterfaceはコンパチだから。

松屋の「カレギュウ」まんせー(いや、旨いとは思わないけどね…
409デフォルトの名無しさん:2001/05/14(月) 06:42
class カレギュウ:public カレー,牛丼{
};

カレギュウ cg=new カレギュウ;
cg->Hoge();
410デフォルトの名無しさん:2001/05/14(月) 06:43
しまった、
カレギュウ*だった。
Javaと混じった。鬱だ…。
411デフォルトの名無しさん:2001/05/14(月) 08:08
>>399
C++ は flavor や Smalltalk (の多重継承できるやつ) みたいに、
メソッド呼び出しが動的に解決される言語ではないので、本当に単純な
mix in では、mix する対象とか mix するときに同時に mix する相方
(あいかた)とかとのやりとりを行うときに、interface 抽象を行う必要が
あるでしょう?

そうすると、interface は特化しないので、共通の規定クラスがどうちゃら
の問題が出てきて、finalize するとき以外は mix in しない、とかそういう
方向へ逃げる必要がでてくる。と思う。例はちょっとかんべん。
こうすれば、そんなことはなくいろいろできる、というよい反例でもあれば、
出してくれるとうれしい。
412デフォルトの名無しさん:2001/05/14(月) 08:10
C++ってすっごい簡単なような気がするのは僕だけですか?
413デフォルトの名無しさん:2001/05/14(月) 08:18
>>412
心配するな。思い過ごしだ。
414デフォルトの名無しさん:2001/05/14(月) 08:18
ああ、簡単でしょう。
なんかみんな変な機能つかうから難しく見えてしまうのでしょう。
415ドらえもん:2001/05/14(月) 08:31
ではC++がまったく使えない私は逝ってよしですか?
あぁcoutとcinは使えました。
416デフォルトの名無しさん:2001/05/14(月) 08:37
なんでさぁ。
そうやって一つの機能が使える使えないっていう視点でしか見れないの?
すっげぇレベル低いよ。
417デフォルトの名無しさん:2001/05/14(月) 09:54
>>414
そう思います。いつのまにか仮想関数くらいしか使わなく
なりました。多重継承になる場合も、設計を少し変えれば
なんとかなることが多いですし。

あ、テンプレートはたまに使います。複雑になりすぎない
程度ですけど。やっぱりあると便利な場合もありますね。
418デフォルトの名無しさん:2001/05/14(月) 17:30
>>402
>>411
次のようなクラスをMixinクラスとする。
・インスタンスを作らない
・Mixinクラス以外のクラスから継承しない

そして、多重継承するときは非Mixinクラスは一つしか使わない。
これでMixinになるはずだ。
これのどこに不満があるんだ?
419デフォルトの名無しさん:2001/05/14(月) 18:05
ん?
template を使わなくてもできる、ということは自明だし同意するけど。

template を利用しない mix in は非力なので不自然だから、
template を使ったレイを出したんだけど、使わなくても強力で
自然なの、と質問してみたんだけど。

不満や満足について話したいなら、心理板にでも逝け。
420デフォルトの名無しさん:2001/05/14(月) 18:05

口汚くてごめん。
421デフォルトの名無しさん:2001/05/14(月) 18:07
>>419
だから、どこが不満なのかってのは、どこが非力で不自然なんだ?って
意味だよ。
422419:2001/05/16(水) 17:05
僕的には411で書いたことに尽きるんだけど。相互に独立したflavor
同士の mix-in って現実にあまり使わないから。

あえて411に追加するとすれば、flavorどうしの相互作用を実装/定義
するときに、単純な interface 抽象を使うと、interface 毎に利用
者は、その全てのメソッドを実装する必要がある。他のflavorやinner
objectに処理を委譲したり、「実装されていません」なんてエラーを返す
だけの多数のメソッド、とかを。

それはそれで別にかまわない(長くなるだけでできることは一緒)なんだけ
ど、templateという強力な syntax sugar があるのに、それを使わないの
は不自然、というようなこと。
423デフォルトの名無しさん:2001/06/03(日) 05:44
Eiffelの多重継承がC++にほしい
424デフォルトの名無しさん:2001/06/03(日) 11:30
型を確定した関数templateのアドレスをとる方法ってある?
425デフォルトの名無しさん:2001/06/03(日) 18:26
template <class T>
T add(T a, T b) { return a+b; }

namespace tmp {
add(int a, int b);
void a()
{
 void *a = (void*) add;
}
}

こんな感じ?
426425:2001/06/03(日) 18:48
いやこのほうが賢そうか。
template <class T>
T add(T a, T b) { return a+b; }

namespace tmp {
 int add(int a, int b);
};

void a()
{
 void *a = (void*) tmp::add;
}
427デフォルトの名無しさん:2001/06/03(日) 22:24
思いっきりエラーが出るぞ
リリースモードなら最適化でコードがかき消されるから通ったように見えるが
だいたいテンプレートを作った意味が無くなっている
428デフォルトの名無しさん:2001/06/04(月) 13:23
ネームスペースを止めて、ちゃんとインスタンス化構文に
したらOKだった。名前空間汚しまくり。

template <class T>
T add(T a, T b) { return a+b; }

template int add(int, int);

void a()
{
int (*a)(int, int) = add;
}

>>だいたいテンプレートを作った意味が無くなっている
何がいいたいの?templateのまま(インスタンス化しないで)
関数アドレス取れると思ってるなら中学からやり直したほうが良いよ。

424もちゃんと「型を確定した」って行ってる。
429デフォルトの名無しさん:2001/06/05(火) 17:36
>>428
template int add(int, int);
この行無くても動かない?
430デフォルトの名無しさん:2001/06/07(木) 14:56
IBMのICLUIとかのネタが出てないのはみんな知らないの?
VisualAgeC++とかでも使われてるはずなんだけど。

あのクラスライブラリはコテコテでかなりカッコイイ。
エラーはすべて例外で処理されてるし。
ほとんどのメソッドの戻り値がオブジェクトへの参照ってのがイカす。
431デフォルトの名無しさん:2001/07/14(土) 01:04
現実の事象を中心にとらえ過ぎるのはいかがなものか?
継承は手段としてはすごいと思うが
それをそのまま採用するのは敷居を高めているような気がする。
人間らしさとコンピュータらしさの双方を兼ね備える言語&方法論出てこないものか?
432デフォルトの名無しさん:2001/07/14(土) 02:21
>>431
時代に追いつけないなんちゃってソフトウェア技術者みたいなこと言うなヨ
433デフォルトの名無しさん:2001/07/14(土) 04:29
こういうスレができる事自体、C++の使いづらさを物語ってるな。
434デフォルトの名無しさん:2001/07/14(土) 04:45
アニメの世界に目を向けてみよう。
アニメの世界は幼稚な絵からどんどん細かくなり
しまいには飛行機の絵にネジを書くまでに至った。(マクロスとか)
これがC++だ。
しかし最近のアニメはだんだん絵がシンプルになり
絵の書き込みよりスムーズな動作に比重が移った。
これがJAVAだ。
しかしJAVAはまだ過渡期の言語だ。
C++からJAVAに移行した程度の流れがもう1度あるだろう。

さぁ皆ツッコメ。
435デフォルトの名無しさん:2001/07/14(土) 07:23
>>434
あるんじゃない、でも C 言語の進化系としては嬉しくない。
C は、その驚くべきシンプル(当時)さと、機械語レベルに最も近い構造をもちながら、究極のソフトウエア開発論法(当時)その進化系としての C++ を考えるならば java は違うと感じる。
何かが違う、低級言語 C 進化系として java は認めたくない。 java はやはり高級言語だ。
さりとて C++ には満足できないが・・・
436デフォルトの名無しさん:2001/07/14(土) 10:54
>>431
人間らしさなんてものを、厳密さがメリットである計算機に
期待するところはアホクサイと思うが、
継承どうよ?という意味では色々考えることはあるな。

こんなの発見。「継承じゃなく修飾」だそうだ。
言ってること全部が正しいとは言えまいが、
一部は参考になると思われ。
http://www.yy.cs.keio.ac.jp/~suzuki/docs/mct/modification01.html
437デフォルトの名無しさん:2001/07/14(土) 11:01
>>435
ObjectiveCなんかはどう思う?

構文は(C++に比べれば)恐ろしくシンプルだ。
なぜシンプルに出来たかというと多分
動的な部分が多いから静的な言語仕様を
肥大させずに済んだんだろう。

メソッドの本体はCそのものと大差無い書き方が出来る
(当然コンパイル結果のバイナリも推して知るべし)が、
一方でメソッドディスパッチ(仮想関数の呼び出し)処理が
ruby/smalltalk並の動的処理。

高級アセンブラ度という意味では、
メソッド本体は満たしているが
メソッドディスパッチはそうではない、という感じ。

ただ、C++だってvirtualが(設計上)必要になれば
どうせ内部的に同じような仕掛けにならざるを得ないから、
おんなじようなもんだ。

結局C++の言語仕様って、骨折り損のくたびれ設けにしか見えぬ。
438デフォルトの名無しさん:2001/07/14(土) 14:04
みんな例のジョークは知ってるよね?
あれはジョークにしたって所がジョークなんだよ。
439デフォルトの名無しさん:2001/07/14(土) 14:32
最近まわりがJavaばっかなんで自分もJavaってみたり。
やっぱ Java って C -> C++ -> Java っていう感じで「進化型」なんですかね。
C# は使ったことないんでわからないけど。
GCC の C# フロントエンドがあればなぁ。一度使ってみたい。
440オタクの卵:2001/07/14(土) 14:56
C++とオブジェクティブCではどっちがお勧めですか?
わかる人はいろいろな点で比較して教えてください。
441デフォルトの名無しさん:2001/07/14(土) 15:34
ヲタなら自分で使ってみな。
442デフォルトの名無しさん:2001/07/14(土) 16:07
いや、自分で試そうとせず外野から好き勝手言ってこそヲタ
443デフォルトの名無しさん:2001/07/14(土) 16:16
そか なるほど 間違ってたわオレ>>442
でも440はお勧め教えてクレとかイってるぞ

ちなみに俺はオブジェクティブCが超オススメです >>440
なぜっておれわ使ったこと無いから
444デフォルトの名無しさん:2001/07/14(土) 16:56
>>440
漏れのオススメはC++です。
理由は初心者が苦しんでくれるからです。
さらにオススメなのは、MASMです。頑張ってください。
445デフォルトの名無しさん:2001/07/14(土) 17:10
ある村に魔法使いの女の子がやってきました。
魔法使いの女の子は村人が魔法を使えないので驚いてしまいました。
魔法使いの女の子の国では魔法なんて当り前です。

それで魔法使いの女の子は村人に魔法を教えてあげることにしました。

「ほら、こうやるんだよー」
魔法使いの女の子がお皿に手をかざすと
そこに美味しそうなケーキが現れました。

それを見た何人かの村人は魔法を使えるようになりました。
魔法を使えるようになった村人は家に帰って家族に魔法の
使い方を教えます。

こうやって魔法が使える人はどんどん増えていきましたが
どんなに頑張っても魔法の使えない人もいます。
魔法の使えない村人の前で何度実演してみせても
どうしても魔法が使えないのです。

そんなC++が大好きです。
446デフォルトの名無しさん:2001/07/14(土) 17:53
プログラミング未経験の新人に「やり方教えて手伝ってもらえ」と言う上司と
「やる気はあるんでどんどん仕事回してください」という幸せな新人。
蓋を空けてみればC++おろか
コンピュータに一度も触ったことがない珍人だった。
447デフォルトの名無しさん:2001/07/14(土) 17:54
ふつうじゃん
448デフォルトの名無しさん:2001/07/14(土) 17:56
普通....なのか?
449G13(ゴルゴダの丘):2001/07/14(土) 18:42
同じオブジェクト指向言語で同じC系列言語
オブジェクティブCとC++
どっちが簡単なんですか?同じオブジェクト指向でも
その内容はけっこう違うのですか?
450デフォルトの名無しさん:2001/07/14(土) 18:51
オブジェクト指向と言語は関係ありません。
私はCプログラマですが私の書くプログラムはオブジェクト指向です。
指向とは考え方でありプログラムとは関係が無いということです。
451デフォルトの名無しさん:2001/07/14(土) 18:53
>>445
ナルホド!!
452名無しさん:2001/07/14(土) 19:00
>>450
青果物に対してのオブジェクト指向が出来てません。
453G13(ゴルゴダの丘):2001/07/14(土) 19:01
>>450
そうですか、わかりました。
ところで>>449の質問に答えてくれる人はいませんか?
454デフォルトの名無しさん:2001/07/14(土) 19:03
>>445
その話泣けるね。
なぜ使える人と、使えない人が出来てしまうんだろうね。
455名無しさん:2001/07/14(土) 19:19
Javaはだれにでもできる。
C++はだれにでも出来るわけじゃない。

おれは誰にでも出来る言語の方がいいな。
456デフォルトの名無しさん:2001/07/14(土) 19:31
>>453
>>449の回答が>>450だ。
意味がわからないならかじめ焼いて寝ろ。
457デフォルトの名無しさん:2001/07/14(土) 19:45
JAVAは誰にでも使えます。
しかし常に最良のプログラムを書くためには
JAVAの動作を正しく理解する必要があります。
C++は正しく理解しなければ使えないでしょう。

C++を理解した人はJAVAの動作を正しく理解することが出来るでしょう。
しかしJAVAから学んだ人はインスタンスや参照を正しく理解できるのでしょうか?

アスカは「ATフィールドの意味が判った」と言いました。
使える事と理解することは別なのです。
より正しく理解する。
それが上級者への一歩なのです。

そういった意味ではC++は素晴らしい言語でしょう。
全てを理解した人には関係無いですが
初心者にとってどちらが良いかはその人が
何を望むかによって決定されるでしょう。
458デフォルトの名無しさん:2001/07/14(土) 20:12
>>445=>>457?

あなたオモロイな、微妙に
459デフォルトの名無しさん:2001/07/14(土) 20:42
>>457
アスカは最終話付近で廃人になりましたが、その辺りの関連性は?
460デフォルトの名無しさん:2001/07/14(土) 22:02
一部(1人?)のレスにより良レスへ変身中。
461デフォルトの名無しさん:2001/07/14(土) 22:16
>>458
全てを理解したからといって過信は禁物です。
時に膨大なマンパワーを投入しなければならない懸案もあるでしょう。
初心→理解→自信→過信。
彼女は典型的な秀才プログラマの失敗例です。
人のフリ見て我フリ直せとは正にこの事でしょう。
462デフォルトの名無しさん:2001/07/15(日) 03:56
>しかしJAVAから学んだ人はインスタンスや参照を正しく理解できるのでしょうか?

C++の問題は、
「だったら、C++から学んだら、インスタンスや参照を
(必ず)正しく理解できるのか?」
というと、全然そんなこたーねぇ、という点だな。

Javaとの比較でいえば、むしろ理解しやすさが弱い…
というか正確にいえば「誤解しやすさが強い」と
言うべきだろう、C++は。

それが証拠に、未だに未だに、Instance変数を
Class変数と呼ぶ馬鹿が、C++界隈には何故か絶えない(わら

Javaより10年も前に骨格が出来ちゃった、
時代遅れ言語だと思うぞ、あれは。

そして、これが一番痛いのだが、それゆえに
「古い教育方法」という過去の資産が多数存在する。
資産といえば聞こえがいいが実際は間違いが多くて
かえってOOP教育を阻害したりする。死産。

ちなむと、参照の理解に一番良いと言えそうな
手近なメジャー(?)言語といえば、今ならrubyだろう。
463デフォルトの名無しさん:2001/07/15(日) 05:08
>>462
ruby信者逝ってよし!
ちなみにオブジェクティブCとC++の違いをだれか教えてください。
464デフォルトの名無しさん:2001/07/15(日) 05:16
MSがボーランドを買収して全部Delphiにすればいい。
465エログラマ:2001/07/15(日) 05:22
>>464
それじゃ逆に全部VBになりそうね。
466デフォルトの名無しさん:2001/07/15(日) 08:57
ObjectiveC はC言語にsmalltalkを取ってつけた言語。
C++はC言語のstructをclassとして扱えるように拡張してみた言語。
どちらも急造品であることに違いは無いね。
でもObjectiveCは本流から取り残されていて、標準規格すらないよ。

JavaでもC++でもいいけど、オブジェクト指向を取り入れていかないといけない。
C++はスキルさえあれば、しっかりとオブジェクト指向した上で安全なコードを書ける。
C言語でもオブジェクト指向できるけど、スキルがあっても危険なコードしかかけない。
Javaは誰でも安全なコードを書けるけど、しっかりとオブジェクト指向するには結局スキルが必要。
スキルがある人にとっては、JavaもC++も変わらない。むしろC++のほうが、
ジェネリックプログラミングできるし、実行速度も速くて都合がいい。
467デフォルトの名無しさん:2001/07/15(日) 10:22
こんなところで議論交わしたところでC++好きはC++好きのままだし、C++嫌いはC++嫌いのまま。
ただお互いが自分の意見を主張しあっているだけで何の意味も成していない。時間の無駄。
468デフォルトの名無しさん:2001/07/15(日) 10:34
C++が難しいとは思えないが・・・
個人的にはJavaが好きだな。
>>467
んなこと言ってたら2ちゃんの存在価値は無いと思われ・・・
469デフォルトの名無しさん:2001/07/15(日) 10:46
>>>466
>実行速度も速くて都合がいい。

速いというほど速いのかC++?
そりゃネイティブなんだから少しは速くないと
やってられんけど、逆にいえばimodeなんて糞にまで
Javaが載せられるのは何故だ?という話になる。

JVMを「終了しない」ことが必要なんだろうな。
アプリ(??)を終了するごとにJVMごと終了するってのは
ネイティブアプリで喩えれば、アプリ終了ごとに
OSをシャットダウンしてる(次のアプリを起動するごとに
OSを再起動する)ってのと同じだ。
これじゃ遅くて当然だし、そんなレスポンスの比較の仕方じゃ
不公平すぎて話にならん。

つーわけで、上げっぱなしのVMの上で
(例えばデスクトップなら)shellみたいなものを動かして、
そこから.classをloadするようにでもすべき、だろうな。
これでやっと互角の比較が出来る。
470デフォルトの名無しさん:2001/07/15(日) 10:50
C++は、難しいとかどうとかいうよりも、煩雑だ。

3個の概念があれば出来そうな仕事に
10個の概念を投入して、それら10個を
結局全部理解してないとまともなプログラムを書けない。

そりゃ頭がまともでパズル好きな人間には
10個を間違いなく理解することは可能だ。
だが、面倒、だ。

たとえば、初期化と代入の違いを、意識しすぎてる。
そんなもん代入一本槍でも十分だろうに。
パフォーマンス上の都合が悪いなら
最適化で頑張りやがれ。

あーいうのを自意識過剰っていうんだろう。
10個も機能があって、ボクはなんて世間に貢献してるんだ!などと
ドキュな妄想に浸ってる。3個で十分なんだよ。引退しろロートル。
471デフォルトの名無しさん:2001/07/15(日) 11:04
今は亡きNeXTSTEPでObjectiveCやってたけど、かなりいい感じだった。
Java並に簡単だと思われ。
C++はなんであんなにでかくなっちゃったんだろう・・・そんな俺はC++使い
472デフォルトの名無しさん:2001/07/15(日) 12:24
今は無きPC9821でN88BASICやってたけど、かなりいい感じだった。
HSP並に簡単だったと思われ。
VBは何であんなに重くなっちゃったんだろう・・・
そんな漏れはVC++。
473デフォルトの名無しさん:2001/07/15(日) 13:27
このスレ馬鹿ばっかし
474デフォルトの名無しさん:2001/07/15(日) 13:36
>>473
そうでも書かないと、自尊心が維持できないキチガイ(藁
475デフォルトの名無しさん:2001/07/15(日) 13:49
>>469
この種の比較は納得できない。
C言語は元々ハードウェアを直接叩くような用途も考慮に入れた仕様の代物だ。
JAVAはあくまでも高級言語だ、もうすでにCの後継でもなければC++の後継でもない。
C++は腐っても、Cの後継言語であってJAVAとは違う。
C言語系のコンパイラは危険なコードはかけて当然の構造を持っていなければならない。
機種依存はしようと思えばすぐにできるし、したくなければしなくても良いようになっているのが正しい姿だ。
C言語には高度な言語機構というポリシーとともにもう一つ、自己責任原則の元何をしても良いという重要なポリシーがある。
C言語の後継言語である、C++にも当然、自己責任で何でもできること、これができないC++に意味はない。
極端な話privateメンバであっても、属性キャストなりでアクセスできて良いと思っているくらいだ。
JAVAなんぞは、C++で作られたVMの上にでも乗ってれば良いのである。
476デフォルトの名無しさん:2001/07/15(日) 14:04
>>475
俺もC++派だし、キミのいうことは最もだと思うけど、
Javaを卑下する必要は無いでしょう。
独自ハード用のコードや、ゲーム機、ドライバなんかを書きたければC++。
アプリを作りたかったらJavaというふうに、住み分けすればいいのでは。
住み分けというより、Javaを使えないような環境でオブジェクト指向しようと思ったら
C++しか選択の余地が無いんだけどね。
477デフォルトの名無しさん:2001/07/15(日) 14:42
>>475
>C++は腐っても、Cの後継言語であってJAVAとは違う。

ああ。C++とJavaの血縁なんていう妄想は、俺も信じちゃいない。
たまたま文法の似た言語なんて、作ろうと思えば
(実際Javaはわざとそうしたんだろうし)幾らでも作れる、というだけ。

でなのだが、ならばJavaじゃ駄目な場合には
選択肢はC++しかないのか?ってのを考えないとね。

それこそObjectiveCとかでもいいんじゃないか?という話。
自己責任つー意味では、しょせんC派生言語だから
同じ問題はたとえ嫌でもついて回るし、
まして積極的にやりたければ以下略だ。

>極端な話privateメンバであっても、属性キャストなりでアクセスできて良いと思っているくらいだ。

てゆーか、そこまでやりたいなら「OOP言語」を使わないほうがいいよ。
構造体をどうぞ。
478デフォルトの名無しさん:2001/07/15(日) 15:16
>JAVAなんぞは、C++で作られたVMの上にでも乗ってれば良いのである。
お〜ま〜え〜な〜、そういう余計なことは書かんでもえ〜の。

>>極端な話privateメンバであっても、属性キャストなりでアクセスできて良いと思っているくらいだ。

>てゆーか、そこまでやりたいなら「OOP言語」を使わないほうがいいよ。
これは、たまに欲しくなるんですがどう思います。
例えば、デバッグ中でちょいと、とある非公開メンバ関数の反応確かめてみようと
する時、いちいちヘッダファイルまでいって public にしたりとか、めんどくさいです。
最後に残骸が残ってないかワーニング出せるオプション付きで。
479デフォルトの名無しさん:2001/07/15(日) 15:20
Objective-Cはもう時代遅れの感が否めない。使われてるのMac関係だけだし。
480デフォルトの名無しさん:2001/07/15(日) 17:27
>>465
なんでDelphiがVBになるのよ。
DelphiをVBなんかと同列に・・・、いや止めとこ。またこじれる。
481デフォルトの名無しさん:2001/07/15(日) 21:27
C++は言われているほど難しくは無い。
でもVC++でWindowsのプログラムを作るのが難しいから、
難しいと言う印象だけが先走っている気がするんだよね。
482デフォルトの名無しさん:2001/07/16(月) 00:22
>>481
「言われてる」ってのがそもそもどの程度なのか?によるよな。

少なくともC++以外のフツーのまとも(わら)な多数のOOP言語を
見たあとでC++を見ると、結構おなかいっぱい、いや、ゲリするね。
ゲリってのは、「食い物じゃないもの」まで混じっているから。
つまり、OOPと、OOPと馴染まない(わら)他の色んな機能と、が
渾然一体となってるんだもん。

ところで、「super」に相当するキーワードが存在しないのは
あまりにも痛くないかC++?
親クラスのメンバを参照したいときにクラス名を
ベタ書きしないとならんだろ。匿名性(?)が無い。

ベタ書きは多重継承があるから「しかたない」という声は有ろうが、
だからって許されることと許されないことが有るぞ。
あるいはtempleteで誤魔化す(元々存在しない匿名性を
templeteで擬似的にやる)ことができるぞという意見もあろうが、
誤魔化しが必要な時点で既に腐っているだけだし。

なんで匿名親クラス参照キーワード(?)のsuper(のようなもの)を
なにがなんでも実装しよう!と心血注がなかったかな作者は?
力のかける方向が変なんだよ、C++は。

>>479
憎まれっ子世に云々って感じだぞ、少なくともC++について言えば。
C++なんて屋上屋を架してるんで、上が新しい(優れてるのと同義とは
限らず、付け焼刃という単語も存在するが)ようでも、
下の地層には古生代の化石が埋まってるぞ。

逆にSmalltalkみたいに、最初からWellDesignedな言語は
時間が経ったからってそうそう多くの仕様を追加する必要に迫られない。
483482:2001/07/16(月) 00:28
すまん。482の補完。

最初の部分。別にOOPにあらずんばヒトにあらずと
言いたいわけじゃない。別にそうでなくてもいい。
ただ少なくとも、OOP言語だと大々的に名乗りながら
初心者(わら)に近づくのだけは、やめてくれ。
結構あれでOOPドキュな困った初心者を作ってしまうんで。

化石(わら)の話。
C++みたいなアーキテクチャの言語…つまり
C++を真似た(C++の直系の子孫は除く)言語って、
聞いたことないんだよな。

真似されてないってのは、それだけ、
使えない、あえていえば古い、アーキテクチャ
なんだと思うぞ。

アーキテクチャでいえば、むしろsmalltalk系とかのほうが元気だろ。
484デフォルトの名無しさん:2001/07/16(月) 00:29
>>482
superが必要になる場合ってどんなとき?
静的リンクが前提なら不要なのでは?
例えばGoFパターンの中でそれが必要なのはどれ?
templeteで誤魔化しといわれても、そんな誤魔化しは
したことないから、不必要な批判をしているように見える。
もっと素直に実装できない?
485デフォルトの名無しさん:2001/07/16(月) 00:55
>>484
>superが必要になる場合ってどんなとき?

ちょっと呆然とした。
なんでこんな質問をするんだろうこのヒトは?という意味で。

「必要」を言われたら、言語なんてアセンブラでいいぞ、という
恒例の話になるだけだ。
つまり、「いちいちsuperclassの名前をコピペするのって、
うざくないか?(反語)」と俺は言いたい*だけ*なのだが、
まぢでうざいと思ったことがないのか?

>例えばGoFパターンの中でそれが必要なのはどれ?

有るわけないだろ。「そんなC++ですら」記述できるように
最初からチューニングされてるんだからさ、GoFパターンは(笑)

>もっと素直に実装できない?

なんでそこで実装という一番卑近な部分しか思考できんかなあ?
以下、アセンブラ問答は、略。

なんてことはないよ。superclass名なんて
1つのクラスにまつわるソースを書く間に
たった一度書けば十分だと思わないのか、ということだよ?

ちなみに、コンストラクタ(とデストラクタ)がクラス名と同名だ、
という風変わりな考え方は、キャストとコンストラクトを
同一視しようという、C++のぶっ飛んだ(誉めてない)考え方を
反映しているという意味ではパズル的に面白いが、
実利的には却ってうざいだけだな。
コンストラクタ名をある一定の名(やその類似)にする
というほかの多くの言語が採った道のほうが、ずっと楽。
というわけで、最低3回(わら)書くのを1回に減らす方法がコレだ。

あと、ヘッダーにメソッド実装を書かないならば
メソッド実装の頭にクラス名がそれぞれ必要だという奴は、
C流の古典的なソース管理方法を流用した付け
(Javaで克服されてる)に過ぎないんで、
言うもあほくさいんで、さておく。

で、次にsuperclassの名を思い出す作業がしばしば必要になるわけだ。
これはデバッグのときにpublicとかどうとか直すのと
匹敵する手間だと思う(わら
ヘッダーをあっちこっち飛びまわらないとならんから。
486デフォルトの名無しさん:2001/07/16(月) 01:02
>>484
すまん。くどくど長すぎた。
一言で終わる説明を今ヤット思いついたよ。

両親を「おやじ、おふくろ」と呼ぶ必要があるときってどんなとき?
…などと君は問うのか?

毎度毎度本名で呼ぶのか?メリット有るのか?
自分の両親は自分(プログラマじゃなくてそのclass)が
知っている(のでいちいちプログラマが教えなくて済む)
というものじゃないのか?

まぁそういう文化圏でも悪くないとは言えなくはないが、
さすがに迷子のアナウンスでは困るよな。
「みずほ保育園の3歳の高橋よしのり君のお父さん、よしのり君が迷子に
なっております」というアナウンスを出来ないことになるからな(わら


あと、リンク形態は全然関係無い概念だ。
なにも本当に親クラスが実行時まで未知な場合を
サポートしろっていう話を、しているわけじゃない。
#それはそれで欲しい機能だが話は別。つーかC++じゃ絶対無理だろ。
#ん?保育園の喩えは、どっちかってーとそれになっているか。まぁいいや。
487デフォルトの名無しさん:2001/07/16(月) 01:05
>>482
お前みたいなキチガイがいると話こじれるんじゃ氏ね
オレもなー(鬱
488デフォルトの名無しさん:2001/07/16(月) 01:12
>>485
おいおい、呆然とさせられるのはこっちのほうだよ。
アセンブラでいいという話に結び付けないでくれよ。
C++でオブジェクトをconstにできるのは、
オブジェクトを不用意に書き換えまいとする必要性があるだろう?
そういうレベルで話をしようよ。

「superが無いのはあまりにも痛い」とまで言うのだから、
必要性について聞くのは当然だと思うがどうか?
485を読む限り、あまりにも痛いというには無理があると思う。
489デフォルトの名無しさん:2001/07/16(月) 01:16
>>488
だからー、煽りにのんなよ。
490デフォルトの名無しさん:2001/07/16(月) 02:05
superはparentじゃないだろう。

日本人−人間−脊椎動物と継承しておいて、
よしのりくんと、そのお父さんはどちらも日本人で、
親子関係はCompositeパターンあたりで人間のツリーを構築して、
よしのりくんのお父さんを知りたいときはよしのりくんに対して
GetParentするというのが、今時のオブジェクト指向だよ。

さて、よしのりくん自身が、「自分の人種を自問自答する」
ことはあるのか? そういうケースもあるかもしれないけど、
言語として専用のキーワードを割くだけの価値があるとは思えないな。

C++は常に悪いイメージを持たされているから、
こういうレベルの低い奴も批判的な意見を言い出し、
それがさらにC++のイメージを悪くして、
ネガティブスパイラルに陥っていると思う。
491デフォルトの名無しさん:2001/07/16(月) 09:12
>>470
初期化はスタティックローカル変数に必要だよ。
じゃないと、呼び出す毎に代入されてしまう。
492デフォルトの名無しさん:2001/07/16(月) 10:52
493デフォルトの名無しさん:2001/07/16(月) 10:55
個人的には、MFCにマンセー。
動きはトロいし、バグはおおいし、EXEバカでかいし。
でもさ、サクっと一見機能満載のかっこいいアプリ作れるから、
上司ウケ最高。
おいらとしては、OOもC++もクソだけど、MFCマンセーです。
494デフォルトの名無しさん:2001/07/16(月) 11:20
ただひたすらC++を叩くだけの人にろくな奴がいない事実
495デフォルトの名無しさん:2001/07/16(月) 13:10
>>490
>superはparentじゃないだろう。
>よしのりくんのお父さんを知りたいときはよしのりくんに対して

おいおい。継承関係の「親子」と、人間関係の「親子」を混同するなよ。
たとえ話として親子という言い回しをしただけなのだが。
実際の親子関係の話じゃねーよ。
「関連」にはいろんな種類の関連があることくらい、知ってるだろ?
人間親子も(Instanceの)関連だし、継承親子も(Classの:もっともC++じゃ
ClassはFirstClassObjectじゃないんで、あくまで概念上の話だが)関連だ。

>さて、よしのりくん自身が、「自分の人種を自問自答する」
>ことはあるのか? そういうケースもあるかもしれないけど、
>言語として専用のキーワードを割くだけの価値があるとは思えないな。

1:自問自答(Java風にいえばIntrospection)を不当に低く評価したがるのは
まさかC++人間の性癖なのか?それとも単に君がドキュなだけか?

というかC++だってIntrospectionが最近は有るだろ?
InstanceのClassを知る手段とかが有るじゃんか?

2:superというキーワードは正確にいえばIntrospectionではなく
せいぜいそのサブセットだ。単に親クラス名を匿名化する
というだけのキーワードだ。
自分のクラスの親クラスが何なのかをいったん問い合わせてから
そのクラスへメソッドを投げる、などという二段構えの文法には
ふつーの言語はなっていなくて、単に「thisの代わりにsuperを書く」
ことが出来るようになっているだけだ。

this.hogehoge(); //thisのhogehogeメソッドが呼ばれる
super.hogehoge(); //thisのクラスの親クラスのhogehogeメソッドが呼ばれる

それをいちいち、「ええと、thisのクラスはJapaneseであり
そのsuperclassはHumanだから…」と人間さまが考えて

Human::hogehoge();

とか書くことに、なんの幸せがあるんだ?
Japaneseクラスの親クラスはHumanであることは
既にコンパイラが知ってるというのに?

#多重継承で区別が必要というなら、多重継承してないときくらい
#superで楽させて欲しいと思う。
496デフォルトの名無しさん:2001/07/16(月) 13:26
>>488
>そういうレベルで話をしようよ。

ああ。すまんすまん。それはそのとおりだ。

ただ、ifやforや関数が無くてgotoしか無い言語を使って
今時満足してる人に、「ifなんて必要なのか?」
と問われたときと、同じ衝撃を感じてしまったのだ、と
感想を説明しとくよ。

ちなみになんで汗なんてことを言い出したかというと、

>もっと素直に実装できない?

素直という単語に笑ってしまったからだ。
もしかして、「具体的に」書くことが「素直な」書き方だ、
などと思っていないよな?
もし思っていたら、それは汗云々な思考だ。
計算機言語の言語は抽象化(=不要な具体的記述を捨てる)して
便利にしていくという歴史だろ。

さて。汗の話はこれで済ます。すまん。
本題に戻ろう。
497デフォルトの名無しさん:2001/07/16(月) 13:28
>>488
さて。

じゃあ問うが、javaにもsmalltalkにもrubyにも(わら) superはある
(蛇足だが単語と文法は違うがdelにも有る。inheritedという単語だ)のだが、
それらの言語におけるsuperの必要性と同様の考え方が
C++になんら影響をもたらさないと
あなたが考える(だよな?)論拠を、教えてくれないか?

「super」じゃなくてsuperclass名をいちいち書けなんて言われたら
上記言語のユーザーは火噴くぜ。
なぜかって?楽じゃないからだ。

ついでにもう少し直撃な話。

superと書けば、なにをどう呼べばいいのかの判断を
単に文法の問題として片付ければ済むのだが、
具体的にsuperclass名を書かないとならないとなると、
そこに書かれたclass名が妥当なのかどうか?を考えるという、
意味論の世界に足突っ込んじまうわけだ。

形式文法の範囲内でsuperclassのメソッドも呼べない言語だ、ということ。
他の多くの言語では出来ているにも関わらず、だ。

これでも痛くないのか?

蛇足だがdelのinheritedはさらに凄くて、
呼び元のメソッド名すらプログラマが考えずに済む。

procedure Japanese.hogehoge;
begin
inherited;
end;

と書くと、キーワードinheritedを引数なしで呼ぶことにより
同名のメソッドをsuperclassから探してきて
(といってもC++と同様にVMT方式なので、ディスパッチ処理が遅いわけじゃない)
それを呼ぶ、というところまでやってくれる。
何をどう呼ぶべきかを、文法レベルで確定することが出来るわけな。

これを便利じゃないとでも思うか?
498デフォルトの名無しさん:2001/07/16(月) 13:30
アホか。
基底クラス名が複数回出現するときの常套手段。
class A : public B {
typedef B super;
...
};
またクラス名を書く回数が増えたって?
一回くらい増えたからってどうってことないだろ、いまさら。
499デフォルトの名無しさん:2001/07/16(月) 14:08
多重継承や菱形継承を許しているC++ではsuperみたいなキーワードを
言語仕様で面倒見るわけにいかないもんな。
500デフォルトの名無しさん:2001/07/16(月) 14:31
以上ですね(ワラ
501デフォルトの名無しさん:2001/07/16(月) 14:46
多重継承など親クラスが明確でない場合のときだけ
superキーワード使用不可にすれば良い。

だからsuperキーワード必要無しの理由にはならない。
実際に多重継承と単一継承では使用する頻度は単一継承の方が多いんだし。
502デフォルトの名無しさん:2001/07/16(月) 15:23
>>501
阿呆?

class A {
hoge();
}
class B : public A {
hoge();
}
class C : public A {
hoge();
}
class D : public B, C {
...
}
class E : public D {
...
}

それぞれのクラスでsuper::hoge()がどうなるか静的に管理しろってか。
503デフォルトの名無しさん:2001/07/16(月) 17:40
>それぞれのクラスでsuper::hoge()がどうなるか静的に管理しろってか。

それこそ楽勝だろう?
それを言うならメンバ変数/関数の名前だって
コンパイラは頑張って(わら)どのクラスの奴か
解釈(=静的に管理:virtualも実装はさておきInterfaceは
コンパイラが静的に管理)してるわけだろう。
それとどう違うんだ?

親クラスが複数になってるクラスではコンパイルエラーにし、
そうでなければ一意に確定。
なんの問題がある?どんだけの手間がかかる?

実際、typedefという超簡単な手段で、
手作りで(わら)同じことが実現できてるわけじゃん?
言語仕様に入れるのは、実装の手間があとちょっと有るだけだぞ?
しかも無矛盾性も( >>498がまさにやってくれているが、
typedefで似たようなことが実現できることから判るように)証明済みだ。

そういや、ifやforすら言語仕様じゃなくライブラリで提供する
というおっかない言語も存在するよな。
でもだからって大抵の人(わら)は、ifが言語仕様じゃなくても
イイヤとは、あまり言わないだろう?そういう次元の話よ。

ところで今気づいたが、
>super::hoge()
って、superという単語でclassを指すもんだと思っているのか?
ふつーはinstanceを指すもんだよ。
#dynamic_castかなんかを使ったらsuper.hoge();とかを書けるようになるのかな?
504デフォルトの名無しさん:2001/07/16(月) 17:48
>>499
>多重継承や菱形継承を許しているC++ではsuperみたいなキーワードを
>言語仕様で面倒見るわけにいかないもんな。

ところで質問なんだが、
菱形継承のときの心配を改めてする必要が、あるのか?
多重継承についてだけ心配すれば十分なんじゃないのか?

菱形継承のとき、どのclassを経由して継承したか?というのを
いちいち記述しないとならないor記述することができる
のだったっけC++って?
そんな機能は無かったと思うが?

さもないと、祖父母の代を考慮する(菱形ってことは
結局そういうことになるよな)なんてのは無意味だと思われ。
505デフォルトの名無しさん:2001/07/16(月) 17:55
すげえな・・・モノホンか。
夏だなぁ。
506デフォルトの名無しさん:2001/07/16(月) 18:05
ガムテープの接着麺同士を張り合わせた状態です。
507デフォルトの名無しさん:2001/07/16(月) 18:08
str.replace('麺', '面');
508デフォルトの名無しさん:2001/07/16(月) 18:42
>>503
言い方は気分悪いが、内容は同感。
superがないと継承関係の結びつきが強くなりすぎる。
509デフォルトの名無しさん:2001/07/16(月) 20:29
503は別に当たり前のこと言ってるだけだし、一方の typedef 派も
typedef で別に何も困らないから至極まっとうな主張だと思う。
でも、

>>super::hoge()
>って、superという単語でclassを指すもんだと思っているのか?
>ふつーはinstanceを指すもんだよ。

C++ の文法ならふつー super::hoge() って方向で記述することに
なると思うけど。1から10までSmalltalk の話がしたいんなら、
Smalltalk スレでも立てれば、って気がしないでもない。
510デフォルトの名無しさん:2001/07/16(月) 21:23
たぶん何を言ってもわからないのだろうけれど、
C++はsuperというキーワードを実装できなかったのではなく、排除したんだよ。
そこを履き違えないように。

ANSI規格化のときに、多くの議論が交わされ、多くのキーワードが提案された。
ISO/ANSIで規格化するということは、どこかの企業や個人が身勝手に決めたのではないと言うこと。
それまでに多くの激しい議論が交わされ、大変な時間がかかっている。
結果として、super、inherit、baseというキーワードは排除された。
その是非はともかく、少なくとも何らかの意図があって決められているのであり、
誰かが付け忘れたとか、実装できなかったとかいう話ではないだよ。
511デフォルトの名無しさん:2001/07/16(月) 21:57
C++にsuperが無い場合
「基底クラスを指定するのにクラス名を書かないといけないなんてダサイ」

C++にsuperがある場合
「多重継承するとsuperが使えなくなるなんてダサイ。統一感が無い。C++ってやっぱり複雑。」
512デフォルトの名無しさん:2001/07/17(火) 00:26
>>509
>C++ の文法ならふつー super::hoge() って方向で記述することに
>なると思うけど。1から10までSmalltalk の話がしたいんなら、

おいおい。だから、そんなC++「が」ふつーじゃない、
という話なんだってば。他の言語見まわしてみろよ。
superという単語をそういう意味で使わないことで
ナニを得するか?というと、単にC++内輪の互換性だけ、だ。

単に今、他と同じような意味のキーワードsuperが存在しない、
というだけのことだろ。
新しい(それなりにおかしくない)文法を「考える」脳が君には無いのか?
#採用しろとまで言うのは遥か先の段階だが。

>少なくとも何らかの意図があって決められているのであり、
>誰かが付け忘れたとか、実装できなかったとかいう話ではないだよ。

だれもつけ「忘れた」なんて言ってないよ。
その意図が変だ、と言ってるの。

規格は神様か?そりゃ今存在するその言語を「使う」時には
絶対尊重せんとならんが、そもそもその規格どうよ?という話
をしているときに、「でも規格ですから」じゃ話になるまいよ。

なんであんな美味しいものを排除しちまったんだか…可哀想に…
と言ってるんだよ。

>>511
いや、そこまで鞭打つ気は無いよ俺も(^^;

別に、他の案でもいいんだぜ?
継承するときに最初に書いたクラス名をsuperに割り当てる、とかな。

強く言うつもりは無いが、多重継承にしても
C++と違って新しい(笑)他の言語では、
「差別」をしているよな。
1つのメイン親と任意個のサブ親っていう感じ。
rubyのmoduleとかjavaのinterfaceとか。

全く同じ考えをC++に導入する必要があるとまでは言わないが、
せめて、(親クラスを作るときじゃなく)継承して子クラスを作るとき辺りに
差別を付ける仕掛けとかが有っても良かったんじゃないかな、とは思う。
513デフォルトの名無しさん:2001/07/17(火) 00:34
一言でいえば、
>どこかの企業や個人が身勝手に決めたのではないと言うこと。
>それまでに多くの激しい議論が交わされ、大変な時間がかかっている。

単に、「今更引き返せなかった」というのが答えだと思う。
3年間(わら)の痛みに耐えられないだろうと判断したのだろう。

まぁその判断自体は正しいかも知れないな、
現存するC++勢力というものの存在を認めるからには(笑)
514デフォルトの名無しさん:2001/07/17(火) 01:08
>おいおい。だから、そんなC++「が」ふつーじゃない、

誰もC++が「ふつー」だなんて主張してねえって。
515デフォルトの名無しさん:2001/07/17(火) 01:54
virtual typedef
が欲しい...
516デフォルトの名無しさん:2001/07/17(火) 02:58
>>512
規格だから尊重しろなんてどこに書いてあるよ。
どうしてそういうふうに読めるのかさっぱりわからない。
大勢の優秀な人間たちが十分な議論の上で検討する場があったと言っているのだよ。

お前は当時交わされたであろう議論と同じモノを、
低いレベルでしているだけなんだよ。

>別に、他の案でもいいんだぜ?
>継承するときに最初に書いたクラス名をsuperに割り当てる、とかな。

マジかよ。superがどっちを指しているのか、ヘッダを見るまでわからないのか?
間違って別のsuperを指していたとしても気づかないことがあるぞ。
場合によってsuperが付けられたり付けられなかったりするのか?
そんな統一性の無い言語があっていいのか?
517デフォルトの名無しさん:2001/07/17(火) 07:58
>>512

>>C++ の文法ならふつー super::hoge() って方向で記述することに
>>なると思うけど。1から10までSmalltalk の話がしたいんなら、
>
>おいおい。だから、そんなC++「が」ふつーじゃない、
>という話なんだってば。

すげー、ここまで堂々と「ふつー」の指している意味をすり替えるか・・・
518デフォルトの名無しさん:2001/07/17(火) 11:01
typedef一行で済んでしまうものなのに、なんで予約語を増やす必要があるんだ。
それとも super.hoge() って書きたいのか? そういう書き方を許す様にもできる
けどバカバカしいから誰もやらんだろな。
519デフォルトの名無しさん:2001/07/17(火) 17:50
>お前は当時交わされたであろう議論と同じモノを、
>低いレベルでしているだけなんだよ。

一つだけ違う点があるぞ。
必要(わら)以上の過去との互換性は切っちまえ、と
考えた上でのこと、という点だ。

>マジかよ。superがどっちを指しているのか、ヘッダを見るまでわからないのか?

あ。そうか。たしかに辛いか。
だが、差別つき継承の考えを組み合わせれば、そんなに変じゃないぞ。
rubyみたいに「継承は実はあくまで一直線だ」という考え方も出来るし。

少なくとも「統一性無い」ってのは関係ないだろ。
どこを「統一」するかなんてのは考え方次第だ。

>>517
>>>C++ の文法ならふつー super::hoge() って方向で記述することに
>>おいおい。だから、そんなC++「が」ふつーじゃない、
>すげー、ここまで堂々と「ふつー」の指している意味をすり替えるか・・・

どこが摩り替えてるんだ?
C++における普通(の幾つか)なんて捨てちまえ、別の普通を持ってこようぜ、
と言ってるのだが?
ふつーという単語の意味は摩り替えてなんかないぞ。

>>518
>それとも super.hoge() って書きたいのか?そういう書き方を許す様にもできる
>けどバカバカしいから誰もやらんだろな。

うーん。それが馬鹿馬鹿しくないことは、前述のとおり、
他の多くの言語を見れば状況証拠として十分だと思うが?

てゆーか、「誰も」ってのは実は
C++言語に思考を規定された人間のことか?
ならばトートロジーだな。
520デフォルトの名無しさん:2001/07/17(火) 19:18
C++はおもろいよ。
521デフォルトの名無しさん:2001/07/17(火) 19:21
言語仕様が膨大なので、
とりあえず必要不可欠なことだけ覚えて使えばいいと思う。
522デフォルトの名無しさん:2001/07/17(火) 19:26
>うーん。それが馬鹿馬鹿しくないことは、前述のとおり、

多重継承が許される場合において馬鹿馬鹿しくないと言うのは証明されていませんが?
523デフォルトの名無しさん:2001/07/17(火) 19:27
現実問題としてJavaじゃ実用にならない場面が多いんだから仕方ない。
524デフォルトの名無しさん:2001/07/17(火) 22:01
STL, templateって、いつ頃から出てきたのですか?
私が初めてC++を触ったときは、そのような言葉を聞かなかったのですが。
525デフォルトの名無しさん:2001/07/17(火) 22:11
>>524
少なくともSTLはC++より後です
526デフォルトの名無しさん:2001/07/17(火) 22:50
>>525
そうだっけ?
527デフォルトの名無しさん:2001/07/17(火) 23:20
例外処理、実行時型情報、templateときて、STLでしょ。
もうシンタックス多すぎて嫌。
他の言語に逃げました。
528デフォルトの名無しさん:2001/07/17(火) 23:30
>>524
http://www.geocities.com/nobukichi/Stl/lec001.html
ここにいいこと書いてあるよ。

さらに補足すると、ANSIの標準化委員会は、STLを採用するために、
練りに練ったクラスライブラリをほぼ全部捨てたんだよね。
529デフォルトの名無しさん:2001/07/18(水) 02:22
>>522
なるほど。ちと考えとくわ。反例がないこたぁないはずなんだが。

だが一方で、C++の愚直な(わら)やり方しか手が無いのか?という
問いにもまた、YESと答えるにはちと考えないとならんよな。

そりゃそうと、そこでの瞬間論点は、
superがclassを指すかinstanceを指すか、という話題
だったように記憶しているが、なんか変じゃないか?
まぁいいが。

>>524
templateはTurboC++2のころはまだだったっけ(笑)
するってーと、10年は経った…っけ?

>>526
ナイスすぎる。「Standard」TLという
C++につけるライブラリの仕様は、そりゃC++より後だろう。

>>527
というか、その辺のもの一通りを(しばしば最初から)搭載してて
#あ。templateは無い奴が多いが。
なお大してでかくない言語仕様な言語が多数有るわけで、
C++がちょっと定方向進化説の体現者になっちゃってるのは
間違い無いと思う…

>>523
別にC++ or Javaという白黒どっちかしか無いわけでもあるまいし…
530デフォルトの名無しさん:2001/07/18(水) 06:02
template が使えるメジャーな言語ってだけでも C++ の存在意義があるんだけどなあ…(ボソッ
531デフォルトの名無しさん:2001/07/18(水) 08:50
実際のところ>>511のような結論にしかならんと思うがな。

悪いけど
>>いや、そこまで鞭打つ気は無いよ俺も(^^;
>>別に、他の案でもいいんだぜ?
これはまったく信用できないな。
多重継承を解決しない限り、どんな仕様にしても直行性はなくなるよ。
もちろん、「superがないと不便」には諸手で賛成なんで、
それを乗り越えて「まあ変だけど、許してちょ」的な仕様を
stroustrapが考えたのなら、俺は許すけど。
どうやってもコンセンサスはとれんと思うからこそ、typedefで適当なんでないの。
532デフォルトの名無しさん:2001/07/18(水) 09:38
javaがテンプレートをサポートするみたいだけど
SUNは自社のみでSTLもどきを実装する気なのか?
533aa:2001/07/18(水) 09:56
C++を完全制覇している人は世界に何人くらい
いるのであろうか
534デフォルトの名無しさん:2001/07/18(水) 14:53
多重継承がある以上、プログラマが継承図を意識するのは避けられないので、
superなんかあっても役に立たないと思うんだけど。
535デフォルトの名無しさん:2001/07/18(水) 17:11
>>533
ANSI C++ 仕様が完全に実装されてるコンパイラって地球上に存在するの?
536デフォルトの名無しさん:2001/07/18(水) 18:44
>>531
要は、継承元の複数のクラスそれぞれに対応した
識別可能なエイリアスがつけば、いいんじゃなく?
super(0) super(1) super(2) とか(わら

あと、前述したように、継承の順序みたいな概念、でもいいな。

ところで直接関係ない話だが、ソース使いまわすのを
最初から予想している場合は、手打ちでtypedefを
入れて回っているわけか、ふつー(笑)のC++erは?
使いまわすってのは、superclassがどれなのかってのを
字面で書きたくなくなる動機の1例としてだけどさ。

----
ところで話は飛ぶが、やっぱりメタクラスは欲しいな。
もどきでもそれなりに役立つから欲しい。

VC++なんかは一見メタクラス的機能のように見えるマクロとかを
提供してるけど、あれってどうやってるんだっけ?
(今手元に処理系がないんで見れないんだが)
537デフォルトの名無しさん:2001/07/18(水) 18:55
>>536
>あと、前述したように、継承の順序みたいな概念、でもいいな。

よくねえ。
class A;
class B : public A;
class C : public A, B;
みたいな継承をサポートできるかい。

>使いまわすってのは、superclassがどれなのかってのを
>字面で書きたくなくなる動機の1例としてだけどさ。

これにより、536はOOPを欠片もわかっていない厨房と言うことが確定しました。
538デフォルトの名無しさん:2001/07/18(水) 23:38
>>533
STLを含めるとほとんどいないだろうけど、
言語としての純粋な部分であれば、
ほぼ完全制覇したというひとは多いだろう。

C++マスター度チェックリスト

□コピー、参照、ポインタの使い分けには自信がある
□デストラクタは必ずvertualだ
□constにできるオブジェクトやメソッドは全部constにしている
□クラスには必ずコピーコンストラクタを書いている
□C言語形式のキャストは禁じている。
□vectorで2次元配列を組める
□deleteはほとんど使わない
□std::exceptionを継承していない例外は投げないことにしている
□イテレーターの動きに不安を感じることはない
□どのメンバをprotectedにするか考えながらクラスを設計している
□friendを使うとクラスの隠蔽度があがると思う
□例外指定をマメにつけている
□virtual継承は時々使う

他に何かあったらよろしく。
539デフォルトの名無しさん:2001/07/19(木) 00:24
○ コピー、参照、ポインタの使い分けには自信がある
○ デストラクタは必ずvertualだ
○ constにできるオブジェクトやメソッドは全部constにしている
○ クラスには必ずコピーコンストラクタを書いている
△ C言語形式のキャストは禁じている。
○ vectorで2次元配列を組める
× deleteはほとんど使わない
× std::exceptionを継承していない例外は投げないことにしている
○ イテレーターの動きに不安を感じることはない
○ どのメンバをprotectedにするか考えながらクラスを設計している
○ friendを使うとクラスの隠蔽度があがると思う
× 例外指定をマメにつけている
× virtual継承は時々使う

幸せになれますか?
540デフォルトの名無しさん:2001/07/19(木) 00:25
訂正

× デストラクタは必ずvertualだ
○ デストラクタは必ずvirtualだ(藁
541デフォルトの名無しさん:2001/07/19(木) 01:17
>>539
あなたかなりスキル高いね。
うちの会社に欲しいよ。
deleteはvectorやauto_ptrを駆使して丹念に消そうね。
542デフォルトの名無しさん:2001/07/19(木) 01:22
>>537
>class B : public A;
>class C : public A, B;

同じクラスを2回継承すること(を許すこと)が
そもそもヤバゲだと考えるほうが健全じゃねーのか?

>536はOOPを欠片もわかっていない厨房

はぁ?superclassはsuperclassだろう?
それが概念として頭んなかで抽象化されてねーのか、あんたの頭では?

>>538
>デストラクタは必ずvirtualだ

てゆーかvirtualでないメソッドは少なければ少ないほうが幸せ。
543デフォルトの名無しさん:2001/07/19(木) 01:25
>>529
たしか、STL の起源はC++では無かったと聞いてます。
544539:2001/07/19(木) 23:40
>>541
> deleteはvectorやauto_ptrを駆使して丹念に消そうね。

そゆことか。auto_ptr はコンテナに向いてないからほとんど
使わないなあ。誰がdeleteすべきか割とはっきりしてる場合は
気にせずdelete使てる。
それと寿命の短いやつをnewしない構成にするように心がけてまんす。

つーか、『約束事を増やさない』ってことが大事だなっ、て最近思っ
てる。クラス数の爆発を防止するためのデザインパターンとかはいろ
いろあるけど、こっちのほうも何かないかなあ?
545デフォルトの名無しさん:2001/07/19(木) 23:41
やっぱりlispが起源?
546デフォルトの名無しさん:2001/07/19(木) 23:54
class variant_container {
 std::vector<std::auto_ptr<my_variant_class> > m_x;
};
な感じで
m_x = std::auto_ptr<my_variant_class>(new my_variant_class(my_variant_class::data_type_x));


逝ってヨシ?
547:2001/07/20(金) 00:39
push_back()だ。
鬱氏
548デフォルトの名無しさん:2001/07/20(金) 13:33
>>544

それは逆で、コンテナに向いてないポインタをauto_ptrにするのです。

>× deleteはほとんど使わない
>× std::exceptionを継承していない例外は投げないことにしている
>× 例外指定をマメにつけている

これを見ると、あなたは例外が弱点ですね。
deleteがあると例外が出たときにリークします。
catchの中でthrowしたときにどうなるのか、
コンストラクタ中で例外が発生してデストラクタが呼ばれないときにどうするのか。
しかしすべてが自動変数ならそういう面倒なことは考えなくて済むわけです。
そうなると、今度は例外を気軽に使えるようになってきます。

寿命が短いものは自動変数にするのが一番ですが、
どうしてもnewしなければならないときは、
auto_ptrを使ったり、proxyパターンで実体の寿命をコントロールしたりするのですよ。
deleteが無ければリークなんてしないはずですからね。
549デフォルトの名無しさん:2001/07/20(金) 13:50
STLの起源はALGOLだと言われているよ。
ALGOLを使ったことが無いからわからんけど。
でもSTLの原型を作ったHPの技術者は
ALGOLではなくsmalltalkを参考にしたらしいね。
550544=539:2001/07/20(金) 14:50
>>548
auto_ptrってさあ、いわゆるスマートポインタとちょっと違って

std::auto_ptr<int> p(new int(32));
{
std::auto_ptr<int> p1 = p;
}
//ここでは?

なんてやるとスコープを抜けた時点でpは死んじゃってるじゃない。
これにからめてコンテナには向いてないって記事を読んでそのとき
は納得してたんよ。詳しくは覚えてないけど。
参照カウンタ付きのスマートポインタを自前で用意してコンテナに
使うのはやったことあるな。

例外は確かにあまり使わない。使ったとしても狭い範囲でcatchする
ものばかりで大域ものはやったことないな。だから投げるものはなん
でもいいや、ってことになっちった。
551名無しの厨房:2001/07/21(土) 07:45
Eiffelのsuper (Precursor)

class A feature
 hoge is
  do ... end
end

class B feature
 hoge is
  do ... end
end

class C inherit    --継承
      A rename hoge as bar  --名前変更
       redfine bar        --再定義
       end
      B redfine hoge
       end
feature        --public: みたいなもの
 bar is
  do
   Precursor    --A::hoge
  end
 hoge is
  do
   Precursor    --B::hoge
  end
end

多重継承があってもsuperを実装できると思う。
Eiffelも前はPrecursorがなかったので
同じクラスを2つ継承するという変なことをしていた。
C++にもsuperがあったほうが便利だと思う。
552デフォルトの名無しさん:2001/07/21(土) 12:12
>>551
自分で名前変更、再定義しなきゃいけないならtypedefと同じなんじゃねえの?
553デフォルトの名無しさん:2001/07/22(日) 02:28
>>548
>しかしすべてが自動変数ならそういう面倒なことは考えなくて済むわけです。
>そうなると、今度は例外を気軽に使えるようになってきます。

こういう考え方をしないとならない/しがちになっちゃう
というところも、ちょっとC++の苦しいところかな。

ガベコレがない言語でも、
ObjectiveCの(というかOPENSTEPの)NSAutoReleasePoolオブジェクト
のような戦略も有る。

ところでC++って、catch(例外食らったらここに来る)はあっても
finally(例外有っても無くてもここに来る)は無いって、ほんと?
だとすると、それもまた「例外を使いにくくする」要因の一つになる。
例外だろうがそうでなかろうが解放処理が必要、という場合に
それを書くうまい場所がなくなっちゃうから。
554デフォルトの名無しさん:2001/07/22(日) 03:28
>>553
言語仕様ではfinallyをサポートしていない。
が、独自拡張でfinally(または等価な機能)をサポートしている
処理系は多いと聞く。
俺はVC++使いだがVC++にはfinallyあるよ。
555名無しの厨房:2001/07/22(日) 07:56
class A{public: hoge(){...}};
class B{public: hoge(){...}};

class C:public A,public B
{
public:
  A::hoge(){super(); ...};
  B::hoge(){super(); ...};
};
みたいにできたらいいなあと思っただけ。
556デフォルトの名無しさん:2001/07/23(月) 01:40
C obj;
obj.hoge();
どっちが呼ばれるか不安になるぞおい。
557デフォルトの名無しさん:2001/07/23(月) 04:39
C++は、もう破滅寸前。
ここらでSTLに挫折した、全体の95%相当のプログラマが
不買運動を起こし、消滅します。

ありがとうC言語!そしてC++さようなら!(^_^)また会えるといいね!

http://piza.2ch.net/test/read.cgi?bbs=tech&key=995820118&ls=100
558デフォルトの名無しさん:2001/07/23(月) 05:20
>>555
class C:public A,public B
{
public:
  hoge() {A::hoge(); B::hoge(); ...}
};
みたいにするんじゃないかなあと思うんだが。
559デフォルトの名無しさん:2001/07/23(月) 17:27
>>554
>が、独自拡張でfinally(または等価な機能)を

「賢い仕様策定者とやらの所業がそれか?」と
思わずにはいられません…

>>555
>class C:public A,public B
>{
>public:
>A::hoge(){super(); ...};
>B::hoge(){super(); ...};
>};

それはC++系(わら)文法な傾向の言語では>>556が指摘するように
無理があると思う。それよりはsuper.hoge()っしょやっぱり。
560デフォルトの名無しさん:2001/07/23(月) 17:53
>>559
>無理があると思う。それよりはsuper.hoge()っしょやっぱり。

これでも>>556と同じ問題はつきまとうんだけど。
561デフォルトの名無しさん:2001/07/28(土) 21:48
あげ
562デフォルトの名無しさん:01/08/26 17:00
C++はオブジェクト指向C言語。

オブジェクト指向は感覚だから、いくら理論書よんでもクラス作れる
ようになれない。だからC++を使えるようにもまれない。

そういう人は多分、JAVAでも勉強して、SUNの標準クラスに接して
クラスってどんなもんか肌で最初に感じるべし。
563デフォルトの名無しさん:01/08/26 17:40
>>553
>finally(例外有っても無くてもここに来る)は無いって、ほんと?
>だとすると、それもまた「例外を使いにくくする」要因の一つになる。
>例外だろうがそうでなかろうが解放処理が必要、という場合に
>それを書くうまい場所がなくなっちゃうから。

「例外だろうがそうでなかろうが解放処理が必要」な場合は
デストラクタでリソースの開放を行うのがC++のスタイル。

C++に慣れていると、リソースの解放を自動化できず
finallyで、いちいちコードを書かなければならない
JavaやDelphiのほうが不便に思える。
564デフォルトの名無しさん:01/08/26 17:48
C言語って、何に優れている言語なの?
>>564
高級アセンブラという捉え方もある。
その意義がわからない人はJavaでもやっとけばいいと思う。
高級アセンブラとして使わないのならC++なんて簡単だろ。
新しい言語覚えきるのにはそら2、3ヶ月ぐらいの辛抱が必要ってもんだぜ。
VBとかみたいに2,3日で覚えられるものとは違うんだよ。
ちなみにオブジェクト指向が分からないならJavaだろうと何だろうと
無理ってもんだ。それに必要となる知識は言語の知識とは別だからな
567デフォルトの名無しさん:01/08/26 19:04 ID:rJqDH1N6
>>563

Javaにもfinalizeつーデストラクタあるよ。ただ、実行タイミング
はGCが動く時だから、予想不可能だけどね。
568まーたり:01/08/26 19:07 ID:qJ3dRCRc
C++からVC++へ移行する方がもっと むずい気がする
569デフォルトの名無しさん:01/08/26 19:08 ID:ri9ZAT8k
>>1

>オブジェクト指向やUMLを理解し
>巨大な仕様のC++を理解し
>モノを作るのは骨が折れます。

C++やJavaやRubyなどのOOP書くのに、
UMLやデザインパターンを知ってる必要
なんか全くないぞ。これはよくある誤解。
OOPはひらめきと感覚の世界。実際オレは
それしか使ってないし。
570デフォルトの名無しさん:01/08/26 19:59 ID:qOGvKvts
>>569
クラス設計には経験とセンスが必要なのは確かだけど、だからといってデザイン
パターン不要というのは早計でしょ。デザインパターンというのは成功したクラ
ス設計のカタログ、将棋で言えば定石みたいなもの。よほどの天才は別として、
一般にはまず定石を押さえて、その上で自分の問題に取り組んだ方が結果を出し
やすいよ。

あと UML やデザパタに関しては、他人と意思疎通を図る際の共通言語、という
意味もありますね。長々とクラスの関係について説明したり、ソースコードを読
む代わりに

「これが Abstract Factory」

の一言で済めば、その方が効率が良いわけで。
571デフォルトの名無しさん:01/08/26 20:53 ID:TeHBTESQ
>>569
>OOPはひらめきと感覚の世界。実際オレは
>それしか使ってないし。

「私は不勉強な井の中の蛙です」
と要ってるのと同じ。
572デフォルトの名無しさん:01/08/26 21:56 ID:ckmvcpUo
>>567
>Javaにもfinalizeつーデストラクタあるよ。ただ、実行タイミング

javaのfinalizeはデストラクタの代わりには使えんだろ。
・実行のタイミングが分からない
・実行される保証もない
・もし特定のタイミングで動かそうとするとGCを動かすコードを
 書かなければならないので、結局finallyに頼る羽目になって無意味。
・特定のオブジェクトのデストラクタを動かすためにいちいちGCを動かすのは
 パフォーマンスが悪すぎる。
573デフォルトの名無しさん:01/08/26 22:31 ID:ri9ZAT8k
>「私は不勉強な井の中の蛙です」
>と要ってるのと同じ。

そうかな?だれも関数作るのだって、みんな図なんて書かないし、
デザインパターン使わんでしょ。クラスだって結局ある共有した
データを持ったメソッドの集まりなんだから、同じだと思うけど
ね。

ただその代わりといっては何だけど、人が作ったいろんなクラス
読むのは大事だと思うな。MFC分析したりC++で書いたゲー
ムを分析したりね。実際、関数を感覚的に作れる様になるより、
クラスを作れる様になる方が、ずっと時間かかると思うけどね。
でも、慣れればホントUMLもデザインパターンもいらないと
思う。

UMLもデザインパターンも人によっては大変有益だと思うし、
役に立つ人もいるんだろうけど、人によってはオレみたいに、
いらない人もいる。

実際、SUNの標準JAVAライブラリー作った連中や、STL
作った連中に聞いてみたいな、どこまでそういうの使ったのか。
多分人それぞれだと思うが。
574デフォルトの名無しさん:01/08/27 00:46 ID:6cGRsEso
人が作ったソース読んで参考にしてるならデザパタのいくつかを自然に
あてはめてるかと思われ。ただ、MFCはあまり参考にならんかと。
575573:01/08/27 00:55 ID:r5Re7QYg
>人が作ったソース読んで参考にしてるならデザパタのいくつかを自然に
>あてはめてるかと思われ。ただ、MFCはあまり参考にならんかと。

MFCは反面教師として使わせていただきます。ほとんどはAPIの
ただのラッパーだし、メッセージの流れをカプセル化してる
分、非常に応用しにくい設計だと思います。WINDOWSはAPI直に
使った上、C++を使って自分でクラスを作りながら開発するのが
自分的にはベスト。
576デフォルトの名無しさん:01/08/27 00:59 ID:euvssxN.
>>573
だからそれが井の中なんだってば。
たとえそれで凄い腕前になれたとしても、他人と意思疎通ができんだろそれじゃ。
それともソースコードだけで語り合うとかってイキがるつもりか?

>だれも関数作るのだって、みんな図なんて書かないし、
>デザインパターン使わんでしょ。

なぜそんなことが言いきれるんだ?それこそ要らぬお世話だ。

それにさ、やはりObjectは「かたち」と相性が良いよ。
「なんだかこんな感じ(のクラス)」とかの「かたち」を思い描いたり、
あまつさえそれを実際に絵に描いたり、ってのをついついやっちゃう人が
むしろ多いんじゃないかと憶測する。
それの統一共通語版を作ろうってのが、デザパタやUMLだ。
#デザパタは統一以外の面も有るが、ここではさておく。

あと、日本人って抽象化が苦手ですねー(ぷぷぷ
抽象思考になると途端に酸っぱい葡萄モードになる奴が多い。
そんなんだからいつまでも根っこの部分で欧米の後塵を拝してるんだな。

>>574
そうそう。デザパタは「新しい」テクニックを示してるわけじゃない。
「既存の」テクニックに、単に、名前をつけただけ。
UMLだって同じ。「既存の」構造を(特定プログラム言語を使わずに、でも自然言語も使わずに)
さくさくっと書き表すためのもん。
577デフォルトの名無しさん:01/08/27 01:12 ID:r5Re7QYg
>>576

>それともソースコードだけで語り合うとかってイキがるつもりか?

なんかムキになってるだけで、全然説得力ないんだけど。

オレ、STL、J2SE、J2EE、使うとき、UMLもデザイン
パターンも使ったことないぞ。クラスなんてパブリックインター
フェイスとその使い方示せば十分コミュニケートできるよ。JAVADOC
のようなね。

あと、勝手に飛躍してるが、C++使うのにUMLもデザイン
パターンを知ってる”必要”がない、ってオレは言ったんだけど。
いかなる条件でも不要とは言ってないぞ。一人でC++で開発
する目的のヤツもいるし、勝手に集団のプロジェクトで使うって
前提条件作って反論しないように。
578デフォルトの名無しさん:01/08/27 02:52 ID:iVLWrpEM
うーん。別にデザパタ、肯定否定どちら派でもないけど
肯定に片寄りすぎて無理にデザパタを乱用した汚いソースも結構あると思う。
デザパタって万能じゃないんだよね。実装はかなり汚いから
実の有るところをほどほどにとっていけばすっきりしたソースが
かけるとおもうけども。。
579デフォルトの名無しさん:01/08/27 04:00 ID:/EQqP.tM
やっぱり,複数人数でやるときにはデザパタとUML(とそれに類する記法)は便利だよ。
だいたい,工業としてのソフトウェア作製を考えた場合,そこは無視できない。

立場によって肯定・否定があってもいいとは思う。

しかし,将来会社に入ってプロジェクトに参加する可能性のある若者には
「最低限の教養だから身につけておいたほうがいい」と言いたい。
言っておくけど,「信奉せよ」ってんじゃないよ。

また,577のように知っていながら批判的な態度を取ることも
結局は「知っているからこそできること」であるわけで,
より高度な概念に到達するためには,基礎知識としてその
批判対象を知ってなきゃいかんわけで。

うーむ。C++にあまり関係ないね。
580デフォルトの名無しさん:01/08/27 05:12 ID:6cGRsEso
577てデザパタちゃんと分かってるのか疑問に感じる
576も言ってるが既存のテクニックに名前を付けただけなんで
俺はデザパタ使わねーと言っても違和感がある、普通にプログラム作ってれば
デザパタのいずれかに当てはまるパターンは使ってるはず。

それでも使わねーぞと言うのって昔のスポコンマンガみたいに根性だけで(理論なしで)
プログラム作るぞ(゚Д゚)ゴルァ!!ってふうに聞こえる。今時スポーツでも理論が基礎になってるし
(例えば世界一速いモーリスグリーンとか)それを無視しようとするのは進歩するのを拒んでる
ようにさえ見える。こういう奴ってsexでも腰振って出して終わりーってワンパターン野郎って
感じがする。
581デフォルトの名無しさん :01/08/27 05:30 ID:r5Re7QYg
パターンは自分で作るとこにロマンがある。

別にそれが結果的に既存のパターンに当てはまったって良いわけ
で。音楽理論と作曲みたいなものだね。曲を作れば音楽理論に
当てはまるが、曲を作るのに必ずしも音楽理論を知ってる必要は
ない。ジョンレノンなど、音楽理論をベースにせず曲を作る連中
は腐るほどいる。ルールに縛られたいってのは、二流の証なんじ
ゅないかな。才能あれば、自由に発想したいって思うはずだし。
582デフォルトの名無しさん:01/08/27 05:35 ID:8jNUMhPQ
>>581
たかが手段でロマンを語る人が現れた。びっくり。
仕事と妄想は区別しようね。納期優先だよ。

人の英知をかっぱらうのが一番手っ取りばやいわけで。
システム開発なんてのは、えらそうに言っても結局のところ
人の英知のかっぱらいの上にちょっと使用毎の差分だけデコ
レーションかけるだけなわけで。

趣味は家でやるべし。
583デフォルトの名無しさん:01/08/27 05:51 ID:IiQ03hCY
オブジェクト指向は実装よりも分析設計の方にロマンを感じるが。
584バイト君:01/08/27 06:01 ID:tYSEFlt.
>パターンは自分で作るとこにロマンがある。
>別にそれが結果的に既存のパターンに当てはまったって良いわけ
>で。音楽理論と作曲みたいなものだね。曲を作れば音楽理論に

車輪の再発明しといて自由に発想ってのがおかしいんじゃない?
既存のものをパターン化して知識として持ってれば
無駄なところで創造力浪費しなくていいわけだし。
パターン化できないところに力を注ぐべきかと。
585デフォルトの名無しさん:01/08/27 06:14 ID:iVLWrpEM
>>584
>車輪の再発明しといて自由に発想ってのがおかしいんじゃない?

おいらの立場としてはあくまで中立だけど、世の中にあるすべての
ものが車輪の再発明だけではないと思うよ。
581 が言いたいのはデザパタだけでは満たせない部分を指している
ような気がするのだけど、深読みしてるかな。

とりあえず知識として持っておくのは賛成。
全面的に肯定すべてデザパタで統一するにはデザパタ自体に
それほどの能力が備わっていないように感じるので否定。
デザパタはまだ信頼できる完成段階ではないような気がする。
586デフォルトの名無しさん:01/08/27 06:37 ID:r5Re7QYg
>>582

それじゃ、ロボットだよ。多くの経営者はそんなロボット君
は求めてないと思うぞ。仕事仕事っていうけど、多くのいい
プログラムは仕事の外で書かれてる訳で、それを普遍的に押
しつけるのは、おかしいな。あと日本にはあまりいないが、
技術的なフロンティアな事やってる人たちってそんなロボッ
トみたいな発想で、物作ってないと思うぞ。これってSE、
PGに限らず、どんな物づくりにも言えるんじゃないかな。
外面、クールでドライなビジネスライクな部分も必要だけ
ど、やっぱホットでウェットなホビーライクな部分って重
要だと思うぞ。押しつける気はないけど。
587デフォルトの名無しさん:01/08/27 11:11 ID:IiQ03hCY
だからここでも何度も言われてるようにデザパタはカタログ化した
ことに意義があるんだって。あれで全て設計しろなんて誰も言ってない。
ここでデザパタという単語である程度の共通認識ができていること自体が
その一番のメリットなんだからさ。
もちろん詳細設計のテンプレートとしても使えるけどさ。
588食いだおれさん:01/08/27 12:24 ID:wi3879hI
>>580,587
わしも大体そんな思い

Design patternを知ったのに、
設計初段階の思考に影響を受けない人間ってこの世に存在するのか?
ああいったpattern区分がある事を知っている、これがframeworkの強さじゃないか。

何でもdesign patternで、無意味なGoF風class連発する奴も考えものだが。
589576:01/08/28 01:07 ID:1P3cxrIo
>>580
そうそう。それそれ。デザパタ使うのと使わないのの差ってのは、
つまりは或るパターンを「その名で」呼ぶかどうかの差でしかない。
だから、それを使わないってことは、他人(人間ね。計算機じゃなく)との
意思疎通はどうよ?という話にしか、ならんわけ。

ただし、
>>582

ロマンは大げさだが、たしかにGoFの23パターンだけで森羅万象が表せるはずもないんで、
新たなパターンを見つけて名前つけるっていう作業をやりまくってる連中も
一方で存在してるのは事実。
将来的にはその彼等の研究成果のごく一部(藁)は、主流派に合流するんじゃないかなあ。

つまり、デザパタっていうもの自体は、まだ「終わった研究」ではない、ということ。
最終(?)的には、パターンの「淘汰」みたいなことが起きるんじゃないかと希望的に観測。
つまり成熟やね。

ところでパターン自体もパターン間に類似性や包含性があったりして、
結構親戚関係があるよね。だから、23個にしても、単に23個の独立したAlphabet
みたいに扱うんじゃなく、意味の関連性が相互に有機的に存在するようなモノなのだろう。
Primitiveはきっともう少し「下」に有る。それを発掘することがどれだけ有意義かは微妙だとしても。
590所新車:01/08/28 05:50 ID:TsVgfhCw
デザパタ…というよりGoF23パターンは有用だよ
広く一般に知れ渡ったからね(ホントか?と、自分でツッコム)
話の中でxxxパターンという言葉を使うだけで
構造を言い表せる共通語になるのが一番の強み
UMLも一般に受け入れられていること自体が意味のあることだし
結局、C++も広く一般的に使われているから自分もつかう

っつーか、僕って長いものに巻かれまくりかも
591デフォルトの名無しさん:01/08/28 06:51 ID:MRWziuF6
デザインパターンのプリミティブか。そういや2年ぐらい前のCマガの
デザインパターン入門って連載の最終回が結構いいこと書いてたよ。
オブジェクト指向のエッセンスを最初にまとめて、それらが
GoFのそれぞれのデザインパターンをどう構成しているとか、
GoFの各パターンがどう関係し合っているかとかまとめてた。
ttp://www.try-net.or.jp/~tatefuku/t_20000605.html
ですすめられてたんで先輩からバックナンバー借りて読んだん
だけど、なかなか良かったよ。
592デフォルトの名無しさん:01/08/28 10:13 ID:.5mdRdYk
>>591
Cマガのその頃の一部(藁)の記事と、
あと往年のDDJJの一部(藁)の記事とは、
すごくいけてた。あーいう文章がもっと沢山出てきて欲しい。

というわけで、よいwwwサイト有ったら教えてくんm(__)m
593デフォルトの名無しさん:01/08/28 11:46 ID:A/WljIC6
俺の考えるクラス作りの方法。

たとえば、JAVAでboolean型のフラグを使ってると
して、そいつが誰がいつ状態を変えたのかわかるように
しようと思ったとき、いつものごときクラスを作る。
こんな感じになるだろう。

1。セッターゲッターを作る。
2。変更時に、呼出クラス、メソッドの名前を登録する。
3。標準出力に状態を常に吐き出したい時は、セッター
に標準出力に出力する用にする。
4。常に出力されるのは、使えないから、コンンストラ
クターで指定できるようにする。

こんな感じで作っていく。あといろんなクラスを作って
言って汎用性を持たせる為に、どんどんabstractで
外だしにし、コードのダブりをなくす。

あと関数は出来るだけstatic 作るようにし、(つまり
単発で使え、他に一切影響の与えないようにする為)、
staticなものは、JavaのCollectionsやArraysのように、
staticメソッド集のようなクラスに入れる。

これが、俺の大まかなクラスの作り方だが、デザイン
パターンなんか使ったことないし、必要性も感じない。
設計時だが、どうやって抽象クラスを最初にモデルする
時は、思い浮かぶものを作ればいばいいとしか言いようが
ない。でも最初から抽象と実装のコンボはテストしにくい
ので、大概最小は1クラスで実装し、あとから抽象化する
というステップを意図的にしている。

俺的に、厳密ではないが、単純に言えば、クラスなんて
所詮複数インスタンスを生成出来るCで言うモジュールを、
複数インスタンス生成できるようにしただけのものなんだから、
デザパタだのUMLの必要性を感じないのである。
それでもそれなりの評価は得ている。

あと関係ないが、オブジェクト指向が理解されない理由は
このコード表現をデザパタ、UMLなどに特別視されす
ぎる事にあると思う。同じグローバル変数を共有出来る関数群、
つまりモジュールの一種でそれを、複数インスタンス化する
ことができ、時には構造体的に使うことができる、程度に
解釈すれば全然難しいものでもなんでもないと思うぞ。
594デフォルトの名無しさん:01/08/28 11:59 ID:eStTOHF6
>解釈すれば全然難しいものでもなんでもないと思うぞ。

オブジェクト指向よりあなたの日本語の方が難しいです。
595デフォルトの名無しさん:01/08/28 12:18 ID:ruHY1EHc
デザインパターンの内容とその理念を理解した上で使わない使う必要を感じない
というなら、それでも良いと思いますよ。いわゆる天才には、必要ないのかも
しれません。

とはいえ、コードの構造を他人に伝えるプレゼンテーション集としても有用
なので、もし読んでいなければ精読する事をお勧めします。

少なくとも上の発言はわかりにくく、意図を理解するのが相当難しいですよ。
596sage:01/08/28 14:43 ID:tB0WoitY
593って相当頭悪そうだね
597デフォルトの名無しさん:01/08/28 14:50 ID:xva9NHHs
>>581
和声学を踏まえた上で一流の作曲家なんて、
クラシックの世界にはいくらでもいまする。
598デフォルトの名無しさん:01/08/28 15:10 ID:08uBFxUw
>>581
昔から言われるように、最高の書き手は時にレトリックのルールを無視すること
がある。ただしそうした場合には、ルール違反を補ってあまりあるメリットがその
文を通して読者に伝わるのが通例だ。それに確信が持てない限り、おそらく書
き手はできる限りルールにしたがおうとするだろう。
-----William Strunk and E.B. White, The Elements of Style
(『プログラミング作法』からの孫引き)
599デフォルトの名無しさん:01/08/28 15:47 ID:EfXPjBJw
隊長、>>593の解読に成功しましたっッ! 要約すると、

「プログラムを作る時は原則として一つの巨大なクラスに
全部の関数をつっこむ。例外としてグローバル変数を管理
するためのクラスやユーティリティ関数を集めたクラスを
作ったりもする。あとabstructというのもよく分からない
なりに使ってみた。」

という意味ですっッ!
600デフォルトの名無しさん:01/08/28 17:37 ID:RwT16pIQ
>>593
実装(具体的表現)とパターンつーのは異なるロジカルタイプに属するんだから、実装で
パターンの何かを語ろうとすることにそもそも無理があると思われ。
601 ◆winntZag :01/08/30 02:12 ID:OJtyVZPM
>>581
そんな貴方には、芭蕉のことばを贈ろう。
「格に入れば狭く、入らざれば邪路にはしる、出て初めて自在をえべし」

パンピーはまず基本を押える。
だけどそのままでは型にはまりすぎるので、
基本を押えたうえで、もし必要ならば、それを崩してみる。
初めっから、基本を無視するのはよくない。

よほどの天才は別だろうが。
602 :01/09/08 17:39
>>601
えべし -> うべし

じゃないのか?
604デフォルトの名無しさん:01/09/08 19:10
C++プロジェクトの設計段階にかかる時間は、3倍です。
継承すべきもの、すべきでないものを正確に決めるためです。
それでも、判断を間違えます。
>>604
Javaだと5倍なので、まだマシです。
606デフォルトの名無しさん:01/09/08 23:02
OOPを学ぶ順番は、
「データ構造、モジュール→クラス構造→デザインパターン」
と書くと、賛成も反対も無いのは何故?
>>604
それって、分析が出来てないからじゃないの?
クラス構造って何?
クラスの使い方と書いた方が良かったかな?
610デフォルトの名無しさん:01/09/09 02:48
switchバカでスマソ。
OOPってトップダウンで設計するためにやってきたんでしょ。天の声で。
C++は特殊な構文がやたらと多すぎる
でも多くの場合、「なんでもトップダウンで設計できそう」という
ダメな幻想をあたえただけかも。
613デフォルトの名無しさん:01/09/09 02:58
トップダウンといや、、
責任駆動設計(responsibility-driven design)てのがあったな。
CRCカードで設計してる人って漏れは見たことないけどな。
614デフォルトの名無しさん:01/09/09 05:49
実際のところ
C++を効率的に運用できるスタッフが少なすぎる
言語仕様としてのキャパシティはともかく
今のところ企業としての利潤追求の旨みの少ない言語
小さな会社は、C++を使ってC的な組みかたしてる所がほとんどだし
それが正しい
615デフォルトの名無しさん:01/09/09 07:39
OOPイコール トップダウン、なのか?
漏れはそういう印象はあまり受けないな。

トップダウンだと思いこんでしまう人は、単に以下の経験が少ないだけ
なんじゃないかと憶測&揶揄したいのだが、どうよ?

1:気楽にソフトを作ったことが無い。OOPつーたらエンプラとかの大規模ソフトを「作らされた」ことしかない。

2:ライブラリを作った事が無い。特に案件専用じゃない汎用寄りのクラスのライブラリを。
これは方法論「Drop」でも言及されてることだが、これをやったことが無いってのはつまり、
そのプログラマは単なる部品ユーザーでしかない、ということを意味する。
むしろボトムアップちゃうの?
クラスライブラリを作る/使うの両方を経験すると、
それからいい仕事ができるようになるのかな。

誰かのを使うときに「何を考えて作ったのか」を想像しやすくなるし、
誰かのために作るときに「どう使われるだろうか」を想像しやすくなる。

これを端的に表す言葉を希望
618加藤茶:01/09/09 21:33
鏡の向こうは志村けん。
>>612
の言うトップダウンってどういう意味だろうね。
Abstruct→Concreteってこと?

>>618
2点。
スレタイを「なぜ職業プログラマはあんなに気難しいのか?」にすれば良かったね
>>617
同床異夢!
…違うなあ。むしろ逆か。鬱出汁脳…

つーかー!
…それも全然違うなあ…

思いやり!
…どうよ?…

…というわけで、>>618がサイコー!ということで、募金活動は終了。
622デフォルトの名無しさん:01/09/15 14:14
C++での委譲の実装ってすごく面倒に見えるんだけど、
どんなときに委譲って使うのですか?
オブジェクトが受けたメッセージを別の オブジェクトに丸投げ
するってなんか意味あるのですか?
メッセージの分岐点として使うのですか?
使う場面が、頭悪いので創造できないです。
委譲そのものが分かってないのかも。トホホ。
>>622
現実問題として継承が使えない場合に逃げとして使うことが多いかな(藁
>>623 レスありがとうございます。継承が使えない場合、、
これも想像できない。鬱氏。
>>624
逃げとしての一例をあげれば、class Fax と class Phone があって
それぞれインターフェースではなく実装付きで定義されている場合に、
多重継承を使わずに FaxPhone を作れと言われたらどっかで委譲することになる。
Java では実装の多重継承はできないし、
C++ でもライブラリの制限でダメということがある(C++BuilderのVCL)。
626デフォルトの名無しさん:01/09/15 19:24
>>623
漏れはむしろ逆だな。
委譲するのが適当でない、と思われるときに継承を使う。
実装上、そのほうが楽になることが多い気がするから。

>>625
既存の(自作でない)class Faxとclass Phoneがある場合は、そうかも。
FaxPhoneとして使うことを想定していないFaxなりPhoneを基底クラスと
して採用することは不適当と思う。意図せずに(副産物として)作られた
汎用基底クラスなんて信用ならない。将来的に破綻しそうな気がするしな。
627デフォルトの名無しさん:01/09/15 20:09
>>625-626 レスありがとうございます。
なるほど、アフォな私にもよくわかりました。
継承は最小限に
でもツボにはまった使い方をすればパワー倍増

「オブジェクト指向の goto」とどっかに書いてあった
629デフォルトの名無しさん:01/09/15 22:47
話の流れを無視する発言ですが、オブジェクト指向の良さが実は解りません。
クラスでカプセル化と関数でカプセル化の区別がつきません。

ウィンドウプログラミングには楽そう、とは理解していますが、
それ以上ではありません。WIndowsプログラミングはしたことありません。

僕はC++は便利なCとして使っています。Javaは食わず嫌いで絶対勉強しないでしょう。
Perlは美しい言語だと思います。Rubyはどうでか?
630デフォルトの名無しさん:01/09/15 23:47
>話の流れを無視する発言ですが、オブジェクト指向の良さが実は解りません。
よくデキテリャなかなかいいよ。
javaの話で申し訳ないが、「javaのプログラマーがいない」というのは嘘。
いないのは「オブジェクト設計できる人」という話題になった。

機能が動くよーにコード作るだけなら何でもいいんだけど、オブジェクト
の良さをとなると、システム設計のセンスが必要とされるので難しいんだろうね。

ふつう、10人ぐらいの規模でソフト書いていれば、わかると思うけど、
上流行程や、メンテをやってりゃ良さがそのうちわかると思いますよ。
でも
>Javaは食わず嫌いで絶対勉強しないでしょう。
だったらずーとわからんかな。
好き嫌いで仕事ができるのはうらやましい。というか、サンデープログラマーか。
趣味なら何でもよろしい。

>Perlは美しい言語だと思います。Rubyはどうでか?
この感覚わからない。仕事でソフトを作るなら、使い方にもよるけど、
一定以上の規模をperlでかくなど悪夢です。
手続き型->オブジェクト指向って基本的に制約を強くする方向で進化したわけで、
その制約をメリットと感じない人は確かに存在するね。
傾向としては天才肌なプログラマに多くて、
そういう人はCやperlに汚さなんて感じないし
>630みたいな人間とは意思の疎通が出来ないんだよね(藁
632デフォルトの名無しさん:01/09/16 01:03
>631
>手続き型->オブジェクト指向って基本的に制約を強くする方向で進化したわけで、
確かにそうなんだが、継承とか、一方的に規制を増やした方向だけとも思わない。
オブジェクトの良いとこかいてくと教科書になっちゃうけど構造体の良さがわか
れば、>629もオブジェクトの良さの一部がわかるかな。

ただ、オブジェクトでひどい書きかたされるとかえってたちは悪いとは思う。

>傾向としては天才肌なプログラマに多くて、

天才の定義によるがそれって独りよがりのひと? コスト的に妥当な
プログラマーの集団で作成しないといけないソフト製造には、自分の
書いたコードが人が読めることが必須。オブジェクト指向とかはあく
までエンジニアリング(ローコストで良いものを作る)として進化し
てるんだと思う。

>そういう人はCやperlに汚さなんて感じないし

要は書き方なのだが、宣言てきとうな言語など20年前のbasicの時代に戻ったようで...
美しいというか、ちゃんとした言語とは思わない。何で書いてあっても
人にわかるようにきっちり書いてあれば美しいと思うが、型もわかりにくい
ようでは。ちょっとしたプログラムを書くには大変便利とは思うよ。

>630みたいな人間とは意思の疎通が出来ないんだよね(藁
そういいきられるとちょっと悲しいが、仕事としてソフトに関わるように
なって、純粋さがなくなってきたかなー。だんだん話の方向がずれて申し訳ない。
>>クラスでカプセル化と関数でカプセル化の区別がつきません。
関数でカプセル化ってどういうこと?
あと、perlが美しいってのはperl好きな人でもあまりいないとおもうが。
どんどん肥大化してるし。
634デフォルトの名無しさん:01/09/16 02:00
http://www.geocities.co.jp/SiliconValley/5634/t82A2_0001.html#1555で
委譲の項目で
・オブジェクト指向な考え方に一番縁遠く、
今日もせっせとデカい声で旗振りをしながら、
手続き型言語のCOBOLを駆使しているアイツが、
何故か使いこなしているもの。
・「委譲」じゃなく、「押し付け」とか「責任転嫁」とか表現した方が
正確なのだけれど・・・。

ってありますけど、本当ですか?
635>634:01/09/16 02:04
なんちゃって用語辞典じゃん。
洞察力に乏しく悪魔の辞典ほどの毒も無い。
読まんでよし。
636デフォルトの名無しさん:01/09/16 02:48
>>635
同感。本人おもしろいつもりなんだろうがな。それほどのこともなし。

オブジェクト指向も設計思想の1つだ。プログラムを作るときに
作りたいものをどうイメージして、どの言語でどうやって作るか。
言語の性格もさまざまだし。結局、そこが腕の見せどころだ。
なんとか指向の方に正解があるわけでなくて作るやつの責任で選ぶってこと。
つくりたいものが決まらないうちに、作り方について正解が決まるわけはないから
概念だけを過剰にクローズアップしても得るものはないと思うよ。

Perlに美を感じたことはないけど作者の才能は十分にじみ出てると思う。
637デフォルトの名無しさん:01/09/16 06:40
C++ の例外って使われてるの?すごく中途半端なイメージがあるんだけど

Java みたいに標準ライブラリとかで大々的に使わないで
例外を使え、って言っても混乱するだけだと思う。
638デフォルトの名無しさん:01/09/16 07:04
おいらは使ってるよ
コンストラクタでのエラーなんて
例外なかったらキレイに扱えないじゃん
あと標準ライブラリだった例外使ってるじゃん
639デフォルトの名無しさん:01/09/16 11:32
>>638
C++って、コンストラクタの中で例外だしていいんだっけ?
640sage:01/09/16 11:52
どこで出してもイイよ
641デフォルトの名無しさん:01/09/16 13:55
どぴゅ
>>639
デストラクタが呼ばれないけどね。
643デフォルトの名無しさん:01/09/16 20:09
>>640
デストラクタで例外出すのだけは、やめた方がいい。
>>643
ワラタ
645 :01/09/16 21:28
Windowsのアプリケーションやゲームを作る場合、やはり一番適しているのは
C++ですか?
ゲームに関してならVC++
645に関してならHSP
648無名λ式:01/09/16 23:18
>>642
> デストラクタが呼ばれないけどね。

まだコンストラクト終ってないだもん、呼んじゃ駄目だよね。

初期化リストの中で初期化の終っているものは、デスタラクタ呼ばれる。
これは嬉しい仕様。http://www.gotw.ca/gotw/066.htm
>>633
>関数でカプセル化ってどういうこと?

関数によってカプセル化され得るものは、たしかにある。
が、関数ではカプセル化できなくてObjectでならできる、というものもある。

関数でカプセル化されるものの筆頭は、処理の「流れ」。
サブルーチンを呼べば、そのサブルーチンの中の処理順序を
気にする必要が無くなる(というか気にすることは出来なくなる)。

思い出深いのが、Cの関数の中のstatic変数。
グローバル変数みたいに外界に野ざらしになるわけでもないのに
前回の値を覚えているなんて、なんて便利なんだ!と最初は思ったが、
ほどなく、関数の実行より変数のほうが寿命が長いくせに、
その関数を使わないとその変数にアクセスできない(=多様なアクセス形態と
やろうと思ったら、その1つの関数が超多機能肥大化する羽目になる)、
ということが致命的に面倒だと気付いた。
そして、解決策はOOPだった。

#憂鬱本では、グローバル変数の正体を暴くという文脈で、これと同じ問題を指摘している。
#あれは名著だ。読め。
650633:01/09/18 23:48
今日憂鬱本を注文しました(売上に貢献 :D)。

(クラスで)カプセル化すると大人数での開発に有利になる、
って言われてるんですけど、初期のC++はCのプリプロセッサ(?)
でしかなかったわけで、Cでもちゃんと関数を設計すれば、
カプセル化はできると思うんです。

#もしかしたら、C++ではクラスを使えば誰でもカプセル化できる、
#逆にカプセル化しなければC++のクラスは使えないってこと?
#英語で喋れは論理的になるとか、そういうレベル?

ちょっと具体的なプログラム例を考えます。
651無名λ式:01/09/21 02:34
「プリプロセッサがなくても同じ事が出来る」というのは、
言語の実行時の振舞いの事を言っているのだと思う。
ところが「カプセル化」は、往々にして字面上の問題だから、同じ論理は通用しない。

文字リテラルの代わりに文字のコードポイント整定数を入力した時の事を考えよ。

// sageてるからsage
プロじゃないんだけれど。
たとえばコンパイラの構文解析なんかswitch文でやるほうがいいとしか
思いつかないんですが、OOPの使いどころが見えません。
オブジェクト扱いにするのは入力と変数管理と
コード出力ぐらいでしょうか。
ストローストラップの偽インタビューが気になる。
カプセル化ってガチャポンの中身が何でも同じ規格の殻に入ってるってことですよね。
653デフォルトの名無しさん:01/10/12 23:27
カプセル戦士
654デフォルトの名無しさん:01/10/12 23:35
カプセルに入っているので、中に違うものが入っていても
同じ機械で繰り出せるのです。
655デフォルトの名無しさん:01/10/13 01:58
>>652
Interpreter パターンを知っている上でそう思っているのなら、
別に人それぞれ、どう思おうが構わないのですが。
知らないのなら一度何かの本で見てみるとよいでしょう。

でも、OOP使おうが使わまいが、構文解析するときの
switch の使用頻度はそんなに変わらないと思うのですが。
文法を書いて、その要素要素を関数で置き換えるか
クラスで置きかえるかが違うだけで、
どっちもやってることは一緒ですよね?

って、もしかして、トークン解析のこと言ってます?
656 :01/10/13 12:45
http://www.inet-lab.org/ted/program/progdetail.html
を見てC++を勉強しよう。
657デフォルトの名無しさん:01/10/13 23:27
age
658sage:01/10/14 01:08
C++(と言うかオブジェクト指向言語)の特徴なんざ
再利用可能な部品の寄せ集めでアプリが作れる点だと考えているが
いかがなもんか?
行き着く果ては部品のチューニング屋と組み上げ屋にわかれてくんちゃう?
特に大規模になればなる程ね。
モジュール化レベルに退行するっていいたいわけね?>658
660デフォルトの名無しさん:01/10/14 01:40
退行って?
>>660
カーレースゲームで言うと、
逆走して対向車に追突するって事。
662デフォルトの名無しさん:01/10/14 02:07
C++におけるOOPで最も需要なものがプリオンフィズムです。
663デフォルトの名無しさん:01/10/14 02:10
ハンドルを操作するのに、車の実装部分までを知る必要がない!という例えに感動すれ。
664デフォルトの名無しさん:01/10/14 02:33
>>663
それじゃVBですがな(w
665デフォルトの名無しさん:01/10/14 03:17
>662
つまりどれだけ実態を隠しとおせるかということですね?
666デフォルトの名無しさん:01/10/15 04:18
自分で複素数クラスとか作って
Complex c1(1.0, 2.0), c2(0.2, -1.0);
..
return c1 + c2;
とかやったとき、ちゃんと呼び出し元に足し算の結果が返るんでしょうか?
それともデストラクトされちゃうんでしょうか?
やってみればいいじゃん。
ちなみに値は返ります。
668デフォルトの名無しさん:01/10/15 05:01
デストラクタはいつ呼ばれるんでしょ?
この辺がいちばん良くわからんのですが。
returnする直前にそのスコープにあったオブジェクトを
宣言の逆順にデストラクタが呼ばれる。
670デフォルトの名無しさん:01/10/15 05:13
なんで〜 あんなに〜 難しいのか〜♪
C++と〜 いう名の〜 プログラミング言語〜♪
>>669
リターンの直前ではなくて、スコープを出るときです。
>>670
(言語だけ単純に比べるとして)C++が難しいっていったって
最近ここでよく見かけるSchemeやHaskellに比べればなんてことはない。
おれ、全然分からん。
Haskellはともかく、Schemeは簡単だろ
674デフォルトの名無しさん:01/10/16 01:53
>>669
>>671
いずれにせよ、
 return c1 + c2;
で作られた無名オブジェクトは、
メソッドから返ったときにはデストラクト去れて
しまっているように思うのですが?

されないとしたら、いつされるのでしょう?
>>674
されないなんて誰が言ったんだ?
過去ログ読めって?
いつされるという疑問は残る・・・
というか無名オブジェクトは上位のものなんだろう
ってことにして今日は寝る
無名オブジェクトのポインタを保持して酷い目にあったことあるヨ
悲しいヨ
たとえばint型の値を返す関数があったとしたら
その返される値は上位の何かに値が代入されて
処理を完了する。
それなら無名オブジェクトも上位の何かのオブジェクトに
値をコピーして処理を完了する。
よってデストラクタはスタック領域が開放されるときという
ことでいいですか?
680デフォルトの名無しさん:01/10/16 03:02
>>679
んじゃ、intを返す関数の値を受け取らなかったら
関数の処理は完了しないのか?
「上位」というのが良く分からないが、>>679の理解は大体あっている。
スタックが開放されるときではなくて、スコープを出るとき。
まぁ似たようなもんだけど。
いつ何が起こるかしりたければ、コンストラクタとデストラクタ、
コピーコンストラクタにそれぞれ
cout << "CTOR" << endl;
cout << "DTOR" << endl;
cout << "CPCTOR" << endl;
などと入れておいて、関数の呼び出し前後、returnの直前にも
同じようなものを入れておけば分かりやすいと思うよ。
682681:01/10/16 03:42
デストラクトされるタイミングは嘘かも。
上で言われてるようにreturnの直前かも。
やっぱC++って難しいねい。
さらにComplex&を返すメソッドだと…
とか考え始めると欝だ…Java使おう
684デフォルトの名無しさん:01/10/16 04:07
この話にはVC++で言うところの、
__stdcallとか__cdelは関係ないのかな?
__cdeclでした。すません
関係ない
687デフォルトの名無しさん:01/10/16 04:33
それはテンポラリオブジェクトの寿命問題としてしばしばC++ユーザのあいだで話題になるんだな。
結論をいうと「該当する関数呼び出しを含む式」の終わりでデストラクトされることになってる。
ていうか、ちょっと記憶あいまいなんで「テンポラリオブジェクト」検索してみて。
いろんな場合のアセンブリコード吐かせて見てみるといいぞ(経験談
あ、「テンポラリオブジェクト」の寿命か。勘違いしてた。
>>681の説明は間違いで、687さんのが正解。
けれども、>>681の実験は一度やってみるといいよ。

Effective C++にもそのへんのオブジェクトの寿命の説明が
詳しく書かれていたように思う(今手元に無いから確認できないけど)
>>687
ぬおお。
すると、
Complex fact(Complex n) {
return
(n == Complex::zero) ?
Complex(1.0, 0) : n * fact(n - 1);
}
で、n - 1のテンポラリオブジェクトは
再帰呼び出しが全部終わってreturnするまで
destructされない?
>>689
そういうことになるんじゃない? 試してないけど。
ただ、いかなる場合にテンポラリオブジェクトを作るかはコンパイラの実装依存だし、
正直よくわからん。あくまでも、「*もしも* テンポラリオブジェクトを作るとしたら、
その寿命は〜」っつー規定だから。
691落ちこぼれ:01/10/16 12:09
ここの若い人たちに頭を垂れて教えを乞いたいです。

Cに10年以上どっぷり漬かってた、ここで言われてるような
爺化石プログラマです。もう実務から離れて半分管理職なのですが、
知らないと恥だと思いC++を始めてみたのですが、苦戦しています。
言語仕様やものの本の例題やソースは理解できるのですが、どうも
ピンと来ません。

オペレータのオーバーロードとテンプレートは凄い、便利だなと
思ったのですが、こういうところに眼が行ってる所がダメなんじゃ
ないかと思っています。
多分、始めにデータ構造ありきという考え方から頭が切り替え
られないせいなのでしょう。プログラムをなるべくたくさん書いて
習得したいと思ってるのですが、一人の人間ができる範囲で
これがC++で書ければOOPが理解できる、というような例題は
無いでしょうか?
C->C++で落ちこぼれそうな人間は何がダメなんでしょうか。
宜しく御教示願います。
>>691
C++勉強中のものです。
デザインパターンをやってから初めて自分が進歩できた
気がしました。お勧めです。
その程度の知識ですが
あるとないでは大違いというぐらい考えかたが
代わりますよ。
わからんですなぁ。
Cを使いこなせればC++なんて簡単にマスターできそうなものですが・・・・

>多分、始めにデータ構造ありきという考え方から頭が切り替え
>られないせいなのでしょう。

そうなのかもしれませんな。

>言語仕様やものの本の例題やソースは理解できるのですが、どうも
>ピンと来ません。

とりあえずその程度で十分なのでは?
多分Cを極めたような人には満足できないレベルなのでしょうが
言語仕様を全く理解していなコピペ新入社員の造ったソースが平気で市場に出回ってますよ。
それこそあとはコーディングしまくるしか無いのではないでしょうか?
694デフォルトの名無しさん:01/10/16 13:01
>>691
ずっとやってれば、
そのうちCを使うのがいやになってきますよ...。

>>692 のいうとおり、
デザインパターンはOOPを理解する
いい道具になってくれると思います。
継承・仮想関数を使いこなすとはどういうことなのか、
それが分かると思います。

>>693 のように、
最初はコンストラクタ、デストラクタ、参照とか、
便利なところだけを使って組んだのでもいいかもしれませんね。
それだけでもC++を使う価値はあると思います。
695デフォルトの名無しさん:01/10/16 13:09
>>691 あとテンプレートもC++にある便利な機能ですよね

>C->C++で落ちこぼれそうな人間は何がダメなんでしょうか。
>宜しく御教示願います。
 もしかして DIY"DoItYour(My)Self " 精神が邪魔してるんじゃないかなと
 的外れ?
参照って皆さん使ってますか?
参照使っていますけど? 何がお知りになりたいのですか?
698デフォルトの名無しさん:01/10/16 13:16
> もしかして DIY"DoItYour(My)Self " 精神が邪魔してるんじゃないかなと
> 的外れ?

的外れじゃないと思うよ。そのものズバリかもしれんのぉ
>>697
ソースが読みやすくなる以外に何かいいことがありますか?
>699 参照ですか? なら自作クラスで演算子処理させたい時どうしますか?
>>691  とりあえず BCB++で 差分プログラミングというか イベント駆動的というかに
   馴れてみたら?
>>700
それって参照でないと出来ないことなんですか?
煽りとかじゃなくて本当によく分かりません。
703デフォルトの名無しさん:01/10/16 13:24
私はC++からプログラムに入ったのでベーシックの方が難しいです。
>>702 聞く前に、complexクラスとか眺めてみましょう。operaterの行
705落ちこぼれ:01/10/16 13:29
皆さんありがとうございます。

実は再入門と言ってもいいのかと思いますが、かなり昔、
ViualCが出たばかりの頃、勉強始めて頓挫したときは、
ClassLibraryのソースや、ヘッダファイルを
読んでいるうちに、うう、わからん・・・となって
しまいました。若い人に聞くと最悪の勉強方法
だったらしく(藁 ああいうのは便利なものと
割り切って”信じて”使うもの、printfを疑わないでしょ?
と言われました。確かにそうですが・・・

思うに、Cを漬|使ってたと言っても、ローレベルと
ハイレベルよりに分かれてると思っています。
手前味噌で申し訳ないですが、実務ではデバイスドライバ
をやることが多く(これはこれでやや特殊な世界なので
書ける人間があまり多くないので担当が固定してしまう
傾向にあります)
制御系をやりすぎるといけないとは思いたくありませんが
ここらへんも原因の一端があるかなと考えています。

とはいえ、自分の置かれてた環境の所為にするのは
恥ずべきことだと思いますので頑張ろうと思っています。
新しい技術に追いつけなくなるのは本当に恐怖します。
参照は小粒でピリリとからい。#はげしくがいしゅつ?
707デフォルトの名無しさん:01/10/17 01:33
ガイシュツのC++を理解するのに役立つデザイン・パターンの本など御教えいただけないでしょうか?
>>707
GoFの本しかないだろう。と言いたいところだが、
あれは難しいんだよなあ。
頭いい奴に勧めるには最高の本なんだが。
>>708
分かるまで読むべき本でしょ。
分からないからって読まずに済むものならそうしても
いいけど、あれは理解するまで粘るべきものだと思う。
EffectiveC++
711707:01/10/17 02:45
>>708、709,710
皆さん、れすThanxです。
Gofってなんのことかわからなかったですけど、わかりました。
「オブジェクト指向における再利用のためのデザインパターン 」
ってやつですよね。今度本屋で見て購入も検討してみます。
今はC++勉強中で一通りはわかったつもりですが、細かい点やグレーなとこなどは
ARMとEffectiveC++で確認しております。
まぁ聞いてくれよ....
コンパイルしたら エラー12、
もうだめだ........................................
できた、、、、できた、、、
エラー0、
なんか欝だった世界が微笑ましくなったよ、、、
.exe - エラー 0、警告 0
715デフォルトの名無しさん:01/10/17 08:15
>>705
printfを疑わないといってもprintfくらい作れるという調子で中身
まで追いかけてしまうと難しいのは当然です。

 部品として使うのもひとつの技術で、習得が必要です

Cから移るのなら 似たC++より、Delphiを経由した方が頭の切替が出
来て楽な場合もあります。

 実際、制御系のC使いの人で C->Delphi->BCB++ ->VC++ という順
序でなんとか追いかけられている人も多いですよ。
かくいう私も40に届きましたが、Delphi->BCB まではなんとか使
えるようになりました。  VC++ はActiveXをなんとかツールの助け
を借りながら作れる段階で MFCはまだ棚上げしてるんで大きな事は
言えないんですが・・・
716715:01/10/17 08:21
ようするに言いたい事は、 C -> C++ は似てるけど 違う。

そこにあるギャップを埋めるには C をいったん捨てる事が
人によって良い刺激になる場合がある。 という事です。

VBでも良いようですが、VBよりDelphiの方がC++につながり易いようです。
717デフォルトの名無しさん:01/10/17 10:05
C++の学習コース

・オライリー等のC++入門本で文法を学ぶ
・EffectiveC++で言語の詳細を学ぶ
・できればMoreEffectiveも読んでみる
・憂鬱なプログラマの為のオブジェクト指向入門を読む
・できればEffectiveで復習
・できればSTLのソースを眺めてみる
・最低3回はC++でなにかしら作り、クラス設計で苦労してみる。
・オブジェクト指向における再利用のためのデザインパターンを読む
・上記本の続編、パターン言語を読む

デザパタ本は一つ二つは使った事のあるパターンが無いと理解できん。
自分の経験を体系化、客観化する為のものと言っても過言ではないので。
あとはマニアック街道を直走ってくれ。
718717:01/10/17 10:13
補足。
人にもよるが、まともに設計した事ない人は
>>・最低3回はC++でなにかしら作り、クラス設計で苦労してみる。
ここが辛いはず。
オブジェクト指向なんてなんの役に立つんだといいだすのはこの辺。
で、次のステップで数少ない成功パターンがデザパタ本に列挙されてて
涙が出る。という寸法。
>>717 それはC初心者向けコースみたいに思う

Cに慣れた人は、文法とか表面を追いかけすぎてしまうんだと思う
似てるから、追加された :: とか virtual さえ理解したらいい筈と錯覚して
しまうんだと思う
720717:01/10/17 10:27
>>719
構造化を踏まえた上でオブジェクト指向に移行するのは大変難しい。
構造化の土台も無いと次のステップには進めないから。
表面を追いかけて本質を理解し難いとしたら、
それはもともとそういうやり方しかやってこなかったという場合があるから
構造化からやり直したほうが良いかもしれない。
というか設計をまともにやるプログラマは減ったような気がするよ・・
721719:01/10/17 10:49
いや C初心者って書き方は悪かった。
 Cなんて2ヶ月もやれば熟練した人以上のコード書く人もいるんだからね

 ”Cだけで5年も10年もやってない人” て替えてくれ
722719:01/10/17 11:08
C言語が高級アセンブラって言われているように
 MS/DOSとかでC言語に入って仕事やってた人は、
 ハードを直接叩いていたんだと思う

 表示とかも、線1本を描くのにDDAのルーチン書く所から
やってたんじゃないかな?

 そういうローレベルな所から全部見渡してコードを書く
スタイルだけで熟練してしまうと、 STL/MFCのような高機能
なライブラリが 既にある って状態が逆に障害になるんじゃ
ないかと思う。
 STLを見ても、マニュアル使い方の部分だけじゃ満足出来ず
に、つい中身を追いかけてしまう。 で、なまじCが読めるもん
だから部分的に理解出来てしまう。 でも職業人だからコスト
意識もあって、こんな事してちゃ新人にも劣るという自戒から
途中で投げてしまう。

 って感じなんじゃないかな?

だから、本とかで勉強すると余計に泥沼に入ってしまう。
 VBやDelphiを経由するってのは、 中身を追いかけない
スタイルを身に付けるって事じゃないかと
722がいいこと言った
724落ちこぼれ:01/10/17 11:35
仰る通りで、ライブラリも何も無い状態でデバッガなどが
追えない領域で、フルスクラッチからソフトなりモジュールを
起こすことは多かったです。
(線一本から...は図星でして(藁Bresenhamのアルゴリズムなんてのにもお世話になりました)

ただ、既にある、という状態は別に障害とは思わずにありがたいとは思えるんです。
VBは昔から時々使ってました。(あれはテストでWinのインターフェースが欲しい!と急に
言われたときに便利です)

文章じゃなかなか表現できないんですが、いくつかC++で書いた自分の
プログラムが自分で眺めて「うーーん??」なのです。
なんとも表現しにくいのですが、Cを使えるようになったときの明確な
達成感とはなにか異質で、自分が本当にこの言語のいい部分を使って書けてるの
かなと疑念が付きまとっているというか。

デザインパターンの本、読んでみようと思います。紹介して下さったかた有難う御座います。
725デフォルトの名無しさん:01/10/17 16:42
結論:
VC++ばっかりやってると馬鹿になる
男は黙ってC言語とアセンブリ
726デフォルトの名無しさん:01/10/17 17:34
>>725
かってにやってろ。
727名無しさん:01/10/17 18:03
まあ
いろいろやってみようや。
趣味でならやる
仕事で人生すり潰されるのはタマラン
>>728
すりつぶされて困るようなたいした人生送ってないだろ
>>729
そういうホントのことはいくら2chでも慎むべきです
>>725
(ショウユ)って漢字で書ける?
>>731

正油(藁
733デフォルトの名無しさん:01/10/21 01:45
プログラミング言語C++3版 282ページの下の方に書いてある

コンストラクタで初期設定される

ってところがわかりません。
手元にこの本がある善意ある人、是非無知者を啓蒙してください。
>>733
手元にないからわかんないけど、誤植多いからWebで誤植の
訂正一覧を先に見た方がいいぞ。
cache* cの指す実体が省略されてるコンストラクタ内で初期設定されてる、
つーだけの話だと思うが違うの?
736デフォルトの名無しさん:01/10/21 07:44
OOPやり始めました

間違えました

Oops.
737デフォルトの名無しさん:01/10/21 08:44
>>736
Chestを開ける前にthiefでチェックするかpriestの魔法で罠を解きましょう。
入門中の者です。>>696 で聞いてる人がいましたが、
私もいまいち参照がピンと来てません。使い方はわかった
つもりですが、引数で非const渡しを出来る様にしてある
メリットがわかりません。これはどういう時に使う物なん
でしょうか?
あまり使われない物だとすると、コーディング規約レベルで
「参照引数は const 限定」とかしないと、混乱の元の様な気が
するんですが、皆さん実務レベルでどの様に扱われているか興味
があります。
739デフォルトの名無しさん:01/10/21 23:46
そうですねー。
非constオブジェクトへのconstなポインタを渡したい場合、たとえば

void f(int* const ptr) { *ptrを変更... }

は、ポインタじゃなくて参照で書いてます。

void f(int& ref) { refを変更... }
他のオブジェクトに依存しているが、更新するつもりはさらさら無い場合に
constによる参照渡しを使うな。

そういう場合、参照渡しじゃなかったらコピーを作らなきゃいかんだろ。
メモリとCPUの無駄遣いだ。
741デフォルトの名無しさん:01/10/21 23:57
文字列操作とかのときを除いて全部参照つかってるんだけど、いかんかな?
742デフォルトの名無しさん:01/10/22 00:02
良いんじゃないの?
メモリリーク対策等を考えれば
最終的にはポインタなんかもスマートポインタ系でラッピングしちゃうから
参照か実値渡しだけになってくるし。
743デフォルトの名無しさん:01/10/22 00:24
const参照渡しは、文脈から言って適切であると思われるときは
積極的に使うべきと思われ
ってかCでもそうなんじゃない?
memcpy(void* dst, const void* src, size);
みたいな感じで
744738:01/10/22 00:27
>>739
レス有難うございます。
でも、そういう風に書けるメリットがわからなかったんですね、これが。
なんというか、呼び出し側のコードで挙動がつかみにくくなる感じが・・・

って、書いてて思いました。オーバーロードや仮想関数で抽象化を進める
為の言語なんだから、部分的に取り出してみたら挙動がつかみにくく
(確定的で無くなる)のは当たり前。より自然に扱えるクラス群を定義
する事に注力するべし。

・・・って感じですかね?
みんなわかってると思うが、738は
「非const参照渡しをどんなとき使ってんのか聞かせてくり」
いうとんのやで。
746738:01/10/22 00:30
>>740 743
あ、あの・・・私が疑問に思ったのは「非」const の参照渡し
です。
747745:01/10/22 00:32
うがー本人だ。余計なこと書いてスマソ。消える。
748738:01/10/22 00:35
>>747
あ、いえ、フォロー有難うございます。
元の書き方が紛らわしかったですね。
「参照渡しの仕様が const に限定されていないけど、
const 以外で使うメリットはあるの?」
っていう事だったんです。すいません>all
749デフォルトの名無しさん:01/10/22 00:46
>>746
オブジェクトのコピーではなく、オブジェクトそのものを渡したいとき。C で非 const の
ポインタ渡しを使う場面で、代わりに参照渡しを使うことがある。参照はあくまで実体が
別にあり、その実体への別名であることがポインタとの違い。

- NULL ポインタのように「何も指していない」ことはありえない。
- ポインタ演算が使えない。
- 値は参照作成時に固定され、以後、代入などの操作は行えない。
750738:01/10/22 01:15
>>749
なるほど、「実体の保証」はメリットになる場合がありますね。
かなり納得です。

また勉強を進めて、わからなかったら質問させて頂きます。
ありがとうございました。
751無名参照引数:01/10/22 08:02
>>750
- 値は参照作成時に固定され、以後、代入などの操作は行えない。
もうれしいべ? type見るだけで、code見る必要ないべさ。
752デフォルトの名無しさん:01/10/22 14:14
実体の保証というけどさー、EffectiveC++にも
「仮引数 T& に、実引数 *(T*)NULL を渡すやつ逝ってよし」
みたいなこと書いてあったでしょ。実体保証はあくまでも紳士協定というか。
そのへんの不正な引数の可能性には普通どう対処するんですか。
特にクラスライブラリ作ってるような人に聞いてみたい。
>>752
OSによる不正終了。
754752:01/10/22 16:16
>>753
752は今、無上の悟りを得た!
>>752
対処しない
756752:01/10/22 19:00
>>755
だから753でわかったてばよー。俺が過剰な気にしんぼだったんだよ。
デモアリガトネ
757デフォルトの名無しさん:01/10/22 23:04
ねえねえ、C++では
hoge++;
よりも
++hoge;
のほうが速いって知ってました? もしかして一般常識?ヒエー
>>757 そんなら++Cを使いましょう。
環境と最適化依存。
君のクソコードじゃどっちで書こうが大差ない。
VC5SP3でポストインクリメントの一時オブジェクトが最適化されないのは
確認してあるが、他の環境はどうなのだ?
-Oxのみでそうなる?
762760:01/10/22 23:37
C++ FAQに載ってたサンプルコード、
{
  Number n;
  cout << "++n: "; ++n; cout << "\n";
  cout << "n++: "; n++; cout << "\n";
}
で、出力が本と同じように、

++n: increment
n++; copy increment copy dtor dtor
dtor

になる(dtorはデストラクタ実行)。
もちろんReleaseビルドで最適化オプション入れてあるよ。
763デフォルト名無しさん:01/10/22 23:40
コボルよりかは100倍楽
764デフォルトの名無しさん:01/10/23 02:03
プログラミング言語C++11.3.1(p320)で
operator+を非メンバ演算子としている理由はなんですか。
ストラウストラップさんは
出来るだけクラスの中にきれいに収めろとほかの場所で
薦めていたと思うのですが。
試しに非メンバ演算子使わないで
汎用的に+使えるようにしてみ
766738:01/10/23 02:37
>>752
・言語仕様的に「実体の保証を要求している」
と言う方がより良い感じかもしれないですね。

で、「実体の別名」であるわけですから、
& 演算子使えばポインタは取れるわけで、
ライブラリ等でチェックしようと思えば出来
ますよね?
(constの場合は、ライブラリ側のビルドは
 constを外した定義で行うとか・・・)
767デフォルトの名無しさん:01/10/23 03:31
>>765
やってみました。
非メンバ演算子関数の方がエレガントに出来る、
というだけのことなのでしょうか?
768デフォルトの名無しさん:01/10/23 03:37
>>767
違います。非メンバでないと実現できない機能があります。
キーワードは「暗黙変換」「左辺」。考えてみてください。
769デフォルトの名無しさん:01/10/23 15:03
>>768
左辺がユーザ定義型でないと
処理が出来ないと言うことですか?

1 + class;
見たいな処理が。
770デフォルトの名無しさん:01/11/04 23:51
このスレ延々と続いてるけど,関数オブジェクトの話って全く出ないね...
Cの関数ポインタなんて使い物にならんのでC++使ってんだけど,
関数オブジェクト使ってる人って少数派?
>関数オブジェクト
なにそれ?
772デフォルトの名無しさん:01/11/05 00:40
>>771
operator () をオーバーロードしたクラスをテンプレートで使うことかな。
773新手のC++使い:01/11/05 02:00
>>772

使ったことありますよ。
関数ポインタと違って、受け取る側で、別途 void ポインタとかを
引数で受け取らなくていいのが Good !
なんせ、オブジェクト内に仕込めるからね。
774デフォルトの名無しさん:01/11/05 11:43
結局、みなヌルポインタに0とNULL、どっちを使ってるですか?
0でしょ。
776デフォルトの名無しさん:01/11/05 12:52
NULLはCの規格だしね。
7771000!:01/11/05 15:31
1000!
778デフォルトの名無しさん:01/11/09 14:36
関数オブジェクト知らんヤツはCoplienのイディオム本読め。
ファンクターについて研究しろ。
それでも分らんかったら、オレが教えたる。
ただし、ティンポ臭くないヤツだけな。
779デフォルトの名無しさん:01/11/20 12:21
なるほど。0なんですか。
私は NULL。

>>776
別スレでも書いたけど NULL は C++ でも null pointer constant と規定されてます。
>>780
それってCとの互換性という意味しかないですよね?
>>781
意図が良くわかりませんが、私が 0 ではなく NULL を使うのは「null pointer constant を意図して
書いているのだ」とソースコードを見て分かるようにです。もちろん文法的にはどっちでも OK。

class だけでなく struct が使えるとか、NULL と同じ <cstddef> で定義されている size_t 型、ついで
に sizeof, offsetoff なんかも「C との互換性」という意味しかないっちゃあ無いですね。C++ ならメモ
リ確保するのに malloc + sizeof ではなく new で一発なわけだし。
783781:01/11/21 08:47
>>782
C++ではnull pointer constantって必ず0じゃないですか。
だからポインタ変数に0が代入されてるとnull pointer constantってわかりますよね?
ポインタ変数以外にnull pointer constantを使うこともないですよね?
それで、NULLを使うのはCのコードとの互換性と、Cに慣れてる人がコードを
読み書きしやすいって以外に利点はあるのかなと思って。

NULLって別に定数でもなんでもないただの0ですよね?
数字の1とか2を使う変わりに
#define INT_1 1
#define INT_2 2
ってしたほうがint型の1や2を意図してるとは思わないですし…

size_tとかsizeofのかわりに何を使えばいいのかは良くわかりませんが。
>>783
その1や2がintなのかlongなのかなんてのはどうでもいい話であって、
それが例えば
#define MODE_MASTER 1
#define MODE_SLAVE 2
になっていたら、”モードがマスターである”という意味の1であるという
ことが重要なわけだ。実際にはこのMODE_MASTERは102だろうが8848
だろうがなんでもよくて、ただ一意であることのみが求められる。
同様にNULLも定数0というのは別にどうでもよくて、それがnullポインタ
であるということが重要であり、示されるべき意味なわけ。
785781:01/11/21 11:44
>>784
なんでどうでもいいのかわからない。
数字を見ただけじゃ型はわからないですよ。

例が悪かったかも知れませんので、
#define INT_0 0
の場合を考えてみて下さい。

このマクロがないと0が出てきた時に数字の0であると判断できませんよ。
NULLを使う利点がCで使ってたという歴史的理由以外にあったら教えて下さい。
(ここでは、歴史的理由とはプログラムの互換性やプログラマがNULLを
nullポインタだと知っているということなどを意味します)

NULLとは何か?
ポインタのコンテキストで使えばnullポインタ。
それ以外の場所で使えば、単なる整数リテラル0。

0とは何か?
ポインタのコンテキストで使えばnullポインタ。
それ以外の場所で使えば、単なる整数リテラル0。
>>786
まさしくその"ポインタのコンテキスト"として使用していることを
明示するためにNULLがある。
明示すること自体が目的なの?
それって意味ある?
正しく使ってるかどうかはプログラマの責任でしょ?
誰に対して明示してるの?
C言語を使いなれたプログラマだったりしない?
intのコンテキストを明示するINT_1はどうでもいいって言えるのはなぜ?
780ではないですが、NULL 賛成派なので、反論を試みる。

> それで、NULLを使うのはCのコードとの互換性と、Cに慣れてる人がコードを
> 読み書きしやすいって以外に利点はあるのかなと思って。

それ以外の利点なるものが必要なのか?
利点が1個、欠点が0個。
だったら使う方がいいに決まってる。
使わない理由は何だ?

> 例が悪かったかも知れませんので、
> #define INT_0 0
> の場合を考えてみて下さい。
>
> このマクロがないと0が出てきた時に数字の0であると判断できませんよ。

それはまったくもってそのとおり。今後気を付けましょう。
int(0) とか書けば良いですね。

> NULLとは何か?
> ポインタのコンテキストで使えばnullポインタ。
> それ以外の場所で使えば、単なる整数リテラル0。

事実としてはそうだけど、混乱の元なので
それ以外の場所で使わないで欲しいです。
貴方も使わないでしょう。

> 0とは何か?
> ポインタのコンテキストで使えばnullポインタ。
> それ以外の場所で使えば、単なる整数リテラル0。

そのとおりですが、
私はポインタのコンテキストでは 0 とは書かず、
必ず NULL と書くようにしています。
続き。

> intのコンテキストを明示するINT_1はどうでもいいって言えるのはなぜ?

1 と書けば間違いなく int です。
long だったら1L だし、
unsigned だったら 1u だし、
char だったら '\x01' です。
1 と書けば間違いなく int です。

しかし 0 は、それだけだと int の 0 か
NULL ポインタ定数か判断できない(可能性がある)。

> 明示すること自体が目的なの?

Yes

> 誰に対して明示してるの?

自分。
チーム開発なら、他のメンバーに対して。
オープンソースにしてるなら、不特定多数に対しても。

> それって意味ある?
> 正しく使ってるかどうかはプログラマの責任でしょ?

意味はある。
正しく使うことはプログラマの責任だが、
後にこれを読む他人(数ヶ月後の自分を含む)の理解を助ける。

読みにくいより読みやすい方がいいに決まってるから使う。
どこか間違ってます?

#もしかすると貴方には読みやすいソースを書くべきという
#心掛けがないのかもしれない。だったら議論は無意味。
>>783
細かい突っ込みだが C++ の null pointer constant は 0L の可能性もある。
>>788
> intのコンテキストを明示するINT_1はどうでもいいって言えるのはなぜ?
int の 1 なら 1 で良いから。

そうではなく、別の意味を持つ 1 なら enum なんかで名前を与えるべき。直接マジックナンバーの 1 を
使うのはお勧めできない。
INT_1の例はちょっと失敗だったかなぁ。
Cには1の実体を表す表現は1しかないから1を1として使ってるでしょ?
同様にnullポインタを表す表現は0しかないじゃないですか。

ちなみに僕は欠点は二つあると考えてます。
一つは、文字が長いこと。タイプ量とかソースの複雑さの意味で。
もう一つは、正しく使われてることを検証できないこと。
これはNULLに限らずマクロ一般に言えますが、
プログラムが正しく動作していてもNULLが正しく使われているとは限りません。
これは読みやすさを損なう原因になると思います。

ソースを読む時のことを考えると、
0しか使わなければ、0が出現した時に整数かポインタか考えれば言いですが、
NULLを使っていれば、0が出現した時とNULLが出現した時に考えなくてはいけません。
これはほとんどただしいコンテキストで使われているときに
(つまりできるだけ正しく使おうと努力してる場合に)
もっともソースを読んでいる人を罠にひっかけやすくなります。

ちなみに別の意味を持つ1はここでは考えてません。
NULLも別の意味ではなくて0の本来の意味をあらわすのに使われてますから。

1の整数リテラルとしての型もここでは意味がないと思います。
0もそれ自体がポインタ型ではありませんし。
>>793
> 一つは、文字が長いこと。タイプ量とかソースの複雑さの意味で。
それは、変数名も a, b, c とか一文字にしたほうが良い、ということですか?
>>794
新しく名前を導入する時の話しじゃないですよ?
すでにある二つの名前のうちどちらを選ぶかですので、
もし、
int a;
#define tmp_int_a a
と宣言してあったら、僕はaの方を使います。
>>795
#define F_ERROR 0
#define F_READ 1
#define F_WRITE 2
#define F_EXCLUSIVE 4

File f;
f.open("foo.txt", F_READ | F_EXCLUSIVE);

よりも

f.open("foo.txt", 5);

の方が妥当というわけですね。
NULL 派だけど、ここでこれ以上議論しても得るものは無いと思うので、わたしは引くよ。

>>788
もしコーディングスタイルに関する議論に興味があるなら、Microsoft Press から出ている「コードコンプ
リート」、「ライティングソリッドコード」、それに ASCII から出ている「プログラミング作法」といった書籍を
読んでみることを勧めておきます。
>>797
それはその通りですね。
もっとも、僕はそもそも何かが得られるとは思ってませんでしたが。
ただNULLを(void*)0でなく厳密に0または0Lだと定義しているのは
C++ではNULLを使うことを推奨してないと僕は思ってます。

>>796
以前の書き込みをちゃんと読んでもらえるとわかりますが、
他の意味を持つ場合について議論しているわけではありません。
またconstant foldingを手でやることも主張していません。
799デフォルトの名無しさん:01/11/22 01:48
>>798
> ただNULLを(void*)0でなく厳密に0または0Lだと定義しているのは
> C++ではNULLを使うことを推奨してないと僕は思ってます。
どうなんだろうね。規格書は手元にあるけど、これには「なぜそうなったのか」ということは書いてないから
分からんね。

経緯に詳しい人がいたら、なぜ C++ で (void *) から (Foo *) への暗黙の型変換を禁止したのか、理由
を聞いてみたい気がする。
C++が難しい理由。
階級制度を確立するため。
C++プログラマ>>その他のプログラマ>>>>>エンドユーザ
801デフォルトの名無しさん:01/11/22 02:09
俺はNULL使ってますが、

>0しか使わなければ、0が出現した時に整数かポインタか考えれば言いですが、
>NULLを使っていれば、0が出現した時とNULLが出現した時に考えなくてはいけません。

なんか妙な印象を受けました。
0と書かれてた方が、考える手間が発生すると思いますがいかが?

NULLの中身が0だと知ってさえいれば、「値かポインタか」を考える必要はないので、
一体全体、NULLと書くと何を悩むのか疑問です。

ptr = 0;とかかれてたときにこそ悩みます。値を意図したのか、ポインタを意図したのか。

知っていれば悩まないものは知識の問題ですが、
知っていても悩むものは知恵の問題です。

ポインタに0を代入したり、値にNULLを入れていた場合、
それはコーディング規約違反に相当しますね。うちの場合は。
止むに止まれぬ事情でそうしないとならない場合は、コメントつける必要すらあります。
これは使用者のレベルを問うのではなく、ルールだと思うんですが。

0やNULLの使い方に一貫性を持たせられないようなレベルの人は、
もっとしっかり教育したほうがよいと思います。
802デフォルトの名無しさん:01/11/22 02:12
>NULLの中身が0だと知ってさえいれば
この仮定ができない。
803801:01/11/22 02:12
そこはルール化すべきだと言ってるのです。
804デフォルトの名無しさん:01/11/22 02:14
> そこはルール化すべきだと言ってるのです。
だったらcstdioのマクロもってくる必要なんてないだろ。
#define NIL 0
かなんかを定義してソレ使うってコーディング規約にする
とかいう話であれば、801の話はその通りだと思うよ。
ほほぅ
これが噂の宗教戦争ですか
801 じゃないけど、
>>804
何に反論してるのか、自分の立場はどうなのかを明記して欲しいな。名無しさんだと、誰が誰だか分からん。
>>805
Yes. でも、たまに有用な方向に議論が転がることもあるので、敢えて止める必要はなし。
808デフォルトの名無しさん:01/11/22 02:18
時々見かけますが、
決められてないからといって、そこには「あらゆる可能性がある」なんて
一種杓子定規な考え方をしてる人は、実務上では大変困ります。

決められてないところは、使っているこちら側が一般的な範囲でルール化
して差し支えないと思いますよ。

NULL == 0 が絶対ではないとして、
一般的に NULL != 0 の可能性を論じる意義ってあるんですか?
その職場、その開発環境で
「NULL = 0 もしくは NULL = (void *)0 と決めましょう。」
と話し合って文書化するだけのことではないの?

NULL = 100 にしましょうなんて言いだすやつ、見たことないですよ。僕は。
>>808
話のつながりが見えないのですが、あなたは誰ですか?

> NULL = 100 にしましょうなんて言いだすやつ、見たことないですよ。
確かに、そんな間抜けなことを言ったのは「電子のお針箱」ぐらいですな。
>>809
お針箱たん…ハァハァ
ワラタ
8110を使って玄人気分:01/11/22 02:25
つーか最初から予約語nil入れときゃ良かったんだよ
812804:01/11/22 02:32
自明とも思えるつまらん主張をわざわざ書くの面倒なんだけど、、
>>804

・C++ではヌルポインタの表現は単に 0 とするのが良い。
・cstdioの NULL が全プラットフォームで 0 とdefineされているという仮定はできない
・数値の0とヌルポインタが区別できないとソースコードが読みにくいという意見がある(俺はとくに感じないが..)

以上から、#define NIL 0 して、ヌルポインタの表現にコレつかうのが
妥当な妥協点なんじゃネーノ?という意見なんだけど。

・NULLを使う為だけに #include <cstdio> なんて書きたくない

というのもあるけど宗教なんちゃらになるからやめとく。
おいらは 0 派なんだけど(ソースを grep NULL して出てこなかった)
困りそうなのは Foo( int c); Foo( object * p); かな
後者を呼ぶときは意図的に Foo( (object*)0);
なんてしてる。これって正しいのかな。

NULL は…大文字っていうのと(4つ続けて大文字ってのは打ちづらい)
見た目がなんとなく嫌(ワラ。あと定義がごちゃごちゃしてて面倒だから。
0 なんてワンキーですから。
NULLは0です。
そうで無いとこれまでに作ったものが動かなくなります。
815804:01/11/22 02:37
>「NULL = 0 もしくは NULL = (void *)0 と決めましょう。」
>と話し合って文書化するだけのことではないの?
NULLの定義は決めるものでなく与えられるものです。
まあ、動くからいいじゃん。NULLでも0でも。
プログラムなんて工業製品なんだよ。数理ではない。
>>813
C++ だと NULL は 0, 0L が一般的だから、

 Foo(NULL);

は Foo(int) 呼び出しになる。これは NULL 使う場合には要注意な点。

というかポインタと整数型で多重定義するのはやめとけ、というのが Effective C++ のアドバイス。

>>812
細かい点だが NULL だけなら <cstddef> の方が。こいつは size_t なんかも定義してるから、なんだ
かんだで読み込んでることが多いな、俺の場合。
818デフォルトの名無しさん:01/11/22 02:40
・NULLの内容を仮定できないって言われても、実際0でないNULLに出逢ったことは無いんだが。
・見ただけでポインタと値くらいは区別できたほうがいいと思うんだけどねぇ。(書いた人の意図を知る意味でも)

実務上問題の無い可能性を恐れて、0を書くってのはどーも・・・・。
>>812
> ・C++ではヌルポインタの表現は単に 0 とするのが良い。
これは、今のところ客観的な理由が示されてない気がする。

C++ の規格書では NULL は C++ null pointer constant と明記されてるから、NULL と書いて問題が
発生することはない。逆に 0 と書いて問題が発生することもないけど。
820デフォルトの名無しさん:01/11/22 02:43
if(!p)はif(p==NULL)にしないと駄目?
>>820
それは別の問題だから、今持ち込むのはやめといた方が。
#define 0 NULL
823813:01/11/22 02:50
>>817
なるほどです。NULL := 0 では意図したのと違うことになりますね。

>というかポインタと整数型で多重定義するのはやめとけ、というのが
そうですね。NULLな人にはちょっと不味いことになりますね。
(object *)NULL なんてのはちょっと…あれですし。
824デフォルトの名無しさん:01/11/22 02:50
>>822 ありがと、少しだけ藁たよ。
825デフォルトの名無しさん:01/11/22 02:54
(object *)NULL これはこれでよいと思う。
(void *)NULL これは面白くないけどね。
下らない事で、良くそれだけ話せますね。
>>820
if( p == 0 ) でもイイと思う
if( p != NULL ) は単に if( p ) と書けます
fjに帰れ
>>826
ま、プログラミング言語なんて、くだらない詳細に満ちた道具だからね ;) 特に C++ は、ある程度
詳細を押さえないと、そこらじゅうに口を広げて待っている落とし穴に飲み込まれる。
830デフォルトの名無しさん:01/11/22 02:56
数値計算するならC++のほうが便利だよ。
831デフォルトの名無しさん:01/11/22 02:57
つまり、
NULL を (void *)0 にしなかった誰かが一番悪いということに・・・・。
829 は有意義な議論と見せかけるのに必死だ(藁)
833820:01/11/22 02:59
>>827
たとえばmallocの戻り値って失敗するとNULLになるけど、
NULLが0じゃないとif(!p)は使えないんだよね?
で、NULLが10とかだと困らない?
834デフォルトの名無しさん:01/11/22 02:59
こういうくだらない議論でも、見てる初心者の役に立つことはあるから、
あながち無益という訳でもなかろう。>>826
835デフォルトの名無しさん:01/11/22 03:00
#define NULL ((void*)0)

ならば

char* p = NULL;

って書けないから

char* p = 0;

になるね。
といって

#define NULL 0

だと 817 氏が言うような問題がある。
>>831
いや、C++ だと (void *) から他のポインタ型への暗黙の変換を認めていないから (void *)0 だと
実用上辛すぎ。

>>832
煽りご苦労。
>>825
安全にするには NULL 派でも 0 派でも
(object *) のキャストをつけるべき、ということなんですね。
このほうが意味合いがはっきりしますし。
>>836
ていうか暗黙の型変換を容認できなかったからNULLを(void *)0と
定義できなかったんじゃないかって気もするが。
839デフォルトの名無しさん:01/11/22 03:04
ってことで、ぼちぼち議論が一周したね。
>>836
ごめん本気で話してたのね(藁)
NULLはNULLって事で困ったことないから。
個人的には NULL を使わず 0 で書いてるなぁ。
キャストをいちいち書くのが面倒だから。
そもそも C++ 形式のキャストは書くのが面倒臭い・・・。
>>841
<reinterpret_cast> とか?
長いですよね。
>>833
規格上 null pointer value を評価したら偽になることが要請されているから、ANSI C++ 準拠の C++ 処理系
なら、ポインタ型の変数 p に対して

if (!p)
if (p == NULL)

は同じ結果になる。

> 4.12 Boolean conversions
> 1 An rvalue of arithmetic, enumeration, pointer, or pointer to member type can be converted to an rvalue of
> type bool. A zero value, null pointer value, or null member pointer value is converted to false; any
> other value is converted to true.
>>841
NULL を使うとキャスト必須だが、0 ならキャスト不要な処理系ってあるの?
>>841
キャストしてるのが、ソース上わかりやすくなるとか言う馬鹿がいたが、
Java並に目障りで、かえって見づらいんじゃ。
846デフォルトの名無しさん:01/11/22 03:13
>>817さんへ

0の場合もNULLの場合も、ポインタであることを明示するにはキャストしないとならないのだから、
結局多重定義のときは型変換噛ませるしかないよね。
void Foo(int);
void Foo(void *);

Foo(NULL)
Foo(0)

で呼ばれるのはFoo(int)だし。
つまり、何がいいたいかというと、

Foo((void *)NULL);
Foo((void *)0);
という渡し方をしたい場合は、必ずキャスト必須というのはC++では当たり前と
考えるべきじゃないかと。
よって、0とNULLの議論にはあまり関係ないと考える次第です。
>>845
どこに、そんなバカがいたんだ?

837 は見やすい/見にくいの話ではなく、そうしないと確実に「まずい」場合だから違うよね。
>>833
ポインタ演算で 0(NULL) が出てくると
null pointer として扱うルールなので
実際のnull pointerの値とは関係無いらしいです。
NULLが10になるとかいうことはないらしい。
849デフォルトの名無しさん:01/11/22 03:15
まず、ポインタ型変数 p があったときに、
p = 0;
としたあと、p のビットが全部 0 だとは限らないです。
>>844
gcc 使ってるけど 0 なら通るよ。
851817:01/11/22 03:15
>>846
念のため。私は NULL 使う人です。

> よって、0とNULLの議論にはあまり関係ないと考える次第です。
同意。
>>850
NULL だと通らないの?
>>847
C++の記述形式についての話に決まってんだろ。
854デフォルトの名無しさん:01/11/22 03:18
>>852
#define NULL ((void*)0) なら通らない。
>>853
正直、「キャストしてるのが、ソース上わかりやすくなるとか言う馬鹿」が、どの発言を指しているのか
分からないです。そんな怒らんで、マターリ行って欲しいんだが、ダメ?
856820:01/11/22 03:22
>規格上 null pointer value を評価したら
>偽になることが要請されている
なんとっ

>それは別の問題だから
やっと意味がわかりました。
>>854
それは明確に ANSI C++ の規格に反してる。昔の処理系ならともかく、今時の処理系で

#define NULL ((void*)0)

はないでしょ。
858デフォルトの名無しさん:01/11/22 03:27
>>857
windows.h とかその辺でそう宣言しちゃってるからなぁ。
>>855
つまりね、841の
>そもそも C++ 形式のキャストは書くのが面倒臭い・・・。
とあるでしょ。それで、C++のキャストの記述形式を、
>キャストしてるのが、ソース上わかりやすくなる
と肯定してる人がいたわけよ。で、あんな回りくどい記述は、
>Java並に目障りで、かえって見づらいんじゃ。
と言ったのよ。
宣言じゃないか。
sage
これだな。
> 4.10 Pointer conversions
> A null pointer constant is an integral constant expression rvalue of integer type that evaluates to
> zero. (後略)

だから C++ だと NULL は 0, 0L とマクロ定義されていることはあっても (void*)0 と定義されていることは
ありえない。
>>859
詳しい説明、ありがとう。納得しました。

C++ で static_cast, reinterpret_cast, const_cast を分けたのは英断だと思うけど、文法はもう少し
どうにかして欲しいですね、確かに。
863デフォルトの名無しさん:01/11/22 03:32
結局のとこ、月並みなお話として、null pointerを

・NULLと書いてポインタを意識していることを明示する
・0と書いて紛れもなく0であることを明示する

なのかな。お互いの反論要素として、
・NULL != 0 でない可能性は論じるだけ無意味。
・NULLは定義がポインタじゃないから、多重定義の関数で解釈が int になるのは気持ち悪いが、
 どっちみちキャストする以外に直値のポインタを渡す手は無いので、問題なし。

ということで、どちらの反論もやっぱり無意味とくらぁ。

>>854じゃないけど
別に
#define NULL ((void*)0)
にすべきだと言ってるわけじゃないと思うよ。>>857
864デフォルトの名無しさん:01/11/22 03:33
修正
×・NULL != 0 でない可能性は論じるだけ無意味。
○・NULL == 0 でない可能性は論じるだけ無意味。
>>858
うそーん。#ifdef __cplusplus で場合分けしてない? VC6 の <stdio.h> は、こうなってるよ。

#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
>>865
あら?そうなってる?
今手元に gcc しかないから分からない(笑)
VC2 ぐらいを使ってたときにそれで文句を言われたような記憶があって
それ以来 0 を使うようにしてるだけなんだけどね。
NULL で OK ならそっち使おっと♪
windows.hからincludeされてるwindef.hでは

#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif

ってなってるね。(VC6.0)
reinterpret_castとか書くのが面倒くさいとかいってる連中はStroustrupの
本を読んでいないことがばれて恥ずかしー立場に置かれている。
ってかカット&ペーストの利用できない環境でプログラミングしてるんじゃ
ないだろうな?
>>866
最近の gcc だと __null 使ってるよね。

__null はマクロではなくコンパイラが直に理解する null pointer constant で、

int *p = __null;  // OK
int n = __null;  // NG

となる(任意のポインタ型に対する null pointer constant として使える一方で、整数型として評価すると
怒られる)。

個人的には、次の C++ 標準規格に入って欲しい機能の筆頭です。
870デフォルトの名無しさん:01/11/22 03:46
宣言と定義の違いって何ですか?
>>868
プログラミング言語C++の話?そういうこと書いてあるの?
コピペでどうにかできるもんじゃないと思うけどなぁ。
>>870
ネタ? 本気で質問したいなら、質問スレに行ったほうが良いと思うぞ。

extern int n;  // 宣言
int n;  // 定義
>>868
あんまりかまいたくないタイプだが、ソースは読みやすいほうがいいだろ
本読んでるぜとか、読んでないだろとか、機能がどうとかじゃない
C++のキャスト書くと、1行でおさまらなくなる場合が多い
874デフォルトの名無しさん:01/11/22 03:51
>>869 あ、そんなのあるんだ。知らなかった。
俺も次のC++には入れて欲しいと思う。
boolやtrue,falseもC++標準に入れたんだから、この際徹底的にやって欲しいね。
その場合、単に null がいいなぁ。
>>874
激同。
でも C++ 自体いつまでメインストリームに残り続けるのかちょっと不安。
>>868
C++ で

- キャストの文法を変更して、簡単にキャストと分かる(grep できる)ようにした
- キャストを用途別に分けた

ことに対して文句を言っている人は、このスレでは見かけない。ただ reinterpret_cast<Foo*>(p) という
表記は長すぎて読みにくい、と見た目について文句を言ってる。
877デフォルトの名無しさん:01/11/22 04:04
>>873 >>876
見た目が汚い風にわざとした、ってStroustrupの本に書いてあるだろがよ(w
なんかムキになられるとこっちが恥ずかしいぞ。
つまり無闇に使うなってこと>reinterpret_cast
Cスタイル文字列と同じで推奨されてないつーこった
>>877
まぁまぁ、そう煽るなよ。

> つまり無闇に使うなってこと>reinterpret_cast
Win32 API 使ってプログラミングしてると、どーしても必要になるし。
>>877
dynamic_castだって、たいしてかわらんだろ。
自分で書いてて、目障りじゃないのか?
880デフォルトの名無しさん:01/11/22 04:11
>>877

実務上はかなり頻繁にキャスト必要だし、
理想と現実のギャップってことで納得しようよ。

「自分のライブラリ内では、限りなくキャストは少なくてすむようにする」
これが精一杯だよね普通。
881デフォルトの名無しさん:01/11/22 04:13
C++って何て読むの?
Cスタイルキャストで書いてしまう漏れはダメですか。
>>881
しーぷらぷら
しーぷらすぷらす

外人はちゃんと しーぷらすぷらす と読んでいるらしい。
884デフォルトの名無しさん:01/11/22 04:15
>>879
危険でバグの温床になる、っていうわかるのでむしろありが
たいね>目障り
要するに、Cのキャストと比較するから目障りっていうんだろ。
それともObjectからみんな派生してるJavaか?
プログラマに制約を押し付けるデザインは最近のトレンドだと思うよ。
>>881
#ifdef __cplusplus
>>884
まあいいんじゃない。本に書いてあるとおり、ありがたいなら。
俺はソースがわかりにくくなってやだね。
887デフォルトの名無しさん:01/11/22 04:20
>>886
じゃあわかりにくくないためにはどうすればいいわけ? ベストな提案をだしてくれよ(w
>>884
後半は、ちょっと意味不明だな。前半は、同意するかどうかは別として、理解可能だけど。

何にせよ双方とも言いたいことは言ったと思うので、このあたりでキャストの見た目に関する話は
終わりにしないか? これ以上は議論しても得るところはなさそうだし。
889ルビ厨:01/11/22 04:21
>>887
Rubyで書き直す!!!!!
>>888
なんだ、自分で祭りを終わらせるのかよ(w
>>887
今の記述形式が良いか悪いかの話。あんたは良いんだから問題ないだろ。
>>890
ん、誰かと勘違いしてる? 俺は NULL 論議で満足したので、キャストの方は不参加だ。
>>890
私もいますが?
C/C++については変数のサイズの方が気に掛かる。
符号付整数のシフトとかも。
ばしっと決めてもらえないものか。
俺もいるが(藁)
って、これじゃ自作自演だ。
896デフォルトの名無しさん:01/11/22 04:28
ちなみに俺も居るよ。

int のサイズが環境ごとに不定だから、いつまでもキャストと縁が切れないのは、
俺たちの不幸を象徴しているように思うのだった。
>>891
いや問題あるよ。もっと良い代替案があるなら寝る前に是非聞いてみたい。
reinterpret_castが目障り、っていうならなんかいい代わりの形式でも
あるのかと期待しちゃって眠れないよ。

>>892
ハズカシー仕切屋さんだけどガンバレ!(・∀・)
>>897
そろそろ煽り厨房ってことで、放置かな。
>>884
C の考え方でいくと、少々危険なことでもプログラマの自由にする
(C language is Free) という考え方があって、しかも簡潔に
書けるので人気があるのですが
C++ の reinterpret は C の簡潔に(Make it Simple)
プログラマーを信頼する(Trust the programmer)という精神から
逸脱しすぎているような気がして少々残念かな。

C++ は C とは似てコトなるものですから、それが C++ の流儀って
いうなら仕方ないですけど。
ブロック転送で reinterpret_cast<const int *>(p++) ?? という
文章が数十個所でてくるのはちと目に痛いというか、キャストの主張が
大きすぎて何をしているのかわからなくなるというか。
900Kusakabe Youichi:01/11/22 04:34
> int のサイズが環境ごとに不定だから、いつまでもキャストと縁が切れない

サイズの保証された整数型を使えばいいだけでは?
(たとえば「必ず16bit」とか「少なくとも16bit」とか)

> 符号付整数のシフトとかも。 ばしっと決めてもらえないものか。

Javaみたいに「>>>」演算子があるといいっていう話でしょうか?
>>897
君には今のままが最適。安心して寝なさい。
902煽り厨房:01/11/22 04:36
>>899
インライン関数やテンプレートで軽減できないの? >数十個所
>>897
オヤスミン (生薬配合)
>>900-896
C99 あたりに int32 とかそんな予約語なかったですか?
定義しようという動きはあるみたいなんですけど。
>>900
さしあたってはそういうこと。<>>>演算子
あと演算の未定義が多いのもどうにかして欲しい。
906煽り厨房:01/11/22 04:42
>>899
どうかな、XPなんていい大人にペアプログラミングさせるくらい
なんだからそれくらいでプログラマーが信頼されてないと感じる
というのはもったいない話だ。
>>902
うーん。少しの作業で名前空間を汚すのがちょっと気がひけるというか。
>>905
1の補数と2の補数問題とかね。>演算の未定義
最近で1の補数使ってるチップってあるのかな?
909デフォルトの名無しさん:01/11/22 04:45
>サイズの保証された整数型を使えばいいだけでは?
>(たとえば「必ず16bit」とか「少なくとも16bit」とか)

そんなこと現実に出来るならやってごらんよ。
標準ライブラリがint使ってるってのに。

俺はこの問題が煩わしくて、自分のライブラリ内ではint使ってねぇもの。
>>908
他にも f() + g() * h() と書いてどの関数が最初に呼ばれるか、とか。
i = i ++; がどう評価されるかとか。
>>909
うちだと
VC(Pentium), unix(Pentium) 用に
 typedef unsigned int UINT32;
MS-DOS(i8086)用に
 typedef unsigned long UINT32;
あとは make のお仕事。
これで自分のルーチンには 32ビット整数が使えるけど
標準ライブラリは…キャストがうまくいくかチェックする
必要があって面倒です。
関数の評価順はまだしも
i = i++; みたいなのは書きたいと思ったこともないが…
>>912
i = i ++; は書きたいという話ではないよ。
未定義ならばエラーとしてはねるぐらいのことはしてもいいと思うわけ。
>>911
Win64になったらどうするんだ?
915Kusakabe Youichi:01/11/22 05:01
> int のサイズが環境ごとに不定だから、いつまでもキャストと縁が切れない

サイズの保証された整数型を使えばいいだけでは?
(たとえば「必ず16bit」とか「少なくとも16bit」とか)

> 符号付整数のシフトとかも。 ばしっと決めてもらえないものか。

Javaみたいに「>>>」演算子があるといいっていう話でしょうか?
>>914
Win64用のファイルが必要になります。
 typedef unsigned short int UINT32;
とか。面倒なので個人的には公式に定義してほしいものです。
int とは別に。
>>916
WindowsのUINT32そのまま使うのでは駄目な理由を教えて下さい。
918sage:01/11/22 05:57
>>917
最近のVCはUINT32(しかも同名?)があるの。知らなかった(ワラ
元々プラットホームの依存性を無くす方向で仕方なく取った方法なので
処理系が提供してくれるならそれに越したことは無いです。
ISOで定義してくれればそれで済むことなんですよね…。
uint32_t じゃダメですか?
C99 で stdint.h で定義されます。
920デフォルトの名無しさん:01/11/22 09:30
ゲームとか組み込みみたく、ハードに近いところで
組んでるわけじゃないからintのサイズを意識することなんて、
ほとんどないね。俺の場合。
(intが16bitの環境は無視ということで)
祭だったのか…。
922774:01/11/22 14:00
久しぶりに来たらなんか盛り上がってるなあ。
ひょっとして俺のせいですか?
923デフォルトの名無しさん:01/11/23 05:57
C++はムズイの〜
NULL4文字程度で読みづらいとか言ってたら

何にも出来やしないクソプログラマーという名を頂戴する羽目になるので

恥ずかしくて俺は言えない
925煽り厨房:01/11/23 07:05
>>918
え、知らなかったの... てっきりクロスプラットフォームを
意識した話か何かと思っていたんだけど...
PSDKのWindows Daya Types見ればDWORDやBYTEに並んでUINT64とかPOINTER_64とかあるよ。
Microsoft C++拡張の方では__int8, __int16, __int32, __int64もあるし
926デフォルトの名無しさん:01/11/23 07:09
何故C++をそんなに難しく考えるのか?
927918:01/11/23 08:04
>>919,925
無知ゆえ恥ずかしながら時代遅れなコトをしていました。
ISO等を見て古いヘッダ類はそろそろ捨てなきゃいけない…。

>uint32_t じゃダメですか?
ご指摘ありがとうございます。そちらにあわせようと思います。
それにしても…定義多いですね。int_fast32_t なんてのも…。
さしあたって処理系が stdint.h を持っていたらそれを使って
なかったら、自前のやつ…。

>てっきりクロスプラットフォームを意識した話か何かと思っていたんだけど...
クロスプラットフォームは意識しています。unix,win,MacOSを対象にした
コードは書いてます。
VC++ですでにUINTがあったのに、再定義しちゃったのは
かなり恥ずかしい(^^;
>>927
とはいえ C99 に準拠した処理系はまだ出回っていないので、当面は自前で typedef する
ことになるかと。(UNIX 系なら autoconf 使うと楽だが)
929デフォルトの名無しさん:01/11/23 18:46
age
930デフォルトの名無しさん:01/11/24 01:33
めざせ1000
931どうでもいいが:01/11/24 02:53
>>oll
引数多すぎ
sage
933デフォルトの名無しさん:01/12/13 19:17
>>1
本読め。理解できなければ理解するために努力しろ。
それでもダメなら道を変えろ。
スレで愚痴るなんて最低だぞ!!
934デフォルトの名無しさん:01/12/14 13:22
あげ
935デフォルトの名無しさん:01/12/17 03:44
age
936デフォルトの名無しさん:01/12/18 03:27
age
937デフォルトの名無しさん:01/12/19 11:42
age
sage
魔サ家スレかよ!!
940デフォルトの名無しさん:01/12/20 12:18
ageてみよ
941デフォルトの名無しさん:01/12/20 12:21
C言語は仕様が小さい
ストラウス〜の考え方はマイクロソフトに似てて、肥大になってる。
マイクロソフトの考え方とは、ユーザが欲しいというものは腕力で実装。
うまく使うには取捨選択が必要。
942デフォルトの名無しさん:01/12/22 08:53
ageてみよ
(・∀・)ココダヨ!
(・∀・)マッテルヨ!
945 ◆PZkIiX/M :01/12/25 15:57
めっけ。
946 ◆PZkIiX/M :01/12/25 16:03
そ の深いところに隠れてみる。
947 ◆PZkIiX/M :01/12/25 16:28
微妙な間に注意。私は怪獣使いの住処に潜む。
948 ◆PZkIiX/M :01/12/25 16:42
作る人がいる。使う人がいる。私は使う人といる。
そ れは作られたもの。使われるもの。
949デフォルトの名無しさん:01/12/29 05:23
ageてみよう。
マ板からきたな。
本当にやってるのか・・・かくれんぼ。
951デフォルトの名無しさん:01/12/30 11:35
ha?
952初心者:01/12/30 14:07
http://www.bloodshed.net/images/devcpp_scr.jpg
これってC++を勉強するのに使る?
フリーソフトなんですけど
953>952:01/12/30 14:20
貧乏人のVisualStudioって感じだな
デバッガもついてなさそうだし
金出せるんならVisualStudio買っとけ
954デフォルトの名無しさん:01/12/30 22:56
スクロールバーが動かないぞ。ばったもんか?
955デフォルトの名無しさん:01/12/30 23:26
>>951
マ板の厨房が、2Ch内でかくれんぼしてます。
956デフォルトの名無しさん:01/12/31 01:20
C++は一週間でマスターしたよ。
実は、その前にJAVAをマスターしてたからなんだけどね。
JAVAマスターするのには6ヶ月以上かかったかも。
すでにCは習得してたんだけどね。
その原因はやっぱりOOにあったよ。
もちろんJAVA初めて3日で動くコードはかけてたけど、
あれはJAVAとは程遠かった・・・
インターフェースも抽象クラスも意味がよくわかってなかったからな・・・
いくらなんでも一週間で「マスター」は有り得ないんじゃねーのか
と言ってみるテスト
>C++は一週間でマスターしたよ
マスターしてない事の証明。
ということにしたい。
959デフォルトの名無しさん:01/12/31 01:42
マスターとか習得とかって、
何を基準に判断するんだろうね。
資格試験でもあるのかしら?
960仕様書無しさん:01/12/31 01:45
デザインパターンすべてをC++で具現化したらマスターしたことにしてやるよ。
961デフォルトの名無しさん:01/12/31 01:50
C++マスターしたっていうのは、
C++に用意された全機能について、解説できるって意味ね。
Cでmalloc,freeが使えて、関数ポインタがわかってて、
JAVAでOOできたら、
C++で新しい事といえば・・・・・
多重継承で起こる不都合だけど、多重継承しないしな。
ヘッダファイルがうざいのと、constがうるさいのと、
あと、コンパイラのエラーがアホなのと、
コンパイルにやけに時間がかかる事かな。
でも、いまだによくわからないのが、
typeidと例外処理
typeidのどこがわからないかの説明はめんどうだから
func(&typeid(class))って使い方でいいのかな?
あと、例外処理では
オブジェクトをthrowしたいんだけど
throw new Exception
で、
catch(*Exception)
みたいにポインタでいいんか?
962デフォルトの名無しさん:01/12/31 01:52
あ、上のは動くか動かないかじゃなくて
一般的にはどうなのか?って事が知りたいので・・・

デザパタ全部ってさ、
使わないの覚えても仕方ないんじゃない?
仕様さえわかれば、普通は何でもコーディングできると思うけど。
所詮ポインタを使ったデータ構造。
デザパタってそれ以上でもそれ以下でもない。
C++は任せとけ、ってやつで、肝心なところでコピーコンストラクタ書いてないやつがいたなぁ。
あななつかしや。
964デフォルトの名無しさん:01/12/31 02:10
>>461
throw new Exception

catch(*Exception)
する。
いいよ。
Obj obj;
...
throw obj
なら、
catch(Obj eobj)
だけど。
C++は任せとけって奴で、引数が12個ある関数を兵器で書く馬鹿
がいるなあ、うちに。頃してやりたい。
966デフォルトの名無しさん:01/12/31 02:12
>>964
あと、>>962
だと、catch()内で、
delete Exception;
せにゃだめだな。
それから、
catch (*Exception)
でなくて、
catch(Exception* pE)
{
...
delete pE;
}
だった。
967デフォルトの名無しさん:01/12/31 02:13
>>965
Win32 APIのCreateFont()の引数の数は?
明らかに >>961 は C++ の極一部しか理解してないと思われ.
969デフォルトの名無しさん:01/12/31 02:19
>>963
きっと、その人は速度重視で、関数でのオブジェクト
受け取りをポインタか、参照渡ししかさせまいとおもったんじゃない?
って冗談だけどな。
970デフォルトの名無しさん:01/12/31 02:20
>>961
> C++で新しい事といえば・・・・・
テンプレートという言葉が何故出て来ないのだろう

と言ってみるテスト
とりあえず >>961=>>956
Effective C++
More Effective C++
Exceptional C++
は最低でも読んでおくよーに.
自分の身の程を知っておく必要があるかと.
この板で「マスター」は禁句だよ
厨房がワラワラとよってくるから
このスレ、Rev.2 つくるのかいな?
それとも、今年でお終いか?
974デフォルトの名無しさん:01/12/31 02:44
出来上がった概念を理解するのはやさしい。
むしろ概念というものを説明するのが難しいから、
下手な説明を聞いて教えられた方が悩んでしまう。
そんなもんだ。
ふれんどりぃくらす...とか言っちゃ駄目?
勃起がおさまらねーなー
>>973
今年でおしまい。ということにしたい。
>>971
template 関連で Effective STL, Moden C++ Design, Generic Programming and the STL も追加しとこう。
979デフォルトの名無しさん:01/12/31 03:24
そろそろまとめに入らないと・・・
980    :01/12/31 03:52

OO逝って良し。

********** 終了 ************
981デフォルトの名無しさん:01/12/31 16:16
もうちょいよ。
982まとめ:01/12/31 16:52
「難しく作ったから」

これでいいって.
C++氏ね!!
C++、使いこなすは一生ものだと思う今日この頃
985 :01/12/31 17:27
C++ってそんなに難しいか?
厨な漏れでも林ハルヒコの本で
即効マスターしたぞ。みんな馬鹿?
マスターとかいうなよ・・・
前から疑問に思っていたが継承で生成されたオブジェクトはサイズが
でかくなるんだろうか。
C++はアフォ、逝ってよし!!!
>>987
メンバ変数は、基底クラスと派生クラスの分を両方持つから、その分サイズが増える。

仮想関数がある場合には仮想関数テーブル (vtbl) へのポインタ (vptr) も持つことになるが、
単一継承なら vptr はインスタンス 1 つにつき 1 つにまとめ、多重継承の場合には、継承した
数だけ vptr を持つのが一般的。多重継承すると、それだけサイズは増える。

実際のコンパイラで sizeof() を使って調べてみるのが良いと思うぞ。
990デフォルトの名無しさん:01/12/31 17:45
>>987
でかくなる場合もあるし、小さくなる場合もある。
991デフォルトの名無しさん:01/12/31 18:23
どっちよ?
992デフォルトの名無しさん:01/12/31 18:26
じゃ、メンバ関数継承するとやっぱサイズ増えるんだな。
993デフォルトの名無しさん:01/12/31 18:29
993にて結論:Rubyを使え。
一生
Rubyだけ
つかってろ
995デフォルトの名無しさん:01/12/31 18:35
そんなもん動かねーよ。
PCで使うんじゃねーんだボケ。
1000に驚くべき結論が提示されるらしい。
1000の奴は責任重大
998996:01/12/31 18:55
ごめんうそ。
999996:01/12/31 18:59
998は偽物age
1000996:01/12/31 19:03
1000get!
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。