1 :
デフォルトの名無しさん :
04/06/26 16:47 C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
テンプレートライブラリ(STL含む)に関する質問は
専用の別スレにお願いッス。
過去スレ、関連スレ、関連リンクなどは
>>2-9 あたり
2 :
デフォルトの名無しさん :04/06/26 16:51
3 :
デフォルトの名無しさん :04/06/26 16:52
4 :
デフォルトの名無しさん :04/06/26 16:53
5 :
デフォルトの名無しさん :04/06/26 16:55
6 :
デフォルトの名無しさん :04/06/26 16:56
関連スレは移動調べるのがマンドクセので何方かおながいします。
Zcurry。
前擦れ
>>995 の続きが気になる…
>>1-11 乙。では・・・・
STLつかうと一気に実行ファイルサイズが10倍に?!
誰か相手してやれよ
>>15 すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
17 :
デフォルトの名無しさん :04/06/26 18:46
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。 とかいうエラーが出るんだけどこれってどうすればいいのでちゅか?
>>18 #include "stdafx.h"
後死ね。
>>19 言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
v(^・^)v はどこに消えた
スマソ。すっかり忘れていた。この通り・・・_| ̄ ̄|〇
もうpart32か俺も歳くったなv(^・^)v
>>24 いやまぁ、そこまで深刻な問題じゃないし^_^;
27 :
デフォルトの名無しさん :04/06/27 13:55
質問です。 Cだと printf("key[%s] value[%s]\n",key,value); C++だと cout << "key[" << key << "] " << "value[" << value << "]" << endl; なんかC++の方が書く量が多いのですが、これはしょうがないのですかね・・・。 なにかヒントがあったら教えてください。
>>27 書く量なんか問題じゃないだろ。
そんなに気になるなら、変数名は全部1文字にしたり、マクロ使いまくれ。
そして、そんなことはどうでもいいことだと悟れ。
>>27 少し短くした
cout << "key[" << key << "] value[" << value << "]" << endl;
何も疑問に思わないんだとしたら
>>28 の頭は腐ってるな
レスありがとうございます。 なるほどぉ。
double d = 123.456; printf( "value=%4.2f", d); なんてのはcoutでどう書けばいいのでしょう?
>>33 マニピュレータで検索
ただ、激しく面倒なので printf() 使った方が幸せな気がするが。
正直、coutって使えないんだ。。。orz
>>33 そのときの表示って、
value=123.46
ってなるかも。
37 :
デフォルトの名無しさん :04/06/27 16:27
#include <string> using namespace std; string work="hoge"; // OK char array[10]; strcpy(array,work.c_str()); // NG 上のコードで3行目のstrcpyで error C2668: 'strcpy' : オーバーロード関数の呼び出しを解決することができません。(新機能 ; ヘルプを参照) と怒られてしまいます。 本等を見てもこれで通るはずなのですが・・。 解決策があったら教えてください。 VC++6.0でサービスパック6です。
マルチか
39 :
デフォルトの名無しさん :04/06/27 18:31
マルチって何法に抵触なんだ?
なんか直リンと似た議論に思えてきた
>>37 #include <string>
#include <cstring> //もしくは #include <string.h>
>>39 はぁ?
もう回答は出てるから、いらねぇってことだよ。
41 :
デフォルトの名無しさん :04/06/27 18:36
42 :
デフォルトの名無しさん :04/06/27 18:37
インタビューって各方面の専門家に聞いて回るの普通だろ
>>39 情報が分散するので、後になって検索する人が不便。
回答者の能力を疑っているようにみえるため、無礼。
(「こいつに聞いても判らないかもしれないから、他のところでも聞いておこう」ということ)
法律だけが全てじゃないよ。
44 :
デフォルトの名無しさん :04/06/27 18:38
そもそも「何法に抵触か」という問題提起に答えないあたり ますます直リンとそっくりに見える
45 :
デフォルトの名無しさん :04/06/27 18:41
>>43 無礼に思った人が無礼者に対する相応しい態度をとればいいだけだろ?
大勢に嫌な態度をとられた人は自然に学習するわけで
「マルチ」って用語まで作って魔女狩りみたいにする必要性はないと思う
46 :
デフォルトの名無しさん :04/06/27 18:41
参照型を実体型に代入するとどういう動きになるのでしょうか? string a(string& s1) { string s2 = s1; return s2; }
47 :
デフォルトの名無しさん :04/06/27 18:42
48 :
デフォルトの名無しさん :04/06/27 18:44
>>45 > 「マルチ」って用語まで作って
別に、以前から使われている言葉だし。
>>48 魔女っていう概念もだいぶん昔からあったんじゃないか?
50 :
デフォルトの名無しさん :04/06/27 18:49
>>48 言ってる意味通じてねえな
マルチ=悪
という闇トラストまで作る必要はないと言っている
少なくとも俺は加担し(てやら)ない
>>45 「魔女狩りみたい」って具体的にどういうこと?
「マルチか」なんて言いつつ結局答えてしまっているあたり、
魔女狩りどころか黙認しているようにすら見えるけどね。
魔女狩りと言うからには、何ら問題のないものにまで言い掛りを付けるという
ことだと思うのだけど、そういう風には見えないなあ。
52 :
デフォルトの名無しさん :04/06/27 18:54
>>50 > 言ってる意味通じてねえな
通じなかったのは、言ってる意味ではなく、言っていないことの意味です。
言っていないことが通じないのは当たり前ですね。
エスパーであることを要求されても困ります :-P
> マルチ=悪
> という闇トラストまで作る必要はないと言っている
それも昔からありますね。最近作られつつある流れであるかのように言うのは
ナンセンスです。
ageてる時点で釣りだと・・・
54 :
デフォルトの名無しさん :04/06/27 18:56
55 :
デフォルトの名無しさん :04/06/27 18:59
>>51 もう一度聞く
マルチは何が悪いんだ?
言っておくが
>>43 は説明になってない
無償で回答する側の動機と
相手の無責任を承知で質問する人の動機に照らして
常連の勝手な馴れ合いに頼らない説明をしてみてくれ
56 :
デフォルトの名無しさん :04/06/27 19:01
>>52 >それも昔からありますね。
それって何のこと?
>最近作られつつある流れであるかのように言うのは
>ナンセンスです。
あんた現にエスパーじゃん。
57 :
デフォルトの名無しさん :04/06/27 19:02
>>55 > 言っておくが
>>43 は説明になってない
なっていますね。
(「認めたくない」という駄々を「説明になってない」と言い換えても無駄です)
58 :
デフォルトの名無しさん :04/06/27 19:03
>>56 > それって何のこと?
あなたの言っていることですが :-)
59 :
デフォルトの名無しさん :04/06/27 19:04
>>57 おまえ一行 > ばっかりやってるからそうなるんだよ
続き読めよな
60 :
デフォルトの名無しさん :04/06/27 19:05
>>58 おいエスパー、こっちは普通の人間だ。飛躍しないでくれ。
61 :
デフォルトの名無しさん :04/06/27 19:05
>>59 > おまえ一行 > ばっかりやってるからそうなるんだよ
「そうなる」とはどうなることでしょうか? 文章がまずくてわからないです。
> 続き読めよな
読んで書きましたよ。
62 :
デフォルトの名無しさん :04/06/27 19:06
>>60 > おいエスパー、
レス先間違えてますよ :-)
> こっちは普通の人間だ。飛躍しないでくれ。
普通の人間よりはほんのちょっぴり「物分りが悪い」気もします。
63 :
デフォルトの名無しさん :04/06/27 19:06
>>61 >読んで書きましたよ。
じゃ、おまえにはもう聞かない。ばいばい
64 :
デフォルトの名無しさん :04/06/27 19:07
>>63 > ばいばい
あ、はい。さようなら。
どこかにあなたの子供の駄々を受け入れてくれるコミュニティが存在することを
心から祈っております :-)
65 :
デフォルトの名無しさん :04/06/27 19:07
>レス先間違えてますよ :-) 了解
66 :
デフォルトの名無しさん :04/06/27 19:08
マルチが嫌われるのは、 マルチかます奴は大抵各スレに「よそで解決しました」との報告を行わず、 さりとて各スレの反応を見比べて吟味するような技量(ひいてはそのつもり)がないように思われるからだ。 「思われる」というところはもっぱら回答者側の主観によるものだが、嫌なもんは嫌なんだから仕方ない。
67 :
デフォルトの名無しさん :04/06/27 19:09
>>64 >受け入れてくれるコミュニティが存在することを
>心から祈っております :-)
マルチにもなw
>>55 全員マルチしだしたら、スレ分けてる意味がなくなるやん。
>>55 どこが納得がいかなかったのか説明してもらわないと、同じ説明の繰り返しになってしまうと思うのですが。
マルチは嫌われる、よってダメだ。 実際俺はマルチは好きじゃない。 せっかく解答してやったのに、違うスレでまったく同じ質問を見つけたら なんだかなーコイツは、という気分になるよ。
71 :
デフォルトの名無しさん :04/06/27 19:10
>>66 じゃ、それぞれに対して礼を失しなければ
ほうぼう聞いて回るのはいいんだな?
72 :
デフォルトの名無しさん :04/06/27 19:12
73 :
デフォルトの名無しさん :04/06/27 19:12
というか、ずっと以前から「失礼な行為」として続いてきたものに 今さら個人の感情でどうこう言い出す時点で馬鹿丸出しですね。 勘違いした批判精神で社会性の無さを正当化する子供ってとこでしょうか :-P
74 :
デフォルトの名無しさん :04/06/27 19:13
>>72 >
>>41 についてはどう思う
珍しい意見が、まるで自演のようなタイミングで出てきたなぁと思いました ;)
>>55 マルチでの質問は気分を害する人間が居ます
それに答えた後でマルチに気づけば、その回答者が気分を害する事になります
>>38 ではマルチである事の告知せず、マルチを悪し様に言っているわけではありません
>>38 マルチで気分を害する回答者を出さないための回答者保護として適切な対処であると考えられます。
それに過剰反応する39=(ry自身が、マルチを悪いものと認識しているのでしょう
マルチでの質問に問題が無いと感じる人は、
>>38 を見てそのまま解答すればいいだけの話です。
マルチである事の告知"しか"せず
77 :
デフォルトの名無しさん :04/06/27 19:16
>>69 39は何法に抵触かを問うた
43は何法に抵触かを答えていない
・回答者は、聞き方が気に入らなければ答えない
・質問者は、収穫が少なければ聞き方を工夫する
それだけだろ?
質問者の行動まで規制する必要というか
何の権利でそこまで口出しするんだ?
回答者の権力が及ぶ範囲は上記の1点目だけだ
>>77 コミュニティがすさむことへの自助活動だろ?
誰にもなんの権利もないよ
それとも誰かに与えてもらないとなにもでないの?
79 :
デフォルトの名無しさん :04/06/27 19:20
>>75 「マルチ」という用語に嫌悪が含まれるという認識はある
だから問題提起をした
38に37に対する嫌悪がなかったことを証明できるか?
80 :
デフォルトの名無しさん :04/06/27 19:20
常識的な礼儀も守れない奴って、それを指摘されると その礼儀作法に論理のメスを入れるふりをして どこまでも逃げ回るよね。
>>77 マルチが気に入らない回答者は、それがマルチである事に気づけなければどうしたらいい?
82 :
デフォルトの名無しさん :04/06/27 19:21
常識に問題提起をする時点で痛いんだよ
>>79 悪魔の証明ですか?
fjのノリになってるね。
まぁマルチするのは勝手だが、嫌われて回答が得られなくても文句言うなってこった。
>>78 > コミュニティがすさむことへの自助活動だろ?
空気読めないヤツが、それを壊すと。
別に「俺はマルチしたいんだ」と力一杯主張して実行するのはかまわんが、
それが通った結果として回答を得られる場を壊しちゃったら(みんなマルチが
鬱陶しくてスレを読まなくなったら)本末転倒だよ。よく考えれ。
86 :
デフォルトの名無しさん :04/06/27 19:23
マナーの話なのに「何法に抵触するんだ?」だもんな。 こういう他人とまともにコミュニケーションもとれない馬鹿は 無人島に行って電源の入ってないマシンをいじってて欲しい。
87 :
デフォルトの名無しさん :04/06/27 19:24
>>81 自分で調べろ
・・・と質問者に対してよく言う人は、自分も言動を一致させる必要がある
はっきり言ってただのアフォ
問題提起をする側が38に悪意のあることを証明しないとな。
89 :
デフォルトの名無しさん :04/06/27 19:25
>>86 > 無人島に行って電源の入ってないマシンをいじってて欲しい。
ワラタ
90 :
デフォルトの名無しさん :04/06/27 19:25
>>70 >マルチは嫌われる、よってダメだ。
>>82 >常識に問題提起をする時点で痛いんだよ
閉鎖的な馴れ合いの典型だなw
91 :
デフォルトの名無しさん :04/06/27 19:27
>>90 > 閉鎖的な馴れ合いの典型だなw
いえ、閉鎖的なのは、殆どの人間の同意を取れずにいるあなたの理屈と、
にもかかわらず未だにそれを正しいと信じ込んでいるあなたです :-P
92 :
デフォルトの名無しさん :04/06/27 19:28
>>87 サーチエンジンに反映される前の記事を
即座に漏らさず探し当てる能力を持っているのは
多分世界でもあなただけです
95 :
デフォルトの名無しさん :04/06/27 19:28
96 :
デフォルトの名無しさん :04/06/27 19:30
だいたい同じだな 礼儀を守らない奴の言い逃れは、ネットでもそれ以外でも
>>95 90 の対象には次々人が追加されるのに 95 の方には一人も追加されないのな。
v(^・^)v
98 :
デフォルトの名無しさん :04/06/27 19:31
>>73 >ずっと以前
これも問題
大学や公共機関という受益者負担の原則に照らして特殊な環境の下、
ないしはナローバンド等によるレートの大きな従量制の下での
「常識」がいつまで続くかに関心がないなら、それは技術者として恥ずべきことだ
99 :
デフォルトの名無しさん :04/06/27 19:31
>>95 > アフォかこいつは
いよいよ幼児性がわかりやすい形で出てきましたね ;-)
頭のいかれてる人を怒らすとめんどくさいな。 トリップつけてくれよ。他のスレで見かけても放置するからさ。
そろそろ放置すべき時期かと思うんだが、どうだろう? ここネタスレじゃないし、こんな下らん事で埋めちゃうのは勿体ない。
102 :
デフォルトの名無しさん :04/06/27 19:33
>>98 > 「常識」がいつまで続くか
大学や公共機関、ナローバンドといった単語を持ち出しても無駄ですね。
いま現在、この板で、この常識は息づいているので :-)
103 :
デフォルトの名無しさん :04/06/27 19:33
>>94 語るに落ちたな
「見苦しい言い訳をする質問者」そのもの
>>98 日本人が昆虫を食べる事に抵抗を持つのなら、それは地球の住人として恥ずべき事だ
一度染み付いた文化や習慣はそう容易には変えられない。
105 :
デフォルトの名無しさん :04/06/27 19:35
>>102 >いま現在、この板で、この常識は息づいているので :-)
そのことへの疑問を問題として提起した
106 :
デフォルトの名無しさん :04/06/27 19:35
要するに、この板でコミュニケーションを取ろうという人間が、 その際にこの板のマナーを守らなかったという話だろ。 あからさまに失礼な奴なのに、なんで踏ん張るんだろう・・・ まぁ、失礼な奴だからなんだろうがw
↑さっきからうるさいsageろ
108 :
デフォルトの名無しさん :04/06/27 19:35
>>104 イナゴの佃煮なんか昔からあるじゃん
オマエが知らないだけ
屁理屈喚き散らかしてまでマルチがしたいのかw
110 :
デフォルトの名無しさん :04/06/27 19:36
>>105 > そのことへの疑問を問題として提起した
結果は見てのとおりですね :-)
ここでいくら暴れても「これだからマルチは・・」と嫌われるだけなのにな。 マルチの印象をさらに悪くして損するの自分なのに。 本来は回答を得ることが目的なのに、マルチすることが目的になってる。 本当に回答を得たいなら回答を得やすい質問の仕方すれば自分が得するのに。
いい加減他のスレが下がるのでsageてくださいsage
「問題提起」という言い方で自分のヒステリーをごまかしてるのがなんとも
114 :
デフォルトの名無しさん :04/06/27 19:37
お 前 ら s a g e ろ
>>111 そうだね。
前々からマルチする奴には無礼で頭が悪いって特徴があるなと思ってたけど、
今回のことでその思いは強まったよ。
117 :
デフォルトの名無しさん :04/06/27 19:38
>>111 変な言いがかりつけんな!
俺がいつマルチしたんだよ?
>>103 詭弁だな。
確かに「探しても見つかりませんでした」は探そうとしないアホの常套句だが、
掲示板の記事のような即時性のあるリソースを
現代のサーチエンジンで追いきれない事は純然たる事実だ。
俺はいくつかのnewsと2ch、あとはbelutionをチェックしては居るが
他のサイトまでチェックし尽くすことは物量的に不可能だ。
プログラミングコミュニティ全てを列挙しきる事のできる人間も
多分世界であなただけです。
119 :
デフォルトの名無しさん :04/06/27 19:39
120 :
デフォルトの名無しさん :04/06/27 19:39
121 :
デフォルトの名無しさん :04/06/27 19:39
>>118 再び語るに落ちたな
言えば言うほど恥の上塗りだよ
122 :
デフォルトの名無しさん :04/06/27 19:40
>>121 どこに問題があるのか指摘できないのは脳が入ってないからですか?
マルチは失礼、という常識が いちだんと強化された感があるな 今回のやりとりで
125 :
デフォルトの名無しさん :04/06/27 19:41
真・スレッドストッパー。。。( ̄ー ̄)ニヤリ
何法に抵触するんだ? とかきいてた奴が 突っ込まれたあとで「常識への疑問を問題として提起したんだ」って・・・ はあ
もっと上手く使えばいいのに。 無料でめんどうなやり取りもせずに回答が得られる場所なんだから。 自分の主張を通したいがために結局回答が得られなかったら本末転倒だよ。
128 :
デフォルトの名無しさん :04/06/27 19:43
129 :
デフォルトの名無しさん :04/06/27 19:43
>>123 「見苦しい言い訳をする質問者」そのもの
>他のサイトまでチェックし尽くすことは物量的に不可能だ。
>プログラミングコミュニティ全てを列挙しきる事のできる人間も
マルチかどうか確認するには必要なことだが
言ってる当人ができないと宣言している以上、
「マルチすんな」という主張は破綻している
130 :
デフォルトの名無しさん :04/06/27 19:43
誰か 無料で C言語 DLできる サイト 教えろ糞ども
132 :
デフォルトの名無しさん :04/06/27 19:44
>>126 いいよ、こっちは百歩譲ったつもりだったが
何法にも抵触してないんなら自由って結論な
リアル中学生(所属:パソコンクラブ)なんだからそのへんで許してやれよ
>>129 だれも「マルチすんな」とは言ってないよ。
言っても無い事に反論する手に出てきましたね。
「マルチに解答すると気分が悪くなる」これだけ。
135 :
デフォルトの名無しさん :04/06/27 19:45
>>131 お前は馬鹿だC言語教えて無料でDLお前は馬鹿。
C++の話題につけていけないのでくだらないことで 盛り上がる人達が集まるのはこのスレですか?
>>129 > 言ってる当人ができないと宣言している以上、
> 「マルチすんな」という主張は破綻している
していませんね :-P
139 :
デフォルトの名無しさん :04/06/27 19:46
>>136 このスレッドの殆どの人がクスリやってます。
放っておいた方がいいですよ(ワラ
140 :
デフォルトの名無しさん :04/06/27 19:46
>>132 > 何法にも抵触してないんなら自由
さぞ嫌われてるんでしょうねえ。
141 :
デフォルトの名無しさん :04/06/27 19:46
142 :
デフォルトの名無しさん :04/06/27 19:47
誰かC言語をこの超超超超超超超超超超超℃素人の私に教えてくだらい
>>132 法律で規制してもらわないと何もできんのか……
まぁ宿題やらなくても、電車の中で化粧しても、コンビニの駐車場に
座り込んでも、変数名を a1, a2, a3, .. としても法には触れんわな。
146 :
デフォルトの名無しさん :04/06/27 19:48
>>143 無礼者はあんたらだろ
こっちが百歩譲ってたことに対して
それだけかよ
147 :
デフォルトの名無しさん :04/06/27 19:48
>>144 だから何?消えろクズ
>>145 氏ね氏ね氏ね氏ね氏ね氏ね氏ね氏ね氏ね氏ね氏ね氏ね氏ね氏ね氏ね氏ね氏ね
148 :
デフォルトの名無しさん :04/06/27 19:49
>>146 > こっちが百歩譲ってたことに対して
何を譲っていたのですか?
あなたが間違っている点をあなたが改めることは
「譲る」とは言いませんが :-P
法に触れないが嫌われる、ただそれだけだよ。 だからそろそろ落ち着け。 いくら「俺を(そしてマルチする人を)嫌うなぁー!」と主張しても無駄なんだよ。 だってそんなの法律で禁止してないべ。
マルチすんのは自由だな、バレるとアレだけど。 でもって、マルチを指摘するのも自由だな。 なんか、これ納得できないらしいけど。
>>147 > だから何?
スレ違い、ということです ;)
152 :
デフォルトの名無しさん :04/06/27 19:50
ActiveBASIC>>>>>>>>>>>>>>C/C++
153 :
デフォルトの名無しさん :04/06/27 19:51
>>148 あんたの主張:
間違っている →譲るとは言わない
こっちの主張:
間違っていない →譲ると言う可能性がある
D>Smalltalk>Java>C++>C
マルチポストは是か非か? という質問をマルチポストしてきます。
156 :
デフォルトの名無しさん :04/06/27 19:52
ActiveBasic>>Delphi>HSP>>>>C/C++
*あらゆる質問はまずすれ立てるまでもない質問はここでスレにしてください。 とりあえず、何法に抵触しているのか、すれ立てるまでも無い質問スレでしてきてください。
158 :
デフォルトの名無しさん :04/06/27 19:52
Ruby>>Java>>Delphi>>AB>>>HSP>>C/C++
この流れなら言える!
162 :
デフォルトの名無しさん :04/06/27 19:53
163 :
デフォルトの名無しさん :04/06/27 19:53
164 :
デフォルトの名無しさん :04/06/27 19:53
なんか関係無い流れだから好きな子の名前でも告白しちゃおうかな
166 :
デフォルトの名無しさん :04/06/27 19:54
ひまわりマンセーひまわりマンセーひまわりマンセーひまわりマンセーひまわりマンセーひまわりマンセー ひまわりマンセーひまわりマンセーひまわりマンセーひまわりマンセーひまわりマンセーひまわりマンセー ひまわりマンセーひまわりマンセーひまわりマンセーひまわりマンセーひまわりマンセーひまわりマンセー ひまわりマンセーひまわりマンセーひまわりマンセーひまわりマンセーひまわりマンセーひまわりマンセー ひまわりマンセーひまわりマンセーひまわりマンセーひまわりマンセーひまわりマンセーひまわりマンセー ひまわりマンセーひまわりマンセーひまわりマンセーひまわりマンセーひまわりマンセーひまわりマンセー ひまわりマンセーひまわりマンセーひまわりマンセーひまわりマンセーひまわりマンセーひまわりマンセー ひまわりマンセーひまわりマンセーひまわりマンセーひまわりマンセーひまわりマンセーひまわりマンセー ひまわりマンセーひまわりマンセーひまわりマンセーひまわりマンセーひまわりマンセーひまわりマンセー ひまわりマンセーひまわりマンセーひまわりマンセーひまわりマンセーひまわりマンセーひまわりマンセー ひまわりマンセーひまわりマンセーひまわりマンセーひまわりマンセーひまわりマンセーひまわりマンセー ひまわりマンセーひまわりマンセーひまわりマンセーひまわりマンセーひまわりマンセーひまわりマンセー ひまわりマンセーひまわりマンセーひまわりマンセーひまわりマンセーひまわりマンセーひまわりマンセー ひまわりマンセーひまわりマンセーひまわりマンセーひまわりマンセーひまわりマンセーひまわりマンセー ひまわりマンセーひまわりマンセーひまわりマンセーひまわりマンセーひまわりマンセーひまわりマンセー ひまわりマンセーひまわりマンセーひまわりマンセーひまわりマンセーひまわりマンセーひまわりマンセー
>>164 意味不明という言葉の意味がわからない、という意味ですか?
もしそうなら、これは辞書的な話ですから辞書をひけばいいし、
そうでないなら、まったく筋の通っていないオウム返しですから
まさにジタバタと暴れる子供と同じですね :-P
マルチから荒らしに正常進化を遂げてるなw あとは、 ┌─┐ |も.| |う | │来│ │ね│ │え .| │よ .| バカ ゴルァ │ !!.│ └─┤ プンプン ヽ(`Д´)ノ ヽ(`Д´)ノ (`Д´)ノ ( `Д) | ̄ ̄ ̄|─| ̄ ̄ ̄|─| ̄ ̄ ̄|─□( ヽ┐U 〜 〜  ̄◎ ̄ . ̄◎ ̄  ̄◎ ̄ ◎−>┘◎ と言いつつ数回書き込んで、それがバレて「もう来ねぇんじゃなかったの?」と つっこまれるのがいつものパターンだが、さて。
169 :
デフォルトの名無しさん :04/06/27 19:55
>>166 3点
そのネタは使いつくされています
もっとオリジナリティを出しましょう
172 :
デフォルトの名無しさん :04/06/27 19:56
>>160 聞き方が気に入らないから答えない
質問文にすらなってないが・・・
「やっぱ2ちゃんねらは馬鹿ばっかりだな!もう二度と来ねぇよ!」
174 :
デフォルトの名無しさん :04/06/27 19:56
お前らC++の相談をしろ。ここはそういうスレだ。 マルチがうんぬん言い合うスレではない。 マルチの相手してやってる奴も落ち着け。 あんたらたぶん良い様に釣られてるぞ。
>>169 そうですか。あなたの大切な会話が終わってしまいましたね ;-)
え、まだやってんの っつーかスレ伸びすぎ >マルチって何法に抵触なんだ? しょっぱなのこのレスが物語ってるな
>>165 ひゅーひゅー!こーくはく!こーくはく!
180 :
デフォルトの名無しさん :04/06/27 19:57
「2CHなんて社会のゴミの集まりですから悪口いわれても気にすることないですよ」
181 :
デフォルトの名無しさん :04/06/27 19:57
>>175 も読めない方は精神科に逝ったらどうですか。
>>172 > 聞き方が気に入らないから答えない
まぁいいですよ。
あなたの問題提起をあなたが「続けないもんね!」とやっても、
こちらはノーダメージどころか、見ててオモシロいだけなので ;-)
僕、法律のことはあまりよく知らないのですが、これってマルチ商法の話ですよね?
ちょっと聞きたいんだが、マルチポストを嫌う奴は、 (1) 自分の覗いた(常駐している)スレにマルチポストされるのが嫌だ。 (2) マルチポストに自分以外の誰かが回答することが嫌だ。 (3) マルチポストに回答することが嫌だ。 のどれよ?ちなみに俺はどれにも当てはまらない。
でも好きな子の名前告白しちゃうとgoogleのイメージ検索で本人がヒットしちゃうんだよな・・・
186 :
デフォルトの名無しさん :04/06/27 19:59
188 :
デフォルトの名無しさん :04/06/27 20:00
189 :
デフォルトの名無しさん :04/06/27 20:00
>>182 1つのレスに対して答えないことが
何で提起した問題全部の放棄になるんだよ
見ててオモシロイをそのまま返してやる
191 :
デフォルトの名無しさん :04/06/27 20:01
>>188 気持ちは分かるが、祭りがおさまるまでは待つしかないと思われ。
>>186 やっぱりすれ違いだよな。スマソ
ずっと気になってたもんでつい…
>>187 やべっ、先生だ!
お ま え ら ネ タ フ リ し ろ
195 :
デフォルトの名無しさん :04/06/27 20:02
>>192 このスレッドに居る糞糞糞住人が消えても仕方ありません
197 :
デフォルトの名無しさん :04/06/27 20:02
>>189 > 1つのレスに対して答えないことが
> 何で提起した問題全部の放棄になるんだよ
何で「提起した問題全部の放棄」なんて話をしだすのかがまったくわかりません。
同じ言葉を繰り返したくはありませんが、あなたのレスは本当に意味不明なんですよ :-P
> 見ててオモシロイをそのまま返してやる
返そうとするのは自由ですよ。当てはまってはいませんけど。
なんだよ、告白しようと思ったら終焉かよ
200 :
デフォルトの名無しさん :04/06/27 20:03
基地外さんは無駄に元気なのが通例だから、 この辺で放置しようぜ > ALL あとは基地外が一回勝利宣言して、それをみんなが心の中で馬鹿にして終了だ。
203 :
デフォルトの名無しさん :04/06/27 20:04
そんなことより俺は前スレの955の続きが気になるんだが
205 :
デフォルトの名無しさん :04/06/27 20:06
>>198 こっちも問題提起を続けないとは言ってない
お互い意味不明のまま平行線だな
206 :
デフォルトの名無しさん :04/06/27 20:06
マルチポストをしたらスレのサイズが10倍に!?
207 :
デフォルトの名無しさん :04/06/27 20:06
>>204 非 static 配列メンバ変数をコンストラクタ中で初期化したいって話?
配列じゃなくて std::vector 使えば簡単だが。
209 :
デフォルトの名無しさん :04/06/27 20:08
>>184 マルチするような質問者自身が気に入らない、行為の問題ではない
>>206 環境によるだろ。
俺はOpenJane Doeに NGワード オプションを指定して、極力
糞レスを見ないようにして使っているが、例えば
>>207 みたいなのが
現れても現れていない時と比べ10Kほどしか増えない。
>>204 非 static 配列メンバ変数をコンストラクタ中で初期化したいって話?
配列じゃなくてPerl使えば簡単だが。
214 :
デフォルトの名無しさん :04/06/27 20:28
クラス名やメソッド名を取得するにはどうしたらよいでしょうか? 具体的にやりたいこと。 class X { public: virtual void a() { // ここで "X#a()" と表示したい } };
215 :
デフォルトの名無しさん :04/06/27 20:29
intへのポインタ の2次配列を new したい。 どうすればよいか.
216 :
デフォルトの名無しさん :04/06/27 20:31
>>215 int *i[][] = new *int[100][100];
218 :
デフォルトの名無しさん :04/06/27 20:39
>>216 ありがとう.でも
incompatible types in assignment of `rgb* (*)[((height - 1) + 1)]' to `rgb*[0][0]'
と怒られる.
rgb *colmap[][];
:
colmap = new rgb*[width][height];
としているのに.
>>214 BOOST_CURRENT_FUNCTIONを使うと楽
220 :
デフォルトの名無しさん :04/06/27 20:41
逆か! colmap = new *rgb[width][height]; でもこうしても怒られる. parse error before `*' token
221 :
デフォルトの名無しさん :04/06/27 20:51
>>216 main()
{
int *i[][] = new *int[100][100];
}
は
declaration of `i' as multidimensional array must have bounds for all dimensions except the first
と言われた.
少しずつ定義するしかなさそうですね.
>>219 今度使ってみます.ありがとう
222 :
デフォルトの名無しさん :04/06/27 21:02
>>217 お前が氏ねカス
クズクズクズクズクズクズクズクズクズクズクズクズクズクズ
223 :
デフォルトの名無しさん :04/06/27 21:12
>>214 int ***a, i;
a=new int**[10];
for(i=10; i<10; i++) a[i] = new int*[10];
でいけた.
int ***a = new int*[10][10]はだめぽでした.
>>215 二次元配列の特性上ムリ
代案↓
int **p=new int*[WIDTH,HEIGHT];
for(int y=0; y<HEIGHT; y++){
for(int x=0; x<WIDTH; x++){
p[WIDTH*y+x]=NULL;
}
}
>>222 コンパイルが通るソース貼ってから言えカスカスカスカスカスカスカス
×int **p=new int*[WIDTH,HEIGHT]; ○int **p=new int*[WIDTH*HEGIHT];
>>215 2次元以上の配列へのポインタは、2次元目以降の要素数を使わないと表現できないよ。
1次元目は「その配列へのポインタ」ということになる
正解は
int* (*i)[20] = new int *[10][20];
です
この場合、newは int* (*)[20] … ★を返してくるから左辺もその型にしないとだめ。
これが冒頭の「2次元目以降の要素数を使わないと表現できない」のことを言っている。
# 左辺で20という数字を使っていること
★の (*)[20] の部分は「intへのポインタを20個持つ1次元配列」と考えます。
そして、その左のint* はその配列(つまり(*)[20]のこと)へのポインタであると考えます。
1次元配列の時は要素数を全く気にしなくてよかったけど、
それは2次元以上になっても、1次元目は要素数を気にしなくて良いのと同じ事です。
この場合、iは「20個の要素を持つ配列へのポインタ」なので、
iをインクリメントすると、20×sizeof(int)の分だけ加算されます。
つまり、iが[0][20]のアドレスを指していたら、i++すると次は[1][20]を指すということ。
newで[10]個分しか領域を確保してないから
ポインタをインクリメントして行き10を越えるとアクセスエラーになるので注意です。
# これは1次元でも同じだよね?
ちなみに単なるintを持つ2次元配列で良いなら
int (*i)[20] = new int [10][20];
こうなります。intへのポインタの配列と比較してみましょう。
最後に、mail欄に半角でsageと書いてね。以上。
>>214 汎用的な方法はない。gcc 限定で良いなら __PRETTY_FUNCTION__ で拾える。
>>222 には、自分がカスかもしれないという不安感が根底にあるんだろう。
それを払拭するためにクズを連呼した、と。
そんなに自分に否定的になるな。カスなんかじゃないから安心しろ。
カスといってからk 175読め俺。
テクにおぼれないで、もっとシンプルにコーディングすればいいのに。。。
>>223 は
>>215 へのレスでした.
>>224 なるほどフラットにしてしまうのもありですね.
>>227 丁寧なレスをありがとう.
でも動的にしたいからこの方法はちと無理でした.
sageときます.すまん
あれだ。折角C++なんだし boost::multi_arrayとかstd::vectorとか使えばいいじゃないか。
オブジェクトでスレ検索したけどネタっぽいスレが多いので このスレで質問させてください。 現在C++でいくつか自分用アプリを作っていて、ある程度C++ の基本的な文法は分かるようになりました。 しかし、何度作っても納得できるようなクラス設計が出来ま せん。 やはりこの手のことにはセンスが必要なのでしょうが、セン スに欠ける凡人(俺のような)でも、「こうこう、こういう 方針でクラス設計するべし」といった一般論を分かりやすく 解説した書籍やサイト(日本語)を探しています。 何かお薦めのものがあれば紹介して頂けないでしょうか?
236 :
デフォルトの名無しさん :04/06/28 20:11
>>235 センスに欠けてちゃどんな方法論も空疎な束縛にしかならないよ
それより、お前さんは自分が作ったクラスの
どんなところに納得いかないんだい?
珍しくスレタイにぴったりの客人さん
分析が済んでないから設計できないんでしょうよ
お邪魔します。。 MPIというのを理解(ある程度)してくるよう先輩に言われたのですが、 だいたいの構造といいますか方法、というのは分かりました。。 でもやっぱり使ってみないと心配でしょうがありません・・・ Widndows上で、エミュレータのように動くソフトはないものでしょうか。。 もしくはネットを使って動くようなものはないでしょうか。。 構造的に存在しないかとは思うのですが、気になってしまいます・・・ ほかの板に書くとノンレスでしたのでこちらに来させていただきました。。 勝手ながら、どうか御教授お願いします。。。
>>236 > それより、お前さんは自分が作ったクラスの
> どんなところに納得いかないんだい?
納得がいかないというか、取っ掛かりが良く分からないのです。
たとえば電卓を作るとして、どんなクラスを作ればよいのか?と
考えだすと右も左も分からない状態です。
結果、細かいところからクラス設計に取り掛かってしまい、最終
的に電卓が出来上がるころには、いろいろなクラスの寄せ集め
見たいになってしまい、全体としての一貫性がないのです。
トップダウンで設計するべきといわれてもなかなかイメージが湧
きません。
そこで、センスが並か並以下の人間でもこういう方針、法則で設
計すれば比較的理路整然とした構成になりやすい、みたいな一
般的な手順を知りたいのです。
>>238 ありがとうございます。本屋で探してみます。
電卓を作るとして、どんなクラスを作ったらいいのか↓答えよ。正解はメル欄
これで完璧
>>241 電卓は、クラス階層考えるより状態遷移が難しいぞ。四則演算の数式を
パースする方が遙かに楽。
てsてs
246 :
デフォルトの名無しさん :04/06/28 21:23
>>240 クラス設計というより構造化設計にも共通するハードルだな
お前さんも言っているとおり、細部からボトムアップすると
最後にまとめる段階で収拾つかなくなっちまうんだよ。
ウォーターフォールとまでは言わないが、
まずトップレベルから着手してみて
「こんなクラスないかな〜」って発想を大事にしながら
下請けのクラス作ってみ。
共通基底クラスで実装継承は、構造化で言うところのサブルーチン化
インターフェイス継承は、関数ポインタを使うときと考え方が似てるよ。
247 :
デフォルトの名無しさん :04/06/28 21:24
人 (__) (__) ウンコー (・∀・,,) O┬O ) キコキコ ◎┴し'-◎ ≡ \ ∩__∩ \ / ヽ \ |● ● | \(_● _) ミ ̄ ̄ ̄ヽ___,-、 (´;;⌒ (´⌒;; .. |∪| ___ ───⌒ヽ(´⌒;;(´⌒;; ヽノ-、____)───(´⌒(´⌒;; ズサ────
今見て大雑把に考えた奴だと 計算状態保持部 結果表示部 メモリー部 入力部 それらのFacade部 こんな感じに大雑把に考えて細部もっと細かく落としてく なるべくその部分に責任をもたせ他の人の事を知らないようにするのが自分の基本。 他の人のやり方はシラネ
Tucker!って結城氏だったの?
>>435 日経ソフトウェアの「ゼロから学ぶソフトウエア設計」を読んでみるのもいいんではないでしょうか?
253 :
デフォルトの名無しさん :04/06/29 01:26
>>235 ほんとうに基礎的なことだけど
フローチャート書いて
考えまとめてから取り掛かれば、いいんじゃない?
釣りはご遠慮ください。
複数のクラス群、 ( A1, B1, C1 ), ( A2, B2, C2 ), ( A3, B3, C3 ), ... をポリシーっぽく使って、 template< typename A, typename B, typpename C > class SomeFunc { private: A a; B b; C c; }; にインスタンスを作ってファンクタとして使っています。 今、新しく、( Anew, Bnew, Cnew ) を作成する必要が出たのですが、 Cnew は、Anew のメンバ関数を使用することになってしまいました。 CnewのコンストラクタにAnewのポインタか参照を渡せば済むことなのですが、今までの クラスを互換性がなくなってしまいます。この場合、どのようにしたらいいのでしょうか? 古い、クラス群にダミー引数を渡せば済むのでしょうが美しくないと思ったので質問しました。
class ChasA:SomeFunc<A,B,C>{ ChasA::ChasA():c(a){} } 思いつきだけどこんな感じじゃだめ?かき方間違ってるかも知らんけど
仮にchar *choice = new char[10]; というchar型配列へのポインター choice があったとして、 コンマ ',' をデリミネーションとして複数の数値をインプット したいんだけど(例:1, 3, 4 で1と3と4がインプットされる) 文字列としてインプットさせて、strtokでコンマごとに区切り、 atoiで数値化するという方法でならできたけど、こうやらないと できないの? get()とかgetline()の使い方が今一よく分からないからかも。。。 もしそういうの使った簡単な方法知ってたら教えてくだされ誰か。
boost::tokenizer とか。
boost::spirit とか。
std::istringstream とか
動的配列で初期化を与える場合、書式は new 型名 [配列サイズ] (初期値); でいいの?
#include <string> class KNeko{ private: -string name; +std::string name; public: -void SetName(string n); +void SetName(std::string n); void Naku(); };
>263 using namespace std の位置を考えろ。意味を考えろ
>>264-265 どうもありがとうございます。
using namespace std;はcoutをstd::なしで使うために書くのではないのでしょうか?
そうとしか入門書にはなかったので。
入門書には乗ってなかったですが#include <string>をつかえば文字列を記憶できる変数型stringを作れるとしか理解してないです。
STLの本を読むことをすすめる stringもstlだ
歴史的にはstringはSTLじゃないし、std名前空間に属するのは"全てのC++標準ライブラリ"だ。 あとまぁSetName()はvoid SetName(const std::string& n);にすべきだな。
>>267-268 標準ライブラリについてもう少し勉強したほうがよさそうなんで本でも買って勉強したいと思います。
constって普段から使う癖をつけたほうがいいんでしょうか?
まだDOSプロンプトでしか動かない小さなプログラムしかやったことがないのであまり意識をしたことがないのですが。
文字列の内容によって場合わけをする場合って、switch文でやりたいのが 人情かと思うのですが、言語仕様で無理ですよね? とすると、普通の配列だったらstrcmpかなんかを使って、stringだったら =="???"とかで比較をしてひたすらif ... else if ... else if ... else ってやってくしか方法はないのですよね?
>>270 ハッシュ法というのを使うと、ましな比較ができることもありますよ
ああハッシュというのがありましたね。 ただシノニムが発生すると一意な場合わけってできないのかな?
>>270 比較コストの問題なら、文字列を(読み込む等して)構築した段階で文字列テーブルに登録して、
あらかじめ一意のIDをつけておくというやり方もあります。登録単位を atom とか呼ぶことが多いです。
こんな感じ。
string_id register_string(const string& str); // テーブルに登録してIDを返す。既にある場合には既存のIDを返す。
static string_id apple_id = register_string("apple");
static string_id orange_id = register_string("orange");
void some_eater(string_id str)
{
if (str == apple_id || str == orange_id) cout << "eat!";
}
>>270 字面の好き嫌いのレベルの話ならif else連ねるしかないよ。
いちいちデータ構造作ってやるのは無駄。
>>270 switch(str[0])
{
case: 'a':
switch(str[1])
{
case 'p':
switch(str[2])
・
・
・
case 'm':
}
case: 'o':
・
・
・
}
map<string, 関数ポインタ>で処理させればいいやん。
60秒毎にメッセージを表示することはできますか? FAQにあったのですがclockは精度が悪いらしいので・・・
boost::timer
>>279 環境依存なので OS や GUI/CUI 別を明記しないと何とも言えないかと。
そして Win32 なら Win32 APIスレ、UNIX なら UNIX プログラミングスレに
行った方が良いと思う。
MS-DOSみたいな感じなんですよね・・・ユーザにコマンド打たせて それに応じた処理をする。ああいうのはやっぱりテーブル用意してるのかな?
60秒も待つならtimeで十分だろ。 精度1秒
timeより精度が低いclockってあるのか?
>>283 #define DISPATCH(command) else if(line == #command) exec_##command();
おお、Cチックにやるやり方ですね。
>>288 的に考えるとboost::preprocessorはCチックだ。
test
292 :
デフォルトの名無しさん :04/07/01 14:28
ちょっと教えてほしいのですが。 ネットワークプログラミングをしております。(そんな対したものじゃないんですが) そしてtelnetクライアントからコマンドを入力したら。そのコマンドに対応する 関数を呼び出したいのですが… if(strcmp(cmd,"Hello")==0){ ReturnHello(); }else if(strcmp(cmd, "ls")==0{ ReturnFileList(); }else if(strcmp(cmd, "cd")==0{ ChangeDir(); }(以下続く) 今現在、こんな風になっています。これでは効率が悪いとおもうのですが。 どなたかよい解決方法をご存知ないでしょうか…。 この長いif文はクラス内に記述されています。
やばっ。 ちょうどいい具合に上にヒントらしきものが…申し訳ありません…
c言語なんですが課題で出て、まじ分かんなくて助けてほしいです! このままじゃ赤点になってまう!! 二問あるけど、神な人教えて〜 1.各月の日数を格納した整数型の配列を定義してください。これを利用して、年、月、日を読み込んで、それが年の最初から何日目であるかを表示するプログラムを作成しましょう。 ただし、閏年の規則は、以下の規則で規定されるものとします。 @西暦の年号が4で割り切れる年は閏年。 A@には当てはまるが、西暦が100で割り切れる年は閏年ではない。 B@にもAにも当てはまるが、西暦が400で割り切れる年は閏年。 2.1に以下の機能を追加してください。 1のデータを表示したあとに、その年のその月のカレンダーを表示する機能。カレンダーはfor文の入れ子を使用してみましょう。(使わなくてもできますが。) その月の1日の曜日が分かれば、カレンダーを作成できます。曜日を調べるのには、以下の文をどこかに挿入してください。曜日を調べる部分は、関数にしてもかまいません。 曜日は、変数retに代入された値で分かります。次の通りです。 日曜日月曜日火曜日水曜日木曜日金曜日土曜日 0123456 int ret; if (m == 1 || m == 2) { y--; m += 12; } ret = (y + y/4 - y/100 + y/400 + (13*m+8)/5 + d) % 7; yは入力された年、mは入力された月,dは曜日を調べたい日です。1日の曜日を調べたいわけですから、このdには…
スレちがいすまそ…
296 :
デフォルトの名無しさん :04/07/01 15:59
引数で参照をつかうのとポインタを使うのに違いはあるの?
nullが突っ込めるかどうかだけ
>>296 ポインタだと NULL (0) を渡せる。
山椒でも*static_cast<T*>(0)で渡せるけどな
STL って、インターネットで公開されてるコードや、Microsoft とかのコードを見ても ほとんど見かけないんですが、何か理由があるのでしょうか? 知名度が低くて使われていないだけ?
>ほとんど見かけないんですが そうか? APIの解説ページとかならあまり使われはしないだろうが
>>301 がネタなのか釣りなのか天然なのかで答えが変わってくるけど
どれ?
わしの周りでもあんまりプロダクトに使ってる人居ない(Cから来た古い人に多い、でもjavaは早う1.5出ろいうのはどういうこと?) わしは便利なんでガシュガシュ使うんだけど。
STLは構文が汚いからね vecter<int> <>になじみが無い。
306 :
デフォルトの名無しさん :04/07/01 17:44
STLって、exeの容量が増えるってほんと?
309 :
デフォルトの名無しさん :04/07/01 18:01
>>305 stack<hoge, dequeue<hoge> >
templateの構文で嫌なのは stack<hoge, dequeue<hoge> > ^ これだけだな
>>301 Microsoft の VC では、ちょっと前のバージョンまであまりマトモに stl が動かなかったから、
Windows 用のコードで初出が古いものではあんまり使ってないと思う。
あと C プログラマ上がりの「C++プログラマ」は、stl 使わないというか使えない奴が多い。
いまだにtemplateを素で書けないw
テンプレートのないC++なんて...
>>312 vector<string> hoge;
程度で「デバッグシンボル永杉」とかワーニング吐くしなー。
機能には関係ないとはいえ、あれで気分的に萎えた奴もいると思われ。
ちなみに俺は、iostreamは使わないけどSTLは使う派。
iostreamはprintfより何倍も遅いしな
317 :
デフォルトの名無しさん :04/07/01 18:34
C++は正しいコードでもコンパイルが通らなかったりするのがヤダ。
>>319 ×int Income() {return salary * 12;}
○int Income() const {return salary * 12;}
>>319 SMan::ShowData は const メンバ関数なので、非 constなメンバ関数 Income は呼べません。
Income を const メンバ関数にすべきでしょう。
あと、const がらみでは、SetName のパラメータは const string& n とするのが通例です。
323 :
デフォルトの名無しさん :04/07/01 19:16
ショボイコンパイラ使ってるな。 行番号位出ないのかよ。 こんくらい情報が出るコンパイラ使えよ(g++)。 a.cpp:38: error: passing `const SMan' as `this' argument of `int SMan::Income()' discards qualifiers
325 :
デフォルトの名無しさん :04/07/01 19:51
-ansi -pedantic
>>325 g++は右翼っていうより左翼じゃない?
>>327 さいうよく [3] 【最右翼】
〔士官学校などで成績順に右から並んだことから〕競い合っているものの中で、最も有力なもの。
「今年度賞金王の―」
三省堂提供「大辞林第二版」より
>>325 は
>「'Income' : 'const class SMan' から 'class SMan &' へ 'this' ポインタを変換できません。
>変換で修飾子が失われます。」
こっちが最右翼(VC++)だと言ってるんだろ。
本当に行番号が出ないと思ってるっぽいのが笑える
行番号なんて出ないでいいしな
ミスッタ
>>300 それは未定義動作だが。いきなりプログラムが吹っ飛んでも文句言えんぞ。
鼻から悪魔が出てきても(ry
>>300 それは未定義動作だが。いきなりブッシュが核ボタン押しても文句言えんぞ。
>>300 ポインタ理解しててもそれは吐血するほど未定義だぞ
339 :
デフォルトの名無しさん :04/07/02 02:34
define ABC と値を指定しないでデファインするとABCの値は何になってるのでしょうか?。
340 :
デフォルトの名無しさん :04/07/02 02:39
>>339 そのABCを使ってみれば分かると思うが、なし。
341 :
デフォルトの名無しさん :04/07/02 13:26
お世話になります。 数値をstring型変数に代入するにはどうしたらよいでしょうか? いまはsprintfで変換してから代入しています。 int i = 100; string s; s = "abc = "; s += i; という使い方はどうすればよいですか?
s += i; を s += boost::lexical_cast <string> (i);
>>341 class stringex : public string
以下がんばる。
>>341 #!/usr/local/bin/pike
345 :
デフォルトの名無しさん :04/07/02 14:56
教えていただきたいのですが、 memsetっていうのはどういう働きをするのでしょうか? できれば、サルでもわかるような説明をお願いします。
メモリそのままのコピー
memcpyかw スマソ
教えていただきたいのですが、自分自身のクラス名を取得する方法ってあるのでしょうか? クラスの型名や、メンバ関数名の取得方法は理解できたのですが。。。
350 :
デフォルトの名無しさん :04/07/02 15:18
ありがとうございました☆ これを見て勉強します!!
「クラス名」と「クラスの型名」の違いは何ですか? typeid (hoge).name (); とかではなくて?
>>351 class hoge
{
public:
hoge(void);
virtual ~hoge(void);
};
hoge hogehoge;
だとすると 型名 hoge、変数名 hogehoge かと、
シロウトですみません。
インスタンス名
>>349 インチキですが,こんなのはどうでしょうか?
#include <iostream>
using namespace std;
class A {};
#define INSTANCE_NAME(arg) #arg
int main () {
A a;
cout << INSTANCE_NAME (a) << endl;
return 0;
}
そんな裏技があったのかw
>>355 こういう反応は一番嬉しいですね.
わたしはこんな風に使ってます.
#include <iostream>
#define DOUT(arg) {std::cout << #arg << ": " << arg << "\n";}
using namespace std;
class A
{
int value_;
public:
A (int p): value_ (p) {}
friend ostream &operator << (ostream &p_os, const A &p_a) {return p_os << p_a.value_;}
};
int main () {
A a (10);
DOUT (a);
return 0;
}
それはインスタンス名では?
ホントだ、変数名では無理か。 てっきりプリプロセッサが影でconstしてるのかと思った。
ところで
>>349 の「クラス名」と「クラスの型名」のちがいが
はっきりしてないんだが...
>>357 ,358
なになに?
352のhogehogeを取得したいのではないの?
実は例外処理で、同じクラス型からインスタンスを複数作り、 どのインスタンスでエラーが起きたか調べられるようにしたかったのですが。。。 typeid(*this).name; を使っても分かるのはクラス型名でインスタンス名じゃなさそう。
>>354 , 356
ありがとうございます、ユニークな方法ですね。w
でも例外処理で使うには、実行時にインスタンス名を知る必要があるみたいです。
#define INSTANCE_NAME(arg) #arg
を使うと、特定のインスタンスにしか対応できない。。。
__func__とか__FILE__みたいな組み込みマクロのように使える何かがあれば便利なんだけどな〜。
>>364 何だか状況が良く掴めませんが,
「手動でインスタンスのidを振れば解決するんだけど,
インスタンスのidくらい自動で振ってくれないかな?」ってことなんでしょうか?
class hoge { public: hoge(void); virtual ~hoge(void); void output(void); }; void hoge::output(void) { printf(インスタンス名 + '\n'); } hoge hoge_A; hoge hoge_B; main { hoge_A.output(); hoge_B.output(); return 0; } を実行した時に、 hoge_A hoge_B と出力される事を目指しています。
あ、いけね main じゃなくて main() ね。
>>366 それはフライパンに自分で料理作ってくれというようなもんだ。
インスタンスが 1 個だけなら上記の方法でもOKなんですが。。。 たくさんある場合は対応できない。
そういうプロパティを持たせればいい
デバッガ使えよ。 要はデバッグ用途だろ。
>>368 やっぱ無理?(TT)
そう都合よくいかないか。。。
デバッグって言うかトレースしたいんだろ
Hoge hogehoge; setInstanceNmae("hogehoge");
>>366 これじゃだめ?
#include <iostream>
#include <string>
using namespace std;
class hoge
{
string name;
public:
hoge(const string &p_name): name (p_name) {};
void output(void) {cout << name << endl;}
};
#define CREATE_HOGE(name) hoge name (#name)
CREATE_HOGE (hoge_A);
CREATE_HOGE (hoge_B);
int main () {
hoge_A.output();
hoge_B.output();
return 0;
}
>>372 無理。.NETならできそうな気がしないでもないような。
>>375 おお、お?
コンパイルしてみたらうまくいきました。
ソースの内容は難しくて理解できてませんが。。。
これを元に勉強させてもらいます。
ありがとうございました。
ス、スゲェ〜。
やってることは hoge hoge_A; hoge_A.name = "hoge_A"; でしかないわけだが。
配列の時はどうするつもりだろうか
むむ、コンストラクタの引数に "hoge_A" を渡して、 それが name に代入されている、のかな? hoge(const string &p_name): name (p_name) {}; こういう書式は初めて見た、コロンの後は何だろ? 配列ね。。この書式が理解できれば改造して何とか。 まだ理解できないが。(笑
>>380 > hoge(const string &p_name): name (p_name) {};
> こういう書式は初めて見た、コロンの後は何だろ?
コロンの後はメンバー変数の初期化です.
nameに対して,p_nameを引数にコピーコンストラクタが呼ばれます.
>>382 google してみました、コンストラクタ初期化子 っていうんだ、ふ〜ん。。。
よくまぁ、のうのうと初期化子を初めてみたなんて言えるな。 最低限、C++をひととおりマスターしてから質問しようとは思わないのかね。 ここは入門スレかよ。
完全な独学の場合、"自分が何を知らないか"を知らないんだよ。。。 正式にプログラミングの教育を受けた人には、その点で到底かなわないな。
プッ こんなところで玄人気取りかよ。みっともない
???、自分がシロウトであることを告白してる訳だが。 妙につっかかってくるね、荒らしかな?、なら無視だが。
>>385 逆じゃないの?
あ、日本での話ね。
米国の大学でコンピュータ工学の単位取ったとかなら、ありえるかも。
仕様書を読むか読まないかの違いでしょ
入手した参考書に全て書いてあるとは限らないし、 その書籍が不完全かどうか入手前に予測なんかできない。 正式に教育された人は、まずどんな知識があるのか、 先達から"知識の地図"をもらってから系統立てて学ぶでしょ。
最初に変な本手に入れるからいけない。 C++Primerを読み切るまでは我慢する。これ。
>>390 そんな教育受けたかったなあ。うちなんて・・・いやなんでもない。
次の方どうぞ。
393 :
デフォルトの名無しさん :04/07/02 19:40
>>390 例えばM社の製品についてならM社純正のセミナーと試験・資格があったりするが、
C++ の場合の「正式な教育」とは何のことを言ってるんだ?
勝手に勉強しろっていわれたんじゃなくて 授業やレクチャーを受けた奴のことを言うんじゃない
正式な教育と言うか、「筋のいい」or「センスのいい」教育を受けたい。
396 :
デフォルトの名無しさん :04/07/02 20:12
>>395 自分が受けた教育は「筋が悪い」or「センスのわるい」教育だったと言いたいわけか
基礎プログラム課程1年 各分野での応用プログラム課程1年(全分野必須) 様ざまな分野で実際に活動している複数の講師が開く少人数セミナー課程1年(複数選択) 実践的な専門課程で1年(単数or少数選択)+卒業研究 …と、これくらいやれば「正式な教育」といえるかな? 自分で書いてて受けたくなってきた。 逆にこういう学校作ったら、受けるかもね? (日本では無理?) 勤続年数の長い専属講師だけから受ける画一的な教育ってのが現状じゃないかな。
ここは入門スレかよ。
大作を志し10本挫折すれば、やっとどういうふうにいきあたりばったりなコードを書けば破綻するかわかってくる。
400 :
デフォルトの名無しさん :04/07/02 20:43
>>397 受けりゃいいじゃん
第一線で活躍してる技術者を拘束できりゃいいんなら
そいつが働いてる会社(?)へ行ってビジネスとして交渉すればいい
俺もやったよ
あるハードの開発担当者本人を1時間2万5千円で半日くらい
1年は予算的に無理だったがなw
402 :
デフォルトの名無しさん :04/07/02 21:12
禿にはセンスがない
404 :
デフォルトの名無しさん :04/07/02 21:26
C++界に於いて、これ以上「正式な」講座があるか?
>>401 export 宣言するか(コンパイラが対応してないとダメ) Game.cpp の定義を Game.h に直接書く。
>>405 アドバイスありがとうございます。
export宣言ってのはどのようにやればよいのでしょうか?
よろしければ教えていただけないでしょうか・・・
export template<class T> class Game 〜 んな感じ。でも殆どの処理系でサポートされてないからたぶん直接ヘッダに書く事になると思う。
Mao.cppの #include "Mao.h" を消して Mao.hで #include "Mao.cpp"
export template<class T> class Game{ private: T m; Hero h; public: Game(); void Play(); }; このようなエラーが出てしまいました。 Game.hをこのようにしたんですけど使い方が間違っているんでしょうかね・・・? f:\c++\挫折しないプログラミング\game.h(1) : error C2143: 構文エラー : ';' が ''template<'' の前に必要です。 f:\c++\挫折しないプログラミング\game.h(1) : error C2501: 'export' : 識別名を宣言するのに、型が指定されていません。
>処理系でサポートされてないから と思われ
>>410 どもです。
>>405 Game.cpp の定義を Game.h に直接書く場合はヘッダファイルは基のヘッダの定義の下にcppの内容をこぴーして貼り付ければよいでしょうか?
あとGame.cppの中はどうすればよいのでしょう。ヘッダファイルで定義してありますが同じ定義をしておけばよいのでしょうか?それとも何も書かないcppにするのでしょうか?
Game.cpp の最後に template class Game<Mao>; を追加でも可.
413は401のオリジナルソースに対して.
416 :
デフォルトの名無しさん :04/07/02 22:58
>>408 の方法を試したらエラーが102個検出されました。。。
全部のメソッドにinline指定入れろ
>>396 いや、今までは完全に独学。
だから、自分のいる位置に自信がもてない。
苦労も必要だと思うけど、やっぱり学習効率を考えたら
センスのいいレッスンを受けたいと今だから思える。
>>416 Mao.hの
****最後****
に #include "Mao.cpp"を追加。
>>413 のやりかたで動作しました。
ありがとうございます。
外部にあるテンプレートを使用したクラスを利用するときにはその内容を記述したcppの最後にtemplate class クラス名<ここの部分はなんていうんでしょう。。?>をつけてテンプレートを明示的にインスタンス化すればいいんですかね。
>>421 <ここの部分はなんていうんでしょう。。?>
テンプレート引数
STL は知ってたほうがいいというくらいのものでしょうか? それとも知らないと話にならないというくらいのレベルのものでしょうか?
真ん中くらい
自分だけで完結してるなら知らなくても何とかなるやつもいるが、 普通は知らないと話にならない
>423 STL,テンプレートなれるとすげぇ便利
>>423 仕事で C++ プログラミングやるなら、さすがに知らないと辛い。
いまさらSTLコンテナを使わないってのはありえないぐらいには便利。 STLアルゴリズム方面のほうが面白いが。
>>427 仕事でC++やってますが、STLなぞまったく使いませんが?
>430 ある意味尊敬する。ないならC++使う意味ない。C#のほうがまし
組み込みC++とかだとそもそもSTLが付いてなかったりする
>>430 あえて使わないのか
使っちゃダメなのか
もともと使えないのか
動的メモリ確保禁止の場合には使えんな
スタック使うカスタムアロケータ書けばいいんじゃないの?
もともと使えないのはただの馬鹿 あえて使わないのは大馬鹿
Boostを使うのはどうなの?
>437 つかっとけ。STLよりはマイナかも知らんが
>>432 それ C++ じゃなくて EC++ だったりしないか?
440 :
デフォルトの名無しさん :04/07/03 11:09
ここで言われたから無理やり使うのはすごい馬鹿 クラスも関数も使うかどうかは目的次第 どんなのがあるのかを知っておくことが そーゆーこと聞く人が今やるべきこと
441 :
デフォルトの名無しさん :04/07/03 11:21
javaで言うClassクラスを実現するにはどうしたらよいですか?
RTTI
Unko* unko = dramatic_cast<Unko*>(apple);
444 :
デフォルトの名無しさん :04/07/03 11:49
>>421 これでも良いって話で,明示的実体化はそんなには使わないんじゃないでしょうか.
普通exportがサポートされてないコンパイラでは,
(405,417)あるいは(408,417,420)のようにして,main関数のコンパイル時に
template<class T>Game<T>::Game()とtemplate<class T>void Game<T>::Play()の定義が
見えるようにして,(暗示的に)実体化するのが一般的だと思います.
- FNeko(){cout << "キャッツが現れた!\n"; Neko("キャッツ"), power = 10;} +FNeko(): Neko("キャッツ"), power (10) {cout << "キャッツが現れた!\n";}
>>405 >>408 >>420 のやり方だとエラーが出てしまいどうにも上手くいかんです。
全部インラインすると時間がかかりそうですし。。
>>413 の方法ならできるんですがあらかじめ使用する型を書いておかないといけないんですよね。
exportが使えれば楽なんですが、これ以上の解決策はないですかね。。。?
>>446 ついでに言うと
>Neko(string n){name = n;}
>void SetName(string n){name = n;}
は
Neko(const string& n){name = n;}
void SetName(const string& n){name = n;}
としたほうがいいと思うよ。
>>447 ありがとうございます。
- FNeko(){cout << "キャッツが現れた!\n"; Neko("キャッツ"), power = 10;}
+FNeko(): Neko("キャッツ"), power (10) {cout << "キャッツが現れた!\n";}
うえの違いってどこにあるんでしょう?
下のやり方は本でいきなり出てきたのでよくわからなかったので、今までどおり{}の中に必要な処理は全部まとめて書いても同じだと思ったんです。
>>448 実装省きましたが,こんな感じじゃないでしょうか.
################# Game.h ######################
template<class T>
class Game{
private:
T m;
Hero h;
public:
Game();
void Play();
};
#include "Game.cpp"
################# Game.h ######################
################# Game.cpp ######################
template<class T> inline Game<T>::Game() {}
template<class T> inline void Game<T>::Play() {}
################# Game.cpp ######################
>>448 エラーが102個出てしまいました。
Game.cppはこんなんです。
#include <iostream>
#include "Mao.h"
#include "Hero.h"
#include "Neko.h"
#include "FNeko.h"
#include "Game.h"
using namespace std;
template<class T> inline Game<T>::Game()
{
cout << "戦闘が始まります!がんばって!\n";
cout << "敵の残りエネルギー:" << m.GetEnergy() << '\n';
}
template<class T> inline void Game<T>::Play()
{
while(h.GetEnergy()>0){
if(m.GetEnergy()<=0){
break;
}
m.Attacked(h.Attack());
}
if(m.GetEnergy()>0){
cout << "敵は逃げました。終了します。\n";
}
}
これはもしかすると私の環境に問題があるんでしょうか?
VC++6.0proで下のパッチを当ててあります。
http://www.microsoft.com/downloads/details.aspx?FamilyID=a8494edb-2e89-4676-a16a-5c5477cb9713&displaylang=ja
>>450 > FNeko(){cout << "キャッツが現れた!\n"; Neko("キャッツ"), power = 10;}
これのNeko("キャッツ"), power = 10;では基底クラスの初期化は行なわれません.
Nekoクラスの名無しインスタンスが"キャッツ"を引数として作られ,
powerに10が代入され,
両者の間でoperator,が呼ばれることになります.
>>452 > #include "Mao.h"
> #include "Hero.h"
> #include "Neko.h"
> #include "FNeko.h"
> #include "Game.h"
> using namespace std;
これいらないです.
あと,coutはstd::coutに.
>>450 まともな入門書を通読するか、初心者スレに逝ってくれ
>>453 -両者の間でoperator,が呼ばれることになります.
+両者の返値間でoperator,が呼ばれることになります.
457 :
デフォルトの名無しさん :04/07/03 12:42
標準入力からの取り込みを以下の用にやっています。 #include<stdio.h> #define MAXLEN 256 char buff[MAXLEN]; intmain(){ int n; printf("Input Number >"); fscanf(buff, sizeof(buff), stdin); sscanf(buff, "%d", &n); 以下省略 ここで、標準入力の入力数がsizeof(buff)を超えていた場合のエラー処理 はどうすれば良いのでしょうか?よろしくお願いします。
あぁぁ、入力ミスしてました。fscanf → fgets #include<stdio.h> #define MAXLEN 256 char buff[MAXLEN]; intmain(){ int n; printf("Input Number >"); fgets(buff, sizeof(buff), stdin); sscanf(buff, "%d", &n); 以下省略 です。
>>458 スレ違いなのですか?C++のことなのですが…。
>>454 Game.cppの内容
template<class T> inline Game<T>::Game()
{
std::cout << "戦闘が始まります!がんばって!\n";
std::cout << "敵の残りエネルギー:" << m.GetEnergy() << '\n';
}
template<class T> inline void Game<T>::Play()
{
while(h.GetEnergy()>0){
if(m.GetEnergy()<=0){
break;
}
m.Attacked(h.Attack());
}
if(m.GetEnergy()>0){
std::cout << "敵は逃げました。終了します。\n";
}
}
Game.cpp
F:\C++\挫折しないプログラミング\Game.cpp(8) : error C2143: 構文エラー : ';' が '<' の前に必要です。
F:\C++\挫折しないプログラミング\Game.cpp(8) : error C2433: 'Game' : 'inline' はデータ宣言をするのに使用できません。
F:\C++\挫折しないプログラミング\Game.cpp(8) : error C2501: 'Game' : 識別名を宣言するのに、型が指定されていません。
F:\C++\挫折しないプログラミング\Game.cpp(8) : error C2059: 構文エラー : ';'
F:\C++\挫折しないプログラミング\Game.cpp(8) : error C2143: 構文エラー : ';' が '<' の前に必要です。
F:\C++\挫折しないプログラミング\Game.cpp(13) : error C2039: 'Play' : '`global namespace'' のメンバではありません。
F:\C++\挫折しないプログラミング\Game.cpp(14) : error C2143: 構文エラー : ';' が '{' の前に必要です。
F:\C++\挫折しないプログラミング\Game.cpp(14) : error C2447: '<L_PROPERTY>' : 関数ヘッダがありません (旧形式の仮引数リスト?)
こうなりました。
やはり環境がいけないんでしょうか?
テンプレートを明示的にインスタンスかするしかないですかね。。
>>440 > ここで言われたから無理やり使うのはすごい馬鹿
心配しなくてもそんなやつはいない。
>>463 Game.cppはコンパイルしないでください.
>>463 もし,.cppだと自動的にコンパイルされるようだったら,
Game.cppをGame_impl.hなどに変更して下さい.
内容的には初心者スレです.
>>466 メインでつかうcppをコンパイル、実行する際にどうしてもGame.cppもコンパイルしようとマシンがするんですが。。
>>467 ありがとうございます。
今まで読んできた入門書にはこのような方法は載っていなかったので。。
迷惑おかけしてスイマセン
470 :
デフォルトの名無しさん :04/07/03 13:17
上野にあるアドというブルセラショップはなくなってしまったのでしょうか? いま上野にいます。
>>470 上野にまだあるよ。というかショップ自体が膨張して上野になりました。
メモリリークを検出してくれるツールにはどういうのがありますか? できればプラットフォーム非依存で。 それが無理ならWindows限定で。 それからできればフリーで。
newとdeleteオーバーロードすればいいやん
>472 Windows限定なんでスレ違いなんだが、 _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); がお手軽。
475 :
デフォルトの名無しさん :04/07/04 20:01
DBからselectした結果をカラム名と値の組で map<string, string> cols; に格納しようと思っています。 ここで疑問ですが string で NULLを扱うにはどうしたらよいでしょうか?
476 :
デフォルトの名無しさん :04/07/04 20:33
ちょっと質問です。 C++プログラムはどの辺りまでマスターすれば、”C++をマスターした”と言えるのでしょうか? まぁ、”全部マスターしたら”と言われたらそれまでですが・・・。 それと、C++の次に覚えたら良いプログラムは何でしょうか? 変な質問ですが、どうかよろしくお願いします。
金になるモノを作れたらマスターしたと言っていいんじゃなイカ?
478 :
デフォルトの名無しさん :04/07/04 20:50
詐欺じゃなくてな
>>475 > string で NULLを扱うにはどうしたらよいでしょうか?
ありません。
そもそも map に格納しないか、あるいは map<string, std::pair<bool, string> > とかに
して NULL, 非 NULL のフラグを別に持って下さい。
__NULL__とか多分dbに無さそうなの入れとけば?
そういうときこそboost:optional
>>475 仕様に関わるがNULL文字と空文字を同扱いにするという方法もある。
>>480 のようにNULL定数を定義する方法もある。
この場合安全性を期すならNULL定数と一致する値が入力された場合にはエスケープすればよい。
後のことを考えるとcols自体をクライアントに露出しないほうがよいのは当然。
483 :
デフォルトの名無しさん :04/07/04 22:36
>>482 >NULL文字
スペル誤りのあたりから、ただならぬ腐臭が立ち込めている
485 :
デフォルトの名無しさん :04/07/04 22:41
>>484 おまえもすごい
血塗相か肪乱相クラスだ
かんべんしてくれ
>>401 で質問したものですが初歩的過ぎる質問に付き合ってくださった方々に感謝いたします。
>>488 たぶんC++(テンプレート)やる前にC言語をもういちど勉強しなおしたほうがいいと思う。
>>488 インスタンスの生存範囲を熟考して分かった事を述べよ。(30点)
ポリモーフィズムについて述べよ。またそれとテンプレートとの関係について動的、静的という言葉を用いて説明せよ(40点)
>まともな入門書 とりあえずダイテルかPrimerのどっちかを読み終わるまでは出入禁止。
>>488 >if文やswitch文の中でテンプレートクラスの宣言はできないのでしょうか?
これはできます.が,488でコンパイルできないのは490の指摘の通りです.
まず,if文の方がコンパイルできないのはコンパイラの指摘通りです.
> 魔王と戦う.cpp(44) : error C2065: 'g' : 定義されていない識別子です。
以下のコードで(b)のコメントを外してコンパイルを通そうとしていることになります.
class A {public: void func () {}};
int main () {
{
A a;
a.func (); // <-(a)
}
// a.func (); <-(b)
return 0;
}
switch文の方は,gの生存範囲がcaseごとではなくswitch全体であるからです. つまり,以下のコードで(b)のコメントを外してコンパイルを通そうとしていることになります. int main () { A a; // <-(a) // A a; // <-(b) return 0; } もしswitchを使うのであれば,{}を使って以下のようにスコープを切ってやるといいです. case 1: { Game<Mao, Hero> g; break; }
>>494-495 わかりやすくご丁寧にご指導いただきありがとうございます。
コンパイル実行することができました。
ダイテルって何?
最近C++の勉強しているんですが、参考にしている本のコードが汚く感じるんです。 class CCalc { int r; public: void Set(int x) {r = x;} } クラス定義ではこんな感じで、{ }が1行に収まっているのも違和感あるし、 cout << "加数は?"; cin >> x; 見たいな感じで1行に2つ以上の文を入れていることが結構あります。 ネットで何人かのコードを見させてもらった感じでは、{ }は結構あるのかなぁという 感じですが、cout << ; cin >> ;の方はやりすぎかなぁという印象を受けました。 C++では良くあることなんですか?
インラインメソッドでは普通じゃないですか? class A { int a; public: A() :a(0) { } } と書くよりは class A { int a; public: A() :a(0) {} } と書くだろうし。 OOだからGetterとかSetter書かなきゃいけないのにそんな無駄に行数増やしてもしょうがないし。 cout << ; cin >> ;の方はやりすぎ。
>>500 本だとページ数を抑えるためにやったりしてるのでは?
ネットの話だと、2chは投稿に行数制限あるからせざるを得なかったり。
インラインで{ }はありでも、やっぱその入出力はやりすぎですか。 ではこの本のスタイルはあまり真似しないようにします。 ありがとうございます。 もし、推奨されるスタイルのコードを閲覧できるサイトがあれば紹介してもらえないでしょうか?
>>501 >OOだからGetterとかSetter書かなきゃいけないのに
いらんこと書かなきゃボロが出ないのに……
>>505 いらんとこに触れなきゃ、スレも荒れないかも・・・
>>507 いらんこと書かなきゃボロが出ないのに……
>>507 「OOだから」という理由でgetter/setterを「書かなきゃいけない」というのがおかしいって話だろ。
>>509 iostream系が率先して無視してることになるね。
iostream系が率先して無視?
>>510 どういうこと?
iostream系のgetter/setterが提供されてる理由が「OOだから」ってことか?
ios::flags()みたいにメンバのIn/Outが同じ名前の関数があるって意味。 ちょっと話の本題からずれてしまったみたいなので、スルーしてちょうだい。
char s[ 256 ]; cin >> s; で、入力を 「a b」 とスペースを含む文にすると s に 「a」 としか読み込まれません。 この場合、s に「a b」と読み込まれるようにするにはどうすれば良いでしょうか?
>>515 string s;
getline (cin, s);
そのあと必要ならs.c_str()でconst char *を得られる。
#include <string> #include <iostream> namespace MyNameSpace { class MyAbstract { public: virtual ~MyAbstract(void) {}; virtual void fooBar(void) const = 0; //1 virtual const std::string toString(void) const { return getMark() + getName(); }; //2 protected: virtual const std::string getName(void) const = 0; //3 virtual const std::string getMark(void) const = 0; //4 }; class MyImpl : public MyAbstract { public: MyImpl(const std::string & name) : _name(name) {}; virtual ~MyImpl(void) {}; //5 virtual void fooBar(void) const { std::cout << "(^o^)" << std::endl; }; //6 protected: virtual inline const std::string getName(void) const { return _name; }; //7 virtual inline const std::string getMark(void) const { return MYMARK; }; //8 private: const std::string _name; static const std::string MYMARK; }; const std::string MyImpl::MYMARK("*"); }
519 :
(・∀・)ニヤニヤ ◆SKjzm2Ah6. :04/07/07 23:33
>>518 は今ちょこちょこっと書いたものです。まあだいたいの感じだけ。
でもって質問なんですけど、あとから継承するかもしれないので
こんな風に自作クラス内のメンバ関数は全部 virtual を付けてるんですけど、
これって間違ってますか?
2 とか 7 とか 8 とか、virtual にしちゃっても問題ないんでしょうか。
こういうときは virtual をはずせ、とかいうのはありますか?
>>519 > こういうときは virtual をはずせ、とかいうのはありますか?
そのクラスに仮想関数による動作がまったく必要なくて、
且つ、仮想関数テーブルの存在によって無視できない問題が発生するとき。
>virtual inline ってあるけど仮想関数はinline展開されねーぞ
>>522 MyImpl mi;
mi.fooBar();
と書いたときしかされないだろ。
でこんな使い方はこの場合そんなに無いだろ。
MyAbstractを定義してあるくらいだし。
>>519 2・3・4の間でTemplate Methodパターンを成立させるつもりなら2は外す。
3と4には個別にきちんとした意味があり、
2はMyAbstractでたまたまこう実装されているだけなら外さない。
(まあtoString()ならvirtualで正しいだろう。)
7・8はvirtualと記述しなくても基底クラスの定義を受けて自動的にvirtualになる。
virtualでないときにMyImplの派生クラスをつくってgetName()をオーバーライドし、
その派生クラスのオブジェクトに対してMyImpl*経由でgetName()を呼び出したときでも、
virtual扱いで派生クラスのメンバ関数が呼ばれる。
>>521 >>523 > 仮想関数はinline展開されねーぞ
なるほどー。MyAbstract 経由で呼んだらそうなるわけですね。。
>>525 > virtualと記述しなくても基底クラスの定義を受けて自動的にvirtualになる。
それは知りませんでした。。
てっきり派生クラスで virtual を外したら virtual じゃなくなるものかと。。
C++ Primer の virtual 関連のあたりをもう一度読んでみます。
ほんじゃあ、行ってきまーす☆
BCC551を使っています。 仮想関数がインライン関数になれないことは理屈でわかるのですが、 例えば virtual void foo() {} このような書き方をしても、普段口うるさいBCCでさえ特に何も 文句を言ってきません。他の処理系ではどうか分からないですが、 ネット上に置かれているソースでも、結構このような書き方を 見かけます。このような書き方に対して、C++処理系がどう振舞う べきか規格では明確に触れられているのでしょうか
クラス定義中に本体を実装してもインライン展開されるとは限らない。 inline付けてもインライン展開されるとは限らない。 virtual メソッドが絶対にインライン展開されないとも限らない。
>>528 そうなんですよね
インライン展開できないケースでは、BCC は丁寧に展開できない
理由まで述べて、その旨の警告を発するので、あえて出さない
のには、何か規格上の理由があるからなのだろうかと思ったので。
>>527 もちろん明確に触れられている。
インライン展開が可能であれば、インライン展開しても良いし、しなくても良い。
>仮想関数がインライン関数になれないことは理屈でわかるのですが、
なれないことは無い。例えば:
class base {
public: virtual void run() {};
};
class derived : public base {
public: virtual void run() { if (...) base::run(); };
};
というような、ごくありがちでかつインライン展開可能な例なんかもある。
ああ根本的なところで誤解してたんですね… 納得がいきました。 ≫virtual メソッドが絶対にインライン展開されないとも限らない。 ≫>仮想関数がインライン関数になれないことは理屈でわかるのですが、 ≫なれないことは無い。
hoshu
プログラムを書くときUML等を使って設計していますか? ここの住人的UMLの重要性を教えていただけません?
>>533 客への納品物の一種。
紙数を稼ぐのに使う。
設計書と同様、ハッタリ。
>>533 ユースケースは絶対に書く、
これ顧客の要望の確認でもあるので必須
あるファイルと同じディレクトリにあるファイル全てに対して同じ操作(具体的にはテキストファイル中の 単語の出現頻度を調べる)をしたいのですが、何かいい方法はありませんか?
boost::filesystemとかどうよ
思いっきり環境依存だしC++よりスクリプト書いたほうが早そうだな
>>537 ググってもよくわかりませんでした。すみません。
>>538 とりあえずVisual C++で作れればどんな方法でも構わないです。
>>539 やはり環境依存ですか。UNIXのシェルスクリプトなら少しは書けるから、
できればそちらでやりたいんですけど、VC++でWindows用に作るように言われてまして…
リナならシェルスクリプトで簡単に書けるな
Singleton パターンを使いたいんですけど、 static MyClass * getSingleton() で static MyClass * m_inst を返すようにすると、 だれも delete する人がいませんよね? static void deleteSingleton() とか作って 使った人が自分で消すようにしちゃうと、 じゃあ他の人が使ってたらどうするの? ってことになっちゃうし・・・ 参照カウンタとか shared_ptr とか使わないと まともな Singleton 実装はできないんでしょうか? それともプログラム実行中はずっと生かしておくのが 普通の使い方なんでしょうか? 酒が入ってるのでうまく伝わらないかも知れませんが、 よろしくね♪ 以上、高卒童貞22歳サラリーマンでした☆
>>542 参照カウンタはシングルトンに使えない。
{
SmartPtr p=Singleton::inst();
p->foo();
}
{
SmartPtr p=Singleton::inst();
p->bar();
}
こういう使い方されたら生成->破棄->生成->破棄と忙しい。
544 :
デフォルトの名無しさん :04/07/11 20:55
>>542 キャップがないと削除できないよね?
でも削除人をこき使っちゃうと
じゃあ削除権持ってるのと同じになるの?
たらこが削除人をうまく教育すればいいだけだろ
おめーが書いたクラスに対してはおめーがたらこだ
別に荒らされたまま放っとくのが普通の管理じゃねーべよ
ゴメン、やっぱ↑の嘘。聞き流して。
546 :
デフォルトの名無しさん :04/07/11 20:59
>>542 全メンバが static で main が friend なんて見かけたことあるが・・・。
>>542 逃げ方としてはvirtualなデストラクタを持つクラスを一個つくってそれを継承したシングルトンにしておく
んでもってグローバル変数で定義した後始末クラスのインスタンスにSingleton生成時に登録しておく
プログラム終了時にグローバル変数のデストラクタが呼ばれるのでそのなかでdeleteする。
>>542 newしなきゃいいじゃない
static MyClass * getSingleton()
{
static MyClass instance;
return &instance;
}
じゃいかんか?
マルチスレッド対策はおくとして。
ご回答ありがとうございます!
>>543 >参照カウンタはシングルトンに使えない
>生成->破棄->生成->破棄と忙しい
理論的に使えないってわけじゃなくって
効率の問題ですよね?
漏れさんはときどきまとめて
String name = MyClass::getSingleton()->getName();
String mark = MyClass::getSingleton()->getMark();
String uhi = MyClass::getSingleton()->getUhi();
とかしたいだけなんです。。。
>>547 >プログラム終了時に
ってことなら明示的に delete する必要ってあるんでしょうか。。
まあ大したことないインスタンスだから最後まで
生き残ってたっていいんですけどー、
果たして C++ 的にそれが真っ当なことなのか
疑問だったわけです。
あ、新しいご回答を見落としてました。
>>548 C/C++ は始めたばっかりで、関数の中の static 変数なんて
使ったことありませんでした。
Singleton の実装ってそういう風にしてもいいんですか。
・・・でも結局インスタンスはプログラムの最後まで
消えないと理解していいんでしょうか。。
> String name = MyClass::getSingleton()->getName(); > String mark = MyClass::getSingleton()->getMark(); > String uhi = MyClass::getSingleton()->getUhi(); > とかしたいだけなんです。。。 なんでgetSingleton()を繰り返したいの? ローカルに参照置いてほしいなぁ。
>>547 >んでもってグローバル変数で定義した後始末クラスのインスタンスにSingleton生成時に登録しておく
後始末クラスの変わりにatexit使うのものもいいかも.
>>550 >>548 の場合なら関数呼出時からプログラムの最後まで残る
寿命を管理したいなら明示的にcreate&destroyすればよい
寿命がいつ切れるかわからないけど切れたときにはdestroyしたいってのは
Singletonには向かないだろう
Exceptionクラスの設計しているんだけど、スタック関係の設計とライン行、ファイル名の出力が上手くいかないんす。 わからないところ 1)スタックはどこで管理するの? 個々のExceptionクラスにあったらダメだし・・・。 今はなぜかリスト構造になってる。JavaのThrowableみたいなクラスが管理するのかなぁ? 2)Exceptionを呼ぶ側が__LINE__とか__FILE__とか意識せずに呼び出して、あとは トレースかけたときに全て出力されるような実装にしたい。 教えてエロイ人。 (今はオーバーロードしてガンがってたんだけど、少しも美しくない上にこの先 Exceptionの継承先で困るだろうから・・・)
>>553 >寿命がいつ切れるかわからないけど切れたときにはdestroyしたいってのは
>Singletonには向かないだろう
ふーん、じゃあやっぱり C++ は Java には勝てないんですね。
酔っぱらってるからもう寝ちゃいます。おやすみねー♪
sageで質問してまった、ageます。
557 :
デフォルトの名無しさん :04/07/11 22:49
↑ なにをいまさら・・・
558 :
デフォルトの名無しさん :04/07/11 22:51
>>557 なにが今更だよ。1分しか経っていないだろ。
559 :
デフォルトの名無しさん :04/07/11 22:54
↑ アフォハケーン
560 :
デフォルトの名無しさん :04/07/11 22:58
>>553 まぁ、敢えてやるなら boost::shared_ptr とか。お勧めはしないが。
Javaだって消える保証あるの? JavaのGCは参照カウント方式って聞いたけど
>>554 スタックの管理って何するの?
ふつうのC++例外クラスを設計するときには、はスタックのことなんか意識しないよ。
あと、「トレースかけたとき」も何のことだかよくわからない。
>>565 まあ、実はJavaのExceptionクラスをC++に移植しようと思ってるんです。
最初は俺様設計だったんですけど、まあ勉強と言う事で。
スタックはExceptionを呼んでcatchしてまた呼んで・・・とやるときに
呼ばれたException順に分るようにする設計思想です。
「トレースかけたとき」と言うのはExceptionの種類・メッセージ・ファイル名・行の情報を
コンソールなり、デバッガなりに出力する事です。
>>562 多分
>>542 はぼけだからJavaもよく分かってないんでしょう
コレクションされるためには
m_inst = null;
としなければならない。
そうでなければプログラムの最後まで消えない。
もしどこかでそうするなら、それはC++でdeleteを呼んでいるのと同じ。
結局Javaのほうがぼけが育ちやすいということで了。
>>565 printStackTrace()とかのことっしょ。
呼出スタックはC++としては持ってないんじゃないの?
持ってるとしたら実行環境でしょう。
Javaは言語と実行環境が一体化してるからその違いを見極められんのかもしれんが。
>>569 そこを何とかC++に移植したいんですけど・・・(^^;
スタックの方はおそらくExceptionクラスの親クラスを作ってやる必要があることが分ってきました。
あとはファイル名・行番号出力なんですけど・・・。
オーバーロードと関数の初期引数に指定して何とかするぐらいしか思いつかない。後はマクロですか・・・?
>>570 あとはファイル名・行番号出力なんですけど・・・。
あきらめろ。
処理系依存なら、できる奴もあるかもしれないけど。
>>572 処理系依存処理系依存ってうるせーんだよ。
てめーはCスレに逝けバーカ。
class base{ public: virtual a( char c )=0; public: a( int i ); }; class foo{ public: a( char c ); }; void main() { foo f; } こうするとベースクラスの純粋仮想関数じゃないほうの a( int i )が見えなくなっちゃうんだけど、どうにもならん?
>>572 処理系はVC++です。
かなり重要な部分なのでそう簡単に諦めれませんけど(^^;
まあ、最悪Exception投げるタイミングで__LINE__と__FILE__を記述するのか・・・(泣
>>570 行番号、ファイル名を使うならマクロを使うことになるだろう。
マクロを使うことになると、派生した例外クラスをどう扱うかが問題になるだろう。
C++はJavaではないということを受け入れたほうが楽になれるだろう。
>>573 お前はHSPスレに行きなさい。そこがお似合い。
578 :
デフォルトの名無しさん :04/07/11 23:36
>>576 よくいるよな、ちょっと似てるからって継承にしたがる単純ヴァカ
>>566 >スタックはExceptionを呼んでcatchしてまた呼んで・・・とやるときに
>呼ばれたException順に分るようにする設計思想です。
この部分に非常にひっかかるんだが。
それはスタックじゃなくて「発生源となったException」のほうじゃないか?
フィールド名称は忘れたが、Exceptionを引数にとるコンストラクタが関係するやつ。
#define THROW(exception_type) throw exeption_type(__FILE__,__LINE__)
581 :
デフォルトの名無しさん :04/07/11 23:39
582 :
デフォルトの名無しさん :04/07/11 23:40
>>574 ∧ ∧ ┌─────────────
( ´ー`) < ミエネーヨ
\ < └───/|────────
\.\______//
\ /
∪∪ ̄∪∪
何の関係もねーだろ、てりめーだヴァカ
# 言い方キツい理由わかるかな?
まだ寝ないで小泉自民の逆転劇を見ようとしています。
>>567 >多分
>>542 はぼけだからJavaもよく分かってないんでしょう
>コレクションされるためには
>m_inst = null;
>としなければならない。
なるほどね! C++ (1ヶ月学習で実戦配備中) は
最後に delete しなきゃいけなくて、
Java (半年学習。実務経験なし) に比べると
マンドクサイと思ってましたが、Singleton に関しては
別に大差なかったんですね。
とにかく今は delete が嫌いでして、
try {
array<MyClass *> uhi = createMyClasses();
for (int i = 0, n = uhi.size(); i < n; i++) {
uhi[i].uhirinko();
}
} catch (...)
for (int i = 0, n = uhi.size(); i < n; i++) {
delete uhi[i];
}
throw;
}
for (int i = 0, n = uhi.size(); i < n; i++) {
delete uhi[i];
}
585 :
デフォルトの名無しさん :04/07/11 23:43
>>576 そうでつか・・・、まあ、地道に呼び出し側で書いておきます・・・
>>578 単純ヴァカか・・・。単純ヴァカは良いぞ。色々得するから。
>>579 それです(w
おそらくJavaではExceptionをスタックに詰めていると思われたんで。
説明下手でスマソ。
あ、途中で書き込んでしまった。
>>584 とかみたいに書かなくて済むようにするために
デストラクタで for ... { delete uhi[i]; } する
MyArray を作って
MyArray<MyClass *> uhi = createMyClasses();
for (int i = 0, n = uhi.size(); i < n; i++) {
uhi[i].uhirinko();
}
コードをこれだけに抑えてたりしてるんですけどね。
あとは boostとか使えないから auto_ptr だけ自作したりもしてます。
ほんじゃあ、今度こそおやすみね〜♪
>>584 そういうときはスマートポインタかなんか使ってくれ。
普通のC++使いから見たら身の毛がよだつぞ。
なんのためにデストラクタがあるか考えてくれ。
auto_ptr。。。
>>582 記述ミスくらい許したれよ
usingでどうにかならんかったっけか?
>>590 なんか文句でも?
shared_ptr なんて高級なもんは作れねーよ、バーロー!
明日から会社かー、もういやだよー。
あ、うそうそ。
>>592 は取り消します。
みんな忘れてね。ほんじゃあ、おやすみね〜♪(三回目)
>>593 あー、ちょっと間違えただけ。
ほんとは try の前で array だけ宣言してるの。。
>>592 そのaut_ptrはコンテナにいれるんだぞ。
約束だぞ(はぁと
598 :
デフォルトの名無しさん :04/07/11 23:56
>>591 記述ミスは許してるよ
記述ミスに至る過程を責めている
>>597 コンテナってなあに?【ピュア】(←古っ!)
vectorやmapとか
>>600 あそっか。
てか、
>>597 の意味がまだ理解できないのは
漏れの脳みそが非可逆的に腐っているからでしょうか。。
可逆も何も元からという説もありますが、、、
だれか教えてね(はぁと
いつになったら去ってくれるんだろう・・・
>>603 もうちょっとだけ!
>>597 の意味が分からないと気になって
眠れなくて明日会社に行けません。
よろしくお願いします!!
MyArray< std::auto_ptr<MyClass> > uhi; つーことだな
落とし穴があるから気をつけて使わないとハマるな。
>>604 C++標準化委員会が不正としている
詳しくはEfffective STL を嫁
こいつ((・∀・)ニヤニヤ ◆SKjzm2Ah6.)が言ってる「auto_ptr」は自作のやつだからな〜。 そのギャグは通じんかもしれん。 参照カウンタとか上手く使ってれば耐えられるだろうな。 STLのコピーのセマンティクスを理解してるかどうかが鍵。あとauto_ptrのそれと。
>>575 スタックフレームポインタを最適化で消さないこと前提なら、%ebp レジスタから
スタックフレームアドレスを順に取り出していき、スタック先頭までさかのぼる。
で、あとはデバッグ用のシンボルテーブルファイルと照らし合わせて解析。
っつーか VC 使うなら、デバッガの機能使えば自前で書く必要ないはずだが。
自分は自作の参照カウンタつきポインタ使ってるけど、auto_ptr使ってる奴の気がしれん。 あんなのスコープ内でしか使えないじゃない(実質的に)
ソース関数から所有権もらうときとか, シンク関数へ所有権放り投げるときとか使いません? (というかそういう所有権が移動する使い方を本来想定しているはず・・・多分) スコープで自動deleteして欲しいだけなら それこそscoped_ptrってそのまんまの名前のヤツがboostに・・・
>613 基本的にすべてオブジェクト作るときに参照カウントにぶっこんでたんで、その辺は普段まったく気にしないで使ってた。 し気にしないで使えてる。
参照カウントあるならそれで全然問題無しですねぇ・・・ やっぱauto_ptrは不要って思っている人多いのかな?
#include <exception> #include <iosfwd> #include "boost/shared_ptr.hpp" class JavaLikeExceptionBase : public std::exception { public: typedef boost::shared_ptr< std::exception > native_type; JavaLikeExceptionBase( native_type native , char const file[] , int line ); JavaLikeExceptionBase( native_type native , char const file[] , int line , JavaLikeExceptionBase const& wrapping ); ~JavaLikeExceptionBase() throw(); virtual char const* what() const throw(); void trace( std::ostream& out ) const; private: native_type m_native; char const* m_file; int m_line; boost::shared_ptr< JavaLikeExceptionBase > m_wrapping; };
#include "JavaLikeExceptionBase.hpp" #include <ostream> JavaLikeExceptionBase::JavaLikeExceptionBase( native_type native , char const file[] , int line ) : m_native( native ) , m_file( file ) , m_line( line ) , m_wrapping() { } JavaLikeExceptionBase::JavaLikeExceptionBase( native_type native , char const file[] , int line , JavaLikeExceptionBase const& wrapping ) : m_native( native ) , m_file( file ) , m_line( line ) , m_wrapping( new JavaLikeExceptionBase( wrapping ) ) { } JavaLikeExceptionBase::~JavaLikeExceptionBase() throw() { } char const* JavaLikeExceptionBase::what() const throw() { return m_native->what(); } void JavaLikeExceptionBase::trace( std::ostream& out ) const { out << m_file << "(" << m_line << "): " << what() << std::endl; if( m_wrapping ) m_wrapping->trace( out ); }
scoped_ptr代わりにしか使わないな>auto_ptr
#include "JavaLikeExceptionBase.hpp" template< typename CplusplusException > class JavaLikeException : public JavaLikeExceptionBase { public: JavaLikeException( JavaLikeExceptionBase const& base ) : JavaLikeExceptionBase( base ) {} }; template< typename CplusplusException > JavaLikeException< CplusplusException > makeJavaLikeException( CplusplusException* native , char const file[] , int line ) { boost::shared_ptr< std::exception > const safe( native ); return JavaLikeException< CplusplusException >( JavaLikeExceptionBase( safe , file , line ) ); } template< typename CplusplusException > JavaLikeException< CplusplusException > makeJavaLikeException( CplusplusException* native , char const file[] , int line , JavaLikeExceptionBase const& wrapping ) { boost::shared_ptr< std::exception > const safe( native ); return JavaLikeException< CplusplusException >( JavaLikeExceptionBase( safe , file , line , wrapping ) ); } #define THROW_JAVA_LIKE_EXCEPTION( newCplusplusExceotion ) \ throw makeJavaLikeException( newCplusplusExceotion , __FILE__ , __LINE__ ) #define RETHROW_JAVA_LIKE_EXCEPTION( newCplusplusExceotion , wrappedJavaLikeException ) \ throw makeJavaLikeException( newCplusplusExceotion , __FILE__ , __LINE__ , wrappedJavaLikeException )
#include <exception> #include <stdexcept> #include <iostream> #include "JavaLikeException.hpp" int main() { try { try { THROW_JAVA_LIKE_EXCEPTION( new std::runtime_error( "origin" ) ); } catch( JavaLikeException< std::runtime_error > e ) { RETHROW_JAVA_LIKE_EXCEPTION( new std::runtime_error( "wrap" ) , e ); } } catch( JavaLikeExceptionBase e ) { e.trace( std::cerr ); } }
むしゃくしゃしてやった。 別にJavaっぽくなくてもよかった。 今は反省している。
622 :
デフォルトの名無しさん :04/07/12 00:56
>JavaLike スレ違い JavaでもC++でもない独自言語はスレ立てるべきでもない 自前のサーバーでやってろ
例外ってconst参照で受けなくて言いの?
Javaかよw
>>623 参照では受けるがconstである必要はない。
回復情報や追加情報をのせて再送することも、もしかすると、あるかも知れん。
参照でなくてもいいじゃん
auto_ptr は関数の戻り値に使うことが多いし、 const つけて、scoped_ptr の代わりにも使う。 shred_ptr のコンストラクタに auto_ptr を受け取るものもあるし。 結構便利に使ってる。
629 :
デフォルトの名無しさん :04/07/12 10:13
>>574 ,591
fooに
using base:a;
class foo: public base {
listとvectorってみんなどっち使ってます? もちろん、適切な方がある場合はそっちを使うべきだけど どっちでもいい場合はどっち使う人がおおいのかなーと。
634 :
デフォルトの名無しさん :04/07/12 21:02
速度面で末尾での追加削除が起こるだけでもvectorよりdequeの方が速い事実は知らない人が多い。
じゃあvectorって何?
640 :
デフォルトの名無しさん :04/07/12 21:25
複数のコンテナに共通する機能しか使わないときに vector もクソもあるか ぼけ
vectorの方が消費メモリが少ない事がある。 vectorはCAPIと互換性がある。
>CAPIと互換性がある。 たまにcharのバッファとして使ってるの見るとちょっとびっくりする。 どうもなれないな。
VC6+STLPortだと2倍くらいvectorのほうが速いよ
vectorもちゃんとreserveすればdequeと変わらないよ。 要素数が予測できない時はdequeのが全然速いよ。
定数オーダーでランダムアクセスしたいときと、あらかじめ個数が分かってて 明らかにコスト低そうなときしか vector は使わないな・・・
dequeも定数オーダーでランダムアクセスできるよ
だからコンテナくらい自分で作ってチューニングしろと。
そんな無意味な事しないよ・・STLになかったらboost探すし
treeコンテナも標準で付いてねえのかよC++は
>>647 allocatorだけじゃなくてコンテナも自前で作るの?
プロなら当然だろ
コンテナなんていってないでコンパイラも作ってくださいよ
現場で「オレの作ったコンテナの方がスゴイから俺コンテナを使ってくれ」 と言えればねぇ
>654 問答無用で却下ですね。 俺参照カウントつきポインターは使わしてるが
deque のメモリレイアウトが未だに分からないオレ。 vector 見たいに一直線に並んでるわけじゃなさそうだし… deque の中の人は何やってるんだ?
>>582 きもい。
class base{
public: virtual void a( char c )=0;
public: void a( int i );
};
class foo : public base{
public: void a( char c );
};
void main()
{
foo f;
}
これでいいか?
-public: virtual void a( char c )=0; +using base::a;
class A { // 省略 public: template<class T> T foo() { return reinterpret_cast<T>(hoge); } }; A a; a.foo<int>(); これがコンパイルできないのはVC6.0のせいですか?
>>662 error C2062: 型 'int' は不要です。
失礼
>>663 が出るのは a.foo<int>(); のところです。
>>661 class A
{
// 省略
public:
template<class T>
T foo(T) { return reinterpret_cast<T>(hoge); }
};
A a;
a.foo(int ());
VC6.0持ってないんだけど
じゃだめかい?
>>666 fooのキャストのところで
error C2440: 'reinterpret_cast' : 'int' から 'int' に変換することはできません。
がでましたが、Cスタイルのキャストにすることで通りました。
つかintからintに変換できないなんて…
.NET欲しいです。
reinterpret_castってポインタにしか使えないんじゃなかったっけ?
文 reinterpret_cast< T >(arg)で は, ポインタ,参照,算術型,関数へのポインタ,またはメンバーへのポインタでなければなりません。 ポインタは整数型に明示的に変換できます。 整数 arg はポインタに変換できます。ポインタを整数型に変換した後, 同じポインタ型に変換しなおすと結果は元の値になります。 未定義のクラスをポインタ変換あるいは参照変換で使えます。 関数へのポインタは,オブジェクトのポインタ型が関数ポインタを保持するのに必要なビットを持つ場合, 明示的にオブジェクト型へのポインタに変換できます。オブジェクト型へのポインタは, 関数のポインタ型がオブジェクトポインタを保持できる大きさである場合にのみ, 明示的に関数へのポインタに変換できます。
>>668 本当だ.
661にはhogeの型が書いてなかったので,
適当にprivateセクションに
int hoge;
を補ってやってた.
g++だと
reinterpret_cast <int> (double ());
はエラー出すけど,
reinterpret_cast <int> (int ());
は出さない.
668の見解だと後者はエラー出すべきなのかな?
呼び出し側のテストなら template<class T> T foo(); で十分だろ。
>>661 667をみるにhogeがintなら,
そこは何故reinterpret_castなの?
static_castのような気がするんだけど.
STLは今後死滅しますか? 死滅しないまでもアルゴリズム一般の勉強をしたほうがマシですか?
STLの死滅とC++の死滅は同時だろうな。
>>674 STLの命運はC++の命運より長い気はする。
二行目は文の接続が変じゃない?
>>675 結婚と思いきや意見が分かれますね。
離婚?!
678 :
デフォルトの名無しさん :04/07/13 13:39
void f() throw(); のthrow()って何ですか 関数の中で例外投げますよって意味? それとも関数の中で処理しなかった例外は呼び出し元に任せますよって意味??
C++では意味無いから覚えても意味無い
ありがとうございます まるっきり逆だったのか…
>>678 それを付けると例外クリーンアップコードを挿入しなくなるので速度&サイズ共に
わずかに上がるはず。しかし実際に試してみたら差がなかった。環境にもよると
思うが。組み込みに使う時は付けろ付けろとうるさい。
>組み込みに使う時は付けろ付けろとうるさい。 コンパイラが?
operatorの継承ってできないのでしょうか?
operatorはオブジェクトじゃないからな。
>>686 はたぶんoperator=が継承されなくて悩んでるんだと思われ。
=は出来ないのが仕様。
690 :
デフォルトの名無しさん :04/07/13 21:41
>>686 operator=は定義しなくてもデフォルトの関数が暗黙に定義されるよな?
それで継承したやつが隠されてるんだよ
double と float ってどっちの方が高速に計算できますか?
旧処理系ならdoubleの方が速いが、今はどちらも同じ ってとこかな
693 :
デフォルトの名無しさん :04/07/13 21:57
>>691 処理系による
処理系Aでの結果を処理系Bでの必然と錯覚するアフォが後を絶たない
694 :
デフォルトの名無しさん :04/07/13 21:59
>>683 パフォーマンスが落ちることもあるよ。「上がるはず」とは言えない。
効果は同じでもfloatを引数に取る関数とfloatを引数に取る関数とがあったら そこをちゃんと区別しないといちいち変換が掛かって効率が悪くなる。 ただしどれぐらい違ってくるかはわからないが。
CMyClass& operator=(int i) { CSuperClass::operator=(i); return *this; }
700 :
デフォルトの名無しさん :04/07/13 22:29
700get
701 :
デフォルトの名無しさん :04/07/13 22:55
猫 動物 哺乳類 桃 植物 蛇 動物 爬虫類 犬 動物 哺乳類 ・・・ ・・・ ・・・ mona.txtというファイルにこのようなTABおよび改行で 区切られた文字列が存在する場合、 a[0][0] 猫 a[0][1] 動物 a[0][2] 哺乳類 a[1][0] 桃 a[1][1] 植物 a[2][0] 蛇 a[2][1] 動物 a[2][2] 爬虫類 ・・・ ・・・ ・・・ のように2次元配列にするには、どうすればいいですか。
>>698 strcut Derived: Base
{
using Base::operator=;
};
705 :
デフォルトの名無しさん :04/07/13 23:21
Cでは、出力するとき、 printf(""); を使って、C++では、 cout << "" ; を使うことを最近知ったんですが、 microsoft visual C++ 6.0を使っていたのでC++でプログラミング していると思っていました。 けど、printfを使っています。 これはCを使っていると言うことなんでしょうか??
C++はCのライブラリも使えるということはご存知?
707 :
デフォルトの名無しさん :04/07/13 23:28
いや知らないです。 と言うことは、coutでもprintfでもつかえるということですか?
>>707 double d=1.23;
printf( "%4.2f", d);
をcoutでやろうとしたらどうなるか知ってますか?
709 :
デフォルトの名無しさん :04/07/13 23:48
すいませんよく分からないです。 ためしにやってみたけどcoutが使えなかったです。
711 :
デフォルトの名無しさん :04/07/14 00:03
・・・分からなかったです。
実は私も知らない...orz
拡張子
double d=1.23; char s[ 64]; sprintf( s, "%4.2f", d); cout << s; 違うかな? 私ならはじめからprintf()使います...orz
>>715 かろうじてprintf()使ってない感じで
ワロタ
>>708 まじめにやるとこんな感じかな(boost使う場合と使わない場合の両方で)
#include <iostream>
#include <iomanip>
#include <boost/format.hpp>
int main(){
double d=1.23;
std::cout << std::fixed<<std::setw(4)<<std::setprecision(2) << d << std::endl;
std::cout << boost::format("%4.2f\n") % d;
return 0;
}
まぁprintfマンセーということで。
型安全じゃないとか、欠点も数多いが、なんだかんだ言っても、 やっぱり単純に便利なんだよprintfは。
私はやっぱりprintf()使うことにします。
722 :
デフォルトの名無しさん :04/07/14 01:33
boostなんて糞 遅すぎてつかいものにならん
使いどころを見つけるのがめちゃくちゃ下手糞なんですね ;-)
boostが、遅い? ・・・あぁ、リリーススケジュールのことか。
稲葉さんこんばんわ
boost::spiritはコンパイルが遅すぎだね。
boostはどこまで巨大化していくんだろう? 10年後にはえらいことになってそうな気が。
前、cppll BBS で、こんなの見つけた。 double d = 1.23; cout << ( "d = " % _f["4.2"] )( d ) << endl;
>>727 ライブラリの巨大さとバイナリ出力ファイルのサイズへの影響を誤解する馬鹿も増えてそう。
そんな馬鹿が増えると心配する馬鹿は
>>729 だけ。
や、やっぱりprintf()が最強でしゅね。
>>730 現時点でも多いけどな、テンプレートの特性を知らないアフォ。
export
すげえ。ダイナミックリンク(ry
import
impo orz
>>692 あとはハードウェアにもよる。PlayStation 2 なんかだとコストを削減するため
数値演算コプロセッサは単精度浮動小数点演算のみのサポート。倍精度は
ソフトウェア的に処理するからムチャクチャ遅い。
クラスAを グローバルとクラスBのメンバとして宣言するために クラスAの定義を書いたヘッダーを main.cppとクラスBの定義を書いたヘッダーでインクルードすると もう定義されてると言われますが こういう場合どうすればいいんでしょうか?
>>738 インクルードガード
意味がわからんかったらググれカレー
>>738 ヘッダファイルにインクルードガードをつける
冗長インクルードガードってやるに越したことはないでしょうけど、 実際やってる人ってどのくらいいるのでしょう。 私はせいぜい内部インクルードガードで済ましちゃってます。 実際、コンパイル時間とかそんなに変わるものですか? 10年前のマシンならあったほうがいいのかも。。。
VCのクラスウィザード使うとインクルードガードが記述されるじゃん。 インクルードガードって単語知らなかったよ。 名前を知らなくても自然に習得するような希ガス。
そんな言葉は始めて聞いた。ただのいふでふじゃねーか
お前らの使ってるインクルードガードは偽物。 本物のプログラマーが使うのはこれ。 #ifdef MYHEADER_H #error MYHEADER_H #endif #define MYHEADER_H
747 :
デフォルトの名無しさん :04/07/15 08:09
>>742 冗長インクルードガードはやってるのを見たこと無いな。
実際言葉も知らなかったし。
ググッた先のページ見たらコンパイル時間もほとんど変わらないようだ。
インクルードガードって用語初めて知って、 早速今日、会社で使っている香具師いるだろ。 なっ、そこのもまえw
#pragma once使えよぼけ
習慣として両方入れてる。
つーかここ1年ぐらい1からヘッダファイル自分で作った記憶がないな。 そんなもんにIDEの仕事だろ?
インクルードガード知らないのって問題あるだろ。
Webで見た限り、冗長インクルードガードなるものの優位性がわからんのだが・・・。 マクロ変数を複数ヘッダーファイルで共有する必要がある時点でアフォだと思う。
>>754 一万行のヘッダファイルがあったとして
冗長なしだとプリプロセッサが数万行処理するのに対して
ありだと一万行で済むとかそういう話じゃないの。
コンパイル速度にはほぼ影響しないだろうね。
コンパイル時間ではなくコーディング時間の短縮こそが プログラマの努力すべき課題だしね。 エンドユーザにとってコンパイル時間なぞどうでもいいし。
プリプロセッサって #if 0〜#endifの領域ってどう処理するんだっけ? コメントと同様にスペースに置換?
コンパイラに依存する処理を、具体的な製品名を上げずに、そこで質問して何を得ようというのか、 分かりやすくかつ明確に答えてください。
配列の初期化で char buf[100] = {0}; とやると、最初の要素の後ろが全て0で初期化されると聞いたことがあるんですけど これは言語規格で定められているんですか? VC++6.0ではそのようなコードが吐かれているのを確認したのですが…
760 :
デフォルトの名無しさん :04/07/15 13:55
>>759 その通りに規格で決められています。構造体も然り。
>>757 #if 0と#endifの行自身も含め改行文字以外を削除。
一応#if 0と#endifの中もソースコードの扱いなのでその中でもコメントなどは認識される。
>>760 ありがとうございました。
今までmemsetとかstd::fillでやってましたが
こっちの方が見た目すっきりしてていいですね。
>>762 指定しただけプログラムのサイズが増えるからやめとけ。
サイズくらいきにすんなよ〜
無駄に無駄を許容するのはC++の美徳に反するな
10倍に?
768 :
デフォルトの名無しさん :04/07/15 14:48
volatileの扱いですが struct A { void func() { i=1; //(1) i=2; } volatile int i; //(2) }; A a; void main() { a.func(); } a) VC7.1で上のコードをそのまま実行するとfuncがmain内に inline展開されるんだけど、(1)のコードが実行されていない模様。 b) (1)を何度も繰り返した場合、inline展開されずfunc内で全ての 代入が行われている。 c) (2)を非volatileにした場合、a/b)のいずれの場合でも(1)は省略される。 d) (2)をvolatileのままグローバル変数に移動するとa/b)のいずれの場合でも (1)は省略されない。 私のイメージとしては(b)〜(d)は正しく、(a)がおかしいような 気がするのですが。これって i) VCのバグor仕様 ii) C++の仕様(メンバ変数にvolatileつけるのが間違ってる)。 のどっち?
volatile A a;
771 :
デフォルトの名無しさん :04/07/15 16:28
#include <stdio.h> int a; int main() { char str[127]; printf("文字列を入力してください(127文字以内)\n"); scanf("%s",str); for(a=0;a<128;a++){ str[a]=str[a]+1; printf("\t%s!\n" , str); } return 0; } これってどうよ?
>>771 -for(a=0;a<128;a++){
+for(a=0;a<127;a++){
str[a] = str[a] + !!str[a]; の方が良くない?
776 :
デフォルトの名無しさん :04/07/15 17:41
グローバル変数にしてる意味はなに?
>>771 >scanf("%s",str);
sgets(str, sizeof str / sizeof *str, stdin);かscanf("%127s", str);
>str[a]=str[a]+1;
str[a]++;かstr[a] += 1;
>int a;
どうでもいいがループカウンタの変数は i が一般的
for (int i = 0; i < sizeof str / sizeof *str; i++)
仕事じゃiなんか使わないけど
ひでえ仕事だな
本当にどうでもいいな
>>779 まさかiCountとか...(((( ;゚Д゚)))ガクガクブルブル
キモスギル
だからiの話はするなとあれほど言ったのに・・・
idxじゃだめ?
ローカル変数にはtheを付ける。 theIdxみたいな感じ。
マジかよ
適当な名前付けでわかりにくくならない?
ローカルの l をつけて混乱させる li1とか
メンバ変数の接尾辞には_付ける・ ローカル変数は普通に。 グローバル変数はglobal名前空間の中に。 ループ変数はi,j,k… 但しループさせるのがx,y座標だったらx,y
グローバル変数にはgを付ける。 gFlagみたいな。
分かりにくい書き方しちゃったけどglobal名前空間は :: じゃなくて global:: の事ね。
あとでエディタの一括文字列変換とか使うときに、 そこそこ冗長な名前にしておいたほうが都合がいいことがあった。 だから、あまりiとかjとかって短いのは抵抗があるな〜。
>>791 オレも同じ。
あと変数名は単語の区切りには_使う
メンバ関数名は最初は小文字、その他各単語の最初は大文字
母音を省略するような真似はしない
変数の役割によってなんか付ける。 Cnt・・・カウンタ。例:LoopCnt Tbl・・・テーブル、配列。例:DataTbl[ ...]
>>785 なるほど.774のアドバイスの意図は分かりました.
が,771は一体何なんだ?
774がレスしてるので分かってるのかと思い振ってみたのだけど.
iCounterってキモイ? 結構やってる人、多いんじゃない?
>>797 たんに「ROT1 を動かしてみて、文字コードというものについて実体験しましょう」
ってあたりじゃないのかなぁ。(rot1 は rot13 からの造語ね)
>>798 漏れ的には "i" には強くインデクサっぽい意味を感じてしまうので、
個人的にはカウンターとか個数とかには絶対使わない。
インデックサじゃないカウンタや個数は cほにゃらら、にする。
自分の世界が全世界
iはインターフェース
Windowsプログラミングならね...
iは世界共通の愛
int i; ってやるとコンパイルエラーになるんですけど...orz
なんか空きが長いぞ
全角スペースでした。逝ってきます...0rz
std::string str; char chr; int integer; double real;
doubleを打ち込むとき、今でも「どうぶる」と 口ずさみながらキーボード叩いてます。 そんな人は私以外にも全世界に3人はいると思います。
なんだか今日はほのぼのしているスレですね
charはキャラだよ
integerって昔、ホンダが車出してなかたっけ?
それを言うなら、integra? スペル間違えたかも。まあ、確かに紛らわしいが。
トヨタはキャピだっけ?
\ │ / / ̄\ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ─( ゚ ∀ ゚ )< ストゥディオ! \_/ \_________ / │ \ ∩ ∧ ∧∩ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\ ∩∧ ∧∩\( ゚∀゚)< ストゥディオ! ストゥディオ〜〜〜〜! >( ゚∀゚ )/ | / \__________ ________/ | 〈 | | / /\_」 / /\」  ̄ / /
いてらとら
823 :
デフォルトの名無しさん :04/07/15 20:24
こうと
824 :
デフォルトの名無しさん :04/07/15 20:29
2つの行列の計算を行うプログラムがわかりません;; 教えて欲しいです。2行2列で。
宿題はすれ違い
826 :
デフォルトの名無しさん :04/07/15 20:32
Javaってなんの言語で出来てるの。 C++で出来てるって聞いたけどホント?
JavaはJava言語でできてます。 Javaコンパイラが何でできてるかは、コンパイラを作った会社に聞いてください。
828 :
デフォルトの名無しさん :04/07/15 20:53
だっせー
Java3Dは何でできてるの?
赤ちゃんはどうやってできるのぉ?
コウノトリさんがはこんでくるのぉ
std::string s; s.c_str() が返すアドレスと &*s.begin() で得られるアドレスは 同じことは保証されているんでしょうか? それとも実装依存ですか?
>>832 前者はconst char*で後者はiteratorが返るんだ。違って当然。
>>834 >&*s.begin() で得られるアドレス
攣れた!
でました。苦し紛れの釣り宣言。みっともないね。
また釣れたw
釣れた!
ゃ こ じ の ん ス な ぁ っ レ ぁ ! は ぁ ! ! あ ぁ あ ぁ あ ぁ
日本で一番早く梅雨が明けたスレはここです
844 :
デフォルトの名無しさん :04/07/16 00:32
BCC5.5を使っています。 メニューをクリックしたら画面に文字を出力するプログラムを組んでいます。 でも、どうしても画面に出力した文字が ¢ になってしまいます。 どうしてでしょうか。
嗚呼しもた。 Windowsアプリケーションを作っています。
一時オブジェクトの寿命なのですが class A { public: void func() { /* 処理 */ } }; A& hoge(A& a) { return a; } hoge(A()).func(); VC++6.0の場合、funcが呼び出しが終わった後に一時オブジェクトのデストラクタが走りました。 また、 hoge(A()), hoge(A()); としたら、2番目のhogeのA()のデストラクタ→最初のA()のデストラクタ、となりました。 ということは、一時オブジェクトの解体は ; までの処理が終わったときに行われる という解釈でいいのでしょうか?
>>847 ありがとうございました。
今まで意識したこと無かったのですが、うまいことできてますねC++って。
>>834 は正しいんじゃないのか?
ANSI準拠が進んだVC.NETで試してみ。別物として弾かれるはずだ。
記憶違いだった。
記憶とかの問題じゃないから
ドウブル型ワロタ
857 :
デフォルトの名無しさん :04/07/16 09:05
ドイツ語ではドウブルと読むはず。
どうぶるではなく、どうぶれな俺は1人目。
>>857 のアフォな提言に触発されてググってしまった。
ドイツ語ではdoubleではなくdoppel。
以後、ドッベル型でおながいします。
ドッペルゲンガーの「ドッペル」ってそういう意味かあ。 勉強にナルネ。
もしかしてドイツ語対応のC++コンパイラなんてあるのかな? とふと思ったりして。
ウムラウトとかめんどいかも。 標準ライブラリの関数名もドイツ語とか。 ああ、また一から勉強かよ...orz
つまんね
へ、あんの?
オンドゥル語コンパイラも作って
869 :
デフォルトの名無しさん :04/07/16 13:05
VC6からVC2003ToolKitにかえたら テンプレート引数に浮動小数点型が指定出来なくなりました。 どうやらISOに準拠した為なんですが、なぜそうなったのでしょう? 何か理由があるんですか? template< float f > ← エラー
>>869 コンストラクタの引数に取ればいいだけじゃないか。
ただ、それだとそれを添え字にする配列を作ったりできないし、
型名を引数に取ってその型の変数を作ることもできない。
だからテンプレートって仕組みでやれるようにした。
逆にそれ以外はテンプレートの出番じゃないってこと。
871 :
デフォルトの名無しさん :04/07/16 13:39
#include <stdio.h> int a; int main() { char str[128]; for(a=0;a<128;a++){ printf("文字列を入力してください(127文字以内)\n"); scanf("%s",str); if(str[a]==NULL) { break; } str[a] = str[a]+1 ; printf("\t%s!\n" , str); } return 0; }
>>871 #include <stdio.h>
int main()
{
char str[128];
printf("文字列を入力してください(127文字以内)\n");
scanf("%127s",str);
for(int i = 0; i < 127; i++)
if(str[i] == '\0')
break;
else
str[i]++;
printf("\t%s!\n" , str);
return 0;
}
std::basic_stringのことなんですが
VC6に付いてる<string>を見ると
std::string a("abc"), b;
b = a;
とすると、aとbが保持する文字列の実体は同一で、参照カウンタで文字列の実体の寿命を管理してました。
参照カウンタはクリティカルセクション等で保護されてないようなので
a, bを別々のスレッドで同時に操作すると危険ですよね?
また、
std::string a("abc"), b;
b = a.c_str();
とすると、a, bが保持する文字列実体は別々になるようです。
こういう振る舞いを定義してる規格とかあるのでしょうか?
スレッドに渡す文字列を上の b = a; のように渡すと危ないですよね。
かといって b = a.c_str(); として、別の実体が作られることを期待していいものかどうか…
ttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcstdlib/html/vclrfthreadsafetyinstandardclibrary.asp >For writes to different objects of the same class, the object is thread safe for writing:
>・From one thread when no readers on other threads.
>・From many threads.
これには安全だと書いてありますが、上の b = a; では当てはまらないのではないでしょうか?
>>874-875 まさにこれですね。
いずれ.NETを買うつもりですがとりあえず
前から入れようと思ってたSTLPortを入れてみます。
ありがとうございました。
C++ では stdio をやめて、sprintf とかでも ostringstream にした方がいいですか? Effective C++ では stdio とは決別すべきと書いてあったのですが、イマイチ踏み切れません…
ostringstreamがそんなに嫌いならboost::formatを使え。 sprintfがどうしても使いたいならsnprintfを使え。
あ、嫌いじゃないですよ。全然。 ただ MS とかのコード見ててもあまり登場しないもんだから なんか問題があるんじゃないかと思ってたわけです。。
printf 系の場合、 string s = "aaaaa"; printf( "%d", s ); とかやってもコンパイルエラーにならない。 その点、basic_ostream 系ならば、そのあたり適切に判定してくれるし、 自分で型定義もできて便利。
>>832 ランダムイテレータ の場合、ita と itb をランダムイテレータだとすると、
ita == itb; が true の場合、
*ita == *itb; が true を返すことは企画上保障されているが、
&*ita == &*itb; にかんしては規程されていない。
たとえば、UTF-8 文字列に対応した、UTF-8 Iterator itu があったとして、
*itu が UCS-4 のコードポイントを int で返したとしてもそれは問題ない。
でも、
>>832 は、std::string についていっているわけだから、
最後の2行は余計か。スマンな
おまいら、printf が好きですね
今のところprintfが最強だからね。
printzが最強
>>869 template<float &f> に汁
887 :
デフォルトの名無しさん :04/07/17 00:45
「クラスAとクラスBの関連」をC++で実装する場合 これで良いのでしょうか? class B; class A{ B* related_b_ptr; public: A( B* b_ptr ){ related_b_ptr = b_ptr; } }; class B{ A* related_a_ptr; public: B( A* a_ptr ){ related_a_ptr = a_ptr; } }; 関連全てにこんな事やるのは面倒ですし、感覚として間違っている 気がするのですが、代替手段が分からないんです。 例えば引数でその都度、関連クラスを渡したりすのは、第3のオブジェクトが 無理矢理必要なこともあって、全然オブジェクト指向じゃなくなる気がします。 関連って実際はどんな事なんでしょうか。
>>887 class A のインスタンスをどうやって作るんだ?
889 :
デフォルトの名無しさん :04/07/17 00:50
>>887 friendクラスとか、入れ子クラスは?
890 :
デフォルトの名無しさん :04/07/17 00:52
>>887 (889の続き)
どーせ、モロ依存しまくりなら
変に分離して書こうとすること自体間違ってる
>>887 UMLでいうところのnavigabilityが双方向ならそれでいいんじゃないですか?
「感覚として間違っている」のは、
実装方法ではなくnavigabilityが双方向であることだと思います。
循環依存ですから(それが必要なことももちろんある)
navigabilityが片方向なら、メンバとして持つなり
1対多ならコレクションでもつなりの実装方法があります。
生成は、包含なら包含元クラスで行いますし、
そうでない関連ならどこかに生成元がいるはずです。
すいません、すぐレス頂けるとは思わず。
皆さんレスありがとうございました。
>>888-891 インスタンスはポインタを介してなどでしょうか。
疑問に思っていた関連とは、どこにでもあるありふれた関連の事だったんです。
なのでfriendや入れ子は更に大げさかなと。
>>892 おかげで良く分かりました。言われてみれば関連といえど、その実態はほとんど全てが
片方向でした。難しいだけと思っていた専門用語が、ここまで便利とは…。
生成について、しばしばパターンなどと一項目あげて大げさに
取り上げられている理由も、合わせて理解できた気がします。
char_traitsを見てて疑問に思ったのですが char(0), char() と '\0'、wchar_t(0), wchar_t() と L'\0' は 等しくなることが保証されているんでしょうか?
#include <iostream> class A { public: static int main() { std::cout << "main" << std::endl; return 0; } }; int main = A::main(); 何気なく書いてみたのですが、これが動いてしまう理由がわからないです。 int main = A::main(); と書いてるのにコンパイルできてしまうってことは、 mainはデフォルトで関数ポインタとして扱われるということでしょうか?
>>896 初期化付きのグローバル変数なだけだろ。
>896 これだとメイン2回実行されるの? 手元に今コンパイラないのでわかんね
>int main ってかいといて何言ってんだよw
>>896 コンパイルはできるのはわかるけど動く?
mainが未解決とでるんだけど。
>>896 リンカーはmainへ実行を移すコードcrt.oとリンクするけどmainの中は0が入ってる
その後ろに何があるかは環境による。
C++の処理系はmainと言うグローバル変数の初期化をcrt.oがmainを呼ぶ前に実行する
これがA::main()を実行しているのでメッセージは出力される。
vector< char > v( istream_iterator< char >( cin ), istream_iterator< char >() ); が関数宣言になる使用を思い出したのは漏れだけではないはず
何故コンパイルエラーになるか分かりません。 #include <iostream> #include <algorithm> struct A { int x; int y; bool operator<(struct A a) { if(this->x != a.x) return this->x < a.x; else return this->y < a.y; } }; int main() { const int size = 100; struct A a[size]; sort(&a[0], &a[size]); return 0; }
エラーメッセージ /usr/lib/gcc-lib/i386-redhat-linux/2.95.3/../../../../include/g++-3/stl_algo.h: In function `const struct A & __median<A>(const A &, const A &, const A &)': /usr/lib/gcc-lib/i386-redhat-linux/2.95.3/../../../../include/g++-3/stl_algo.h:1283: instantiated from `__introsort_loop<A *, A, int>(A *, A *, A *, int)' /usr/lib/gcc-lib/i386-redhat-linux/2.95.3/../../../../include/g++-3/stl_algo.h:1320: instantiated from here /usr/lib/gcc-lib/i386-redhat-linux/2.95.3/../../../../include/g++-3/stl_algo.h:46: passing `const A' as `this' argument of `bool A::operator <(A)' discards qualifiers /usr/lib/gcc-lib/i386-redhat-linux/2.95.3/../../../../include/g++-3/stl_algo.h:47: passing `const A' as `this' argument of `bool A::operator <(A)' discards qualifiers /usr/lib/gcc-lib/i386-redhat-linux/2.95.3/../../../../include/g++-3/stl_algo.h:49: passing `const A' as `this' argument of `bool A::operator <(A)' discards qualifiers /usr/lib/gcc-lib/i386-redhat-linux/2.95.3/../../../../include/g++-3/stl_algo.h:53: passing `const A' as `this' argument of `bool A::operator <(A)' discards qualifiers /usr/lib/gcc-lib/i386-redhat-linux/2.95.3/../../../../include/g++-3/stl_algo.h:55: passing `const A' as `this' argument of `bool A::operator <(A)' discards qualifiers
レスどうもでした
>>898 1回だけ"main"と表示して終了するだけです。
>>900 bccでコンパイルして実行確認しました。
>>901 解かりやすい説明ありがとうございました。
プログラムの実行の仕組みとかも調べると、より理解も深まって面白そうですね。
>>902 使い方など、ぱっと見何だかわからないです。
勉強が必要ですね。
>>903 - bool operator<(struct A a) {
+ bool operator<(const struct A &a) const{
恩返しにと
>>903 にレスしようと思ったら、既にされてましたね。
g++ではなくbccのコンパイラだと
>>903 みたいのでもコンパイルできてしまったりして、
環境による大きく依存があるのだなぁと感じました。
そこで、さきほどの
>>896 のプログラムも少し試してみました。
bccでコンパイルしてWindows上で実行すると気づかなかったのですが、
g++でコンパイルしてLinux上で実行すると、"main"を表示したあと、
Segmentation faultで落ちてました。
これは
>>901 を参考に解釈すると、A::main()が実行されたあとに、
mainの後ろの不定な領域を実行しようとして落ちたという認識で良いのでしょうか?
>>906 >sort(&a[0], &a[size]);
std::sort(&a[0], &a[size]);
>>907 > mainの後ろの不定な領域を実行しようとして落ちたという認識で良いのでしょうか?
正解。
912 :
デフォルトの名無しさん :04/07/18 00:09
CHoge a,b,c; c = a + b; をできるように CHoge& CHoge::operator+(CHoge& hoge) { CHoge tmp; tmp.value = (*this).value + hoge.value; return tmp; } なんてoperatorを書いたのですが、一時オブジェクトの参照を 返してもいいんですかね?
913 :
デフォルトの名無しさん :04/07/18 00:17
this->valueとかけよ。
>912 CHoge のデストラクタで value = 0 と代入してみ
>>912 自分で参照とか言ってるのに何言ってんの?
解決しました
一番最悪なパターンですね
なんか発情してきました どうすればいいですか?
解決しました
早漏ですね