■過去ログ置き場に戻る■ 1- 前250 次250 最新50


[memo] "9999999999_00.html#R20" という感じで、URLの最後に "#RレスNo" を追加すると幸せになれます。

C++相談室 part27
251 名前:243 :04/01/29 16:34
>>249
わざわざありがとうございます m(__)m
257がなぜ260になるんでしょうか・・・
パディング入って a の占める領域が4の倍数に調節されるのは、
もしかして構造体のアライメントとは関係ない話ですか?

252 名前:249 :04/01/29 16:55
http://www.microsoft.com/japan/developer/library/vccore/_core_structure_alignment.htm

struct T { char a; int b; };
だとアライメント4

struct T { char a; double b; };
だとアライメント8

らしいです。


253 名前:249 :04/01/29 17:01
struct TI { char a; int b; };
struct TD { char a; double b; };

std::cout << offsetof(TI, a) << std::endl;
std::cout << offsetof(TI, b) << std::endl;

std::cout << offsetof(TD, a) << std::endl;
std::cout << offsetof(TD, b) << std::endl;

結果
0
4
0
8


254 名前:243 :04/01/29 17:04
>>249さん
リンク先を読んで、やっと納得がいきました(まだ完全に理解できたかあやしいですがw)
Zpオプションでの値にしばられるとばっかり思っていたら、
そういうわけではなかったんですね。
わざわざテスト結果までありがとうございました m(__)m

255 名前:モノアイγ :04/01/29 18:05
素でそろそろいい歳だし子供生まれるし、就職するための技術としてC++を勉強しようと思っているんでつが…

24歳デビューは遅杉?

スレ違いでスマソ

256 名前:デフォルトの名無しさん :04/01/29 18:10
センス&&これまでの経験次第としか・・・。

257 名前:デフォルトの名無しさん :04/01/29 19:00
>>255
まさか、まったくの経験ゼロではあるまいな。

プログラミングを独習するには10年かかる
http://www1.neweb.ne.jp/wa/yamdas/column/technique/21-daysj.html

258 名前:デフォルトの名無しさん :04/01/29 19:04
>>255

C++習得したし、子供でも作ろうか?
が正解

259 名前:デフォルトの名無しさん :04/01/29 19:18
>255
10年経験あろうとうんこなやつはうんこ
すべて貴方の努力次第です
24歳だからといって遅いということはない


260 名前:デフォルトの名無しさん :04/01/29 19:20
なんらかのオブジェクト指向j言語かC言語をやっていたことがあるなら、

Cのメモリモデル
オブジェクト指向プログラミング

のどちらかを身につけるだけなので早いと思うが、
C++自体癖のある言語なので
もともとプログラミング(あるいはそれに近いロジックを組む仕事)
をやったことのない人間が
就職を動機として身につけるのは、

客観的に言って、相当、うーん、ですな


261 名前:デフォルトの名無しさん :04/01/29 19:36
能力のわからん人間相手によくそういうことが言えるな。
まあ、こんなところで訊いてる位だから(ry
という推測が成り立たんわけでもないが。

262 名前:デフォルトの名無しさん :04/01/29 20:04
つーかマ板行けよ

263 名前:デフォルトの名無しさん :04/01/29 20:10
>>255
スレ違いというより、板違い

264 名前:デフォルトの名無しさん :04/01/29 20:12
>>255
C++を勉強するのに遅杉ということはない。

しかし、"子供生まれる"と"就職"はフツーに順番が逆だろ。
この点では遅杉。

265 名前:モノアイγ :04/01/29 20:51
就職→結婚の順番はごもっともですw

経験は〜かじったというより舐めた程度です

今の仕事収入あえ万はあるからいいっちゃあいいんですが、契約社員でこの先が…ねぇ?

気合いでなんとかなるかもしれない事はなんとなくわかりましたんでやるだけやってみます(感謝

最後に仕事の休憩中に書いた短い文で自分の経験すら書いてなかった質問にレスしてくれた方々、どうもありがとうございました(素

266 名前:デフォルトの名無しさん :04/01/29 21:28
>>257
少なくとも半ダースのプログラミング言語を学ぶこと。
言語標準化の試みに加わること。

条件キツ杉。

267 名前:デフォルトの名無しさん :04/01/29 21:38
>>265
この業界、自慢じゃないが給料はべらぼうに安いぞ・・・。

いまの仕事のまま、内職でプログラム作って売るのを目指すほうがいいと思うよ。
VBだろうがC++だろうが、言語仕様がわかるだけでは仕事がない時代になってるから。

268 名前:デフォルトの名無しさん :04/01/29 22:57
>>266
>少なくとも半ダースのプログラミング言語を学ぶこと。

これは別にいまどきフツーだろ。

269 名前:デフォルトの名無しさん :04/01/29 23:02
>>265
この業界に来るくらいなら別の業界に行った方がええんでねぇの
どの業界の派遣社員なのか知らんが月収35万もらってんなら今より少なくなるよきっと

270 名前:デフォルトの名無しさん :04/01/30 00:22
STLのソースを読んで学習したいんですが、
STLPortやらBoostやら色々あるんですが、どれがいいでつか

271 名前:デフォルトの名無しさん :04/01/30 00:36
アスキー配列のキーボードを使ってるので、「あえ」が何だか分からんかった・・・。

272 名前:デフォルトの名無しさん :04/01/30 00:57
>>270
とりあえずboostはSTLではないよ。

273 名前:デフォルトの名無しさん :04/01/30 01:10
>>>268
>>少なくとも半ダースのプログラミング言語を学ぶこと。
>これは別にいまどきフツーだろ。
別々の概念を持つ言語として六種類だそうだ
Java C++ C# VB.net smalltalkこんなに知ってて一種類・・・

274 名前:デフォルトの名無しさん :04/01/30 01:17
>>273
そんなあなたにBrainF*ck。

275 名前:デフォルトの名無しさん :04/01/30 01:32
>>273 そんなあなたにCOBOL

276 名前:デフォルトの名無しさん :04/01/30 01:35
Common Lisp と Scheme と Prolog を勉強すれば、全てのカテゴリを満たす訳だ。
Common Lisp, Scheme, C と Smalltalk は齧ったけど、Prolog はファイト湧かない
なぁ。あと一つどうしよう。アセンブラはカウントしていいのかな??

277 名前:デフォルトの名無しさん :04/01/30 01:48
>>276
Haskellとかは?
関数型だが、型演繹+LazyなのでLisp/Scheme系とは一線を画すということで。

# 俺もProlog系は手を出したくない筆頭・・・

278 名前:デフォルトの名無しさん :04/01/30 01:58
そんだけ学ぶのはいいが、仕事で使うのは1〜2種類じゃないのか?

279 名前:デフォルトの名無しさん :04/01/30 02:04
論理型は脳ミソの普段使わないところが筋肉痛になるよ!
LISPと同じくらい目から鱗が落ちるので、276や277くらいなら手を出すのをお勧めしまつ。

漏れは一応全制覇かな。並列がKL1だから超マイナーだけど。


280 名前:デフォルトの名無しさん :04/01/30 02:08
>>278
言語を使うというより、思想を身につける方が大事だと思われ。
だから同じ思想の言語は重複してカウントしてないでしょ。

ごくごくわかりやすい例としては、
漏れは普段はC++使ってるけど、テンプレートまわりでLISPを思い出すし、
並列プログラミング時に単一代入変数を思い出したりする。

281 名前:デフォルトの名無しさん :04/01/30 03:56
BASIC、C、C++、Java、C#、Perl、アセンブラ(Z80、6809、68000、80x86)でも
1種類にしかカウントされませんか。C++テンプレートもあまり活用してないし。
自分が偏ってるのをようやく自覚したので、もう少し幅を広げようと思いまふ。_| ̄|○

282 名前:デフォルトの名無しさん :04/01/30 04:37

テンプレート使ったときのコンパイルエラーって
原因が発見しづらくないですか?
VC++だけど、そういう印象持ってまふ。

283 名前:デフォルトの名無しさん :04/01/30 04:44
なにをいまさら

284 名前:デフォルトの名無しさん :04/01/30 06:20
>>276 Lisp 系のかじり方が中途半端な予感.普通 Lisp を勉強する過程で
Prolog モドキを実装するハズだ.大抵のLisp 本にあるだろ? Prolog モドキの実装.
昔は Prolog 使いと Lisper が被っていたのにはちゃんと理由がある.関数と再帰く
れーやって「齧った」などといってると半可通になっちゃうぞ.

などと煽ってみる漏れも今は C++ 使い.師匠,やはり Lisp は永遠のマイノリティ
の予感がします….

285 名前:デフォルトの名無しさん :04/01/30 06:32
処理系とライブラリが整備されていれば喜んでLisp使うんだけどなあ。
Pythonのライブラリ整備パワーはうらやましい。


286 名前:デフォルトの名無しさん :04/01/30 06:37
Prolog やったとき、確かに関数型言語っぽいなぁ、と思ったな。

287 名前:デフォルトの名無しさん :04/01/30 09:36
ここは C++ 相談室です。

288 名前:デフォルトの名無しさん :04/01/30 13:34
今時のC++使いって言語ヲタが多いんじゃないの?
昔はWindowsプログラミングを覚えるためにC++始める人が
多かったけど、最近はなんか違ってきたと言うか。
boostなんて現場での実用性ゼロのライブラリが注目される辺りから
そんな気がしてる。

289 名前:デフォルトの名無しさん :04/01/30 14:05
>boostなんて現場での実用性ゼロのライブラリ

2へぇ

290 名前:デフォルトの名無しさん :04/01/30 14:09
boostもろくすっぽ使いこなせないのにboostをけなすヤシが約一名。

291 名前:デフォルトの名無しさん :04/01/30 14:18
>>288
お前が使えば実用性が無くなるかもなw
まさかこの後、釣れた(

292 名前:デフォルトの名無しさん :04/01/30 14:26
boostってSTLの委員だった人たちが次期標準を視野に入れて作ってるんじゃないの?
現場でSTL使ってるならboostも役に立つと思うんだけどどうなんですか?

293 名前:デフォルトの名無しさん :04/01/30 15:58
>>288
お前、コイツだろ。(´,_ゝ`)プッ
http://pc2.2ch.net/test/read.cgi/tech/1070886635/220
http://pc2.2ch.net/test/read.cgi/tech/1070886635/222

294 名前:デフォルトの名無しさん :04/01/30 16:15
>>293
似たような文章だがおれじゃあない。
大体boostなんて非標準なライブラリは小規模、かつ
開発者全員がそれに馴染んでいる場合には使えるが
それ以外のケースにおいてはそんなもん使われては困る。
ModernC++Designにおいて示されているような
解決したい問題が先にあって、そのためのテンプレート
ライブラリの使用なら分るんだが、言語ヲタクの場合は
boostを使いたいとかいう自己満的ニーズが先行してやいないか?
胸に手を当てて一度考えてみてはどうだろう。

295 名前:デフォルトの名無しさん :04/01/30 16:24
>boostを使いたいとかいう自己満的ニーズが先行してやいないか?
いいえ。

296 名前:デフォルトの名無しさん :04/01/30 16:26
自分が思い描く言語ヲタの生態をいくら詳細に語っても
「言語ヲタが多い」ことの証明にはならないわけだが。

以前どっかのスレで「お前らboostのうちどれ使ってる?」という質問が出たとき、
regexやshared_ptrやdirectory_iteratorやformatに回答が集中したっけな。
実際の使用と言語的な興味(C++でどこまで行けるか)は切り分けてるだろう、
多くの人間は。

297 名前:デフォルトの名無しさん :04/01/30 16:36
言語ヲタクの存在自体に文句があるわけじゃない。勘違いするな。
多言語の話題がさもスレ違いであるかのように指摘した287に答えたまで。
また、C++プログラマにおける言語ヲタクの割合が、昔と比べて高くなったと
いうのは個人的な感想。こんな物に反論してどうする。
それからboostに関しても同じようにその存在に文句があるわけじゃない。
ただ使う人間に勘違いしてるようなのがいるということ。然るべきスキルある
人間が、適切なケースで使う分にはなにも問題ないと考える。

298 名前:デフォルトの名無しさん :04/01/30 16:37
×多言語 ○他言語

299 名前:デフォルトの名無しさん :04/01/30 16:38
じゃあ書くなよ。
独り言板がふさわしい。


300 名前:デフォルトの名無しさん :04/01/30 16:43
むしろおまいらのboostの有用性に関する必死な反論ぶりが
ちょっとおもしろかったな(w。スレ違い。さげ

301 名前:デフォルトの名無しさん :04/01/30 16:47
>>288では「現場での実用性ゼロ」と断言してるのに
>>297では「適切なケースで使う分にはなにも問題ない」と
やんわりまろやかになったところに自己弁護の必死さを感じた一幕だった。


302 名前:デフォルトの名無しさん :04/01/30 16:50
>>301
297の「適切なケース」に288の「現場」が含まれていない
という主張の可能性はどうだろう。

303 名前:デフォルトの名無しさん :04/01/30 16:51
>>288=>>294=>>297 が必死だな、ということでFA?

304 名前:デフォルトの名無しさん :04/01/30 16:51
適切なケース」が だな。typoばっかり。
おれはなんて必死なんだろう(藁

305 名前:デフォルトの名無しさん :04/01/30 16:53
>>302
そんな主張をしたらますます必死さがにじみ出てしまうのではないだろうか。

306 名前:デフォルトの名無しさん :04/01/30 16:59
「実用性ゼロ」と書いてしまった時点で墓穴を掘っていた。
ゼロは言い過ぎたと後悔しているだろう。

307 名前:デフォルトの名無しさん :04/01/30 17:47
>>297
> 言語ヲタクの存在自体に文句があるわけじゃない。勘違いするな
誰も「言語ヲタクの存在自体に文句がある」なんて解釈はしていないわけだが。

苦し紛れに「勘違いしているという勘違い」か。ブザマ。

308 名前:デフォルトの名無しさん :04/01/30 19:41
any optional spirit graphなんかはまずつかわねーし、
spiritとか言われてもオナニーにしか見えないな。
使いこなしているかは別として、いくつかは使ってはいるけど。

309 名前:デフォルトの名無しさん :04/01/30 20:27
>>308
graphとspiritは便利だと思うけどなぁ…。

310 名前:ヽ(´ー`)ノ :04/01/30 20:53
graph は使う人と全然使わない人がいるからなぁ。
split は使うぐらいなら俺は flex 使うが。

311 名前:デフォルトの名無しさん :04/01/30 21:07
ゲーム屋ですがrandomは便利ですよ。

312 名前:デフォルトの名無しさん :04/01/30 21:10
肝心のところが出来ていないアホは確かにいるが
regexとか0から実装してたらそれもアホだ

313 名前:デフォルトの名無しさん :04/01/30 21:10
わりぃ。randomはあたりまえすぎてboost使ってるって意識もなかったわ。

314 名前:デフォルトの名無しさん :04/01/30 23:44
graph使ってますよ?

315 名前:デフォルトの名無しさん :04/01/31 00:04
テンプレートライブラリって自分で書いたほうが早いと錯覚させられるところがあるよねぇ。

316 名前:デフォルトの名無しさん :04/01/31 00:13
リンクしなくてヘッダだけだからな
boostのライセンスってどうなってるの?

317 名前:デフォルトの名無しさん :04/01/31 00:14
>>314
graphってどんな使い方してるか教えて。
最短経路問題を解くみたいなアルゴリズムとして
使うんでしょ?
diffなんかgraphで実装できそうだけど…。

318 名前:デフォルトの名無しさん :04/01/31 00:14
>>315
そんな香具師いねえよ

319 名前:デフォルトの名無しさん :04/01/31 00:16
ものによるだろ
メタプログラミング系は勘弁

320 名前:デフォルトの名無しさん :04/01/31 00:31
BOOST_PP_結構いいんで使ってます
Cですけど。

321 名前:デフォルトの名無しさん :04/01/31 08:38
色々なプラットフォームでDLLやSOを使ってクラスオブジェクトの受け渡し
をしたいと思っています。このDLLを使うアプリケーション内では将来クラスの仕様が
変更される可能性があります。(関数やオペレーターのみ)
仮想関数以外のメンバ関数を含むクラス(派生無し)を定義した時、そのオブジェクトの
メモリ上の実体はメンバ変数だけなのでしょうか?
つまりメンバ変数は全く同一でメンバ関数だけが異なる別のクラスに強制キャストしても
危険性は無いのでしょうか?お願い致します。

322 名前:デフォルトの名無しさん :04/01/31 08:49
C++例外でどうしても腑に落ちない点があるのでご教示願いたく思い投稿しました。

class UserEx : public exception {
protected:
  string msg;
public:
  UserEx(string& msg) { this->msg = msg; } // ★1
  virtual const char* what() const throw() { return msg.c_str(); }
};
  try {
    throw UserEx(string("!!! exception !!!")); // ★2
  } catch (exception& ex) { // ★3
    cerr << ex.what() << endl;
  }

★1 - string& から string へ =演算子を使用した場合
参照が指す先の値をコピー(生成)するのでしょうか?
★2 - string("!!! exception !!!") で生成した string の寿命(ライフサイクル)は
 いつからいつまででしょうか?
・string("!!! exception !!!") のように
 生成したインスタンスを変数に入れないという使い方に抵抗を感じています。
・UserEx::UserEx(string&) にあるように参照渡しで string を渡しているので
 string("!!! exception !!!")のデストラクタが呼ばれたら無効になるのでは?<疑問
★3 - ★2で UserEx のインスタンスが生成されますが try ブロックから抜けたら
 デストラクタが呼ばれないのはなぜか?
 デストラクタが呼ばれたら catch(exception&) でキャッチしたときに 無効になってしまうのでは?

以上、よろしくお願いします。分かりにくい点がありましたらご指摘下さい。

323 名前:デフォルトの名無しさん :04/01/31 08:58
危険が無い実装が多いだろうけど
それは保証されているわけではない

324 名前:デフォルトの名無しさん :04/01/31 09:01
http://news2.2ch.net/test/read.cgi/news7/1075213041/
【ネタ?】西村博之氏、「私のニュース板」で次期管理人希望者応募中【本気?】

1 名前:ひろゆき ◆3SHRUNYAXA @どうやら管理人 ★ 04/01/30 23:14
   お金がある人だけお願いします。
   おいらばっかり働くのはずるいし。。。

325 名前:デフォルトの名無しさん :04/01/31 09:41
>>322
1- yes マニュアル読もうや。
2- この場合、参照渡ししても内部で(1で)コピーされてるので関係なし。
3- てか、そこで例外オブジェクトのデストラクタ起動したら、例外実装できじゃん。

えらいひと補足してくれ。

>>321
[PDF] C++ COM
第 1 章 よりよい C++ としての COM
http://www.ascii.co.jp/bookmart/pdf/47561/4756130666.pdf
http://www.ascii.co.jp/bookmart/pdf/47561/4756131662.pdf
これ読んでみたら?

326 名前:デフォルトの名無しさん :04/01/31 10:23
EffectiveC++くらい読もうぜ

327 名前:デフォルトの名無しさん :04/01/31 10:24
あ、Moreの方だったかな?
ExceptionalC++じゃないのは確か。

328 名前:デフォルトの名無しさん :04/01/31 14:35
>>325
そこのC++ COMの出典って何ですか?
何かの本の中身でしょうか?

329 名前:デフォルトの名無しさん :04/01/31 14:52
>>326

330 名前:325 :04/01/31 15:30
>>326,327,329
EffectiveC++でも More EffectiveC++ でもないよ。
だって俺もってるけど呼んだこと無いもん。

>>328
Essential COM
http://www.ascii.co.jp/books/detail/4-7561/4-7561-3066-6.html
http://www.amazon.co.jp/exec/obidos/ASIN/4756130666/ref=pd_sxp_elt_l1/249-0895031-1137909

EffectiveCOM
http://www.ascii.co.jp/books/detail/4-7561/4-7561-3166-2.html
http://www.amazon.co.jp/exec/obidos/ASIN/4756131662/ref=ase_thivainfo-22/249-0895031-1137909

たぶんこれら。

331 名前:デフォルトの名無しさん :04/01/31 15:35
初心者ですみませんm(_ _)m

int InputData(char file[]){

  ifstream fin(file);
  if(!fin){cout<<"cannot open input file .\n";return -1;}

  fin.unsetf(ios::skipws);
  do{
     cout << "(゚д゚)ェェー";  
  }while(!fin.eof());
  
  fin.close();
  return 0;
}

int main(){
 InputData("data.txt");
retun 0;
}

てやったら、do whileを無限ループしちゃうんですけどどうしたらいいですか?



332 名前:デフォルトの名無しさん :04/01/31 15:37
前に進んでないんだから
叫び声が終わることも無い

333 名前:デフォルトの名無しさん :04/01/31 15:41
"(゚д゚)ェェー""(゚д゚)ェェー""(゚д゚)ェェー""(゚д゚)ェェー"

char s[100];

fin.unsetf(ios::skipws);

do{
fin >> s;
cout<<"(゚д゚)ェェー";
}while(!fin.eof());

を加えてみたけど叫びつづけますT-T

334 名前:デフォルトの名無しさん :04/01/31 15:49
なんで!fin.eof()なの?(fin)でええやん。

335 名前:デフォルトの名無しさん :04/01/31 15:52
getとかreadをつかう
入力された結果を叫ぶように変更する

336 名前:デフォルトの名無しさん :04/01/31 16:03
よくわからないけどもう少し頑張っています。
叫び声が怖くて眠れません

337 名前:デフォルトの名無しさん :04/01/31 17:20
>330
More Effective にあったが

338 名前:330 :04/01/31 17:27
>>337
すまんかった。家で確認するわ。

339 名前:デフォルトの名無しさん :04/01/31 22:05
Effective C++のパチモンで買う価値のあるのってどれとどれあたり?

340 名前:デフォルトの名無しさん :04/02/01 00:42
多分Effective C++が一番はずれ

341 名前:デフォルトの名無しさん :04/02/01 11:41
テンプレート関数にクラスが来た場合と数値が来た場合の処理を分けて書きたいのですがどうすればいいでしょうか?

試しに下のように書いてみると「2 番目の引数を 'class foo<float>' から 'int' に変換できません。」と言われ、
typename T2::selfの箇所をT2だけにすると「2 個のオーバーロード関数があいまいで最適な変換ができません。」と言われどうしたらいいものやら。

template< class T >
class foo {
public:
  typedef foo< T >self;
  typedef Tvalue_type;
  value_typevalue;
};

template< class T1, class T2 >
void hoge( T1 & t1, typename T2::self & t2 )
{ cout << t1.value << t2.value << endl; }

template< class T1 >
void hoge( T1 & t1, typename T1::value_type n )
{ cout << t1.value << n << endl; }

int main( int argc, char **argv ) {
  foo<int>foo1;
  foo<float>foo2;

  hoge( foo1, foo2 );
  hoge( foo1, 1 );
  return 0;
}

342 名前:デフォルトの名無しさん :04/02/01 12:31
>>341
boost1.31に入る予定のenable_ifとdisable_ifでも使ってみるとか。


343 名前:デフォルトの名無しさん :04/02/01 13:15
>>341
template <int N> struct Int_to_type{};
template <typename T> struct Is_foo_instance{enum{value=false};};
template <typename T> struct Is_foo_instance< foo<T> >{enum{value=true};};

template < class T1, class T2>
void hoge( T1 & t1, T2 & t2 )
{return hoge_helper(t1, t2, Int_to_type<Is_foo_instance<T2>::value>());}

template < class T1, class T2 >
void hoge_helper( T1 & t1, T2 & t2, Int_to_type<true> )
{cout << t1.value << t2.value << endl;}

template < class T1, class T2 >
void hoge_helper( T1 & t1, T2 n, Int_to_type<false> )
{cout << t1.value << n << endl;}

hoge_helperを導入する代わりにhogeを多重定義しても良し。

344 名前:デフォルトの名無しさん :04/02/01 13:33
>>342
文献が少ないのと英語でよく分かっていませんが、>>343を汎用的にしたものという理解で合ってるでしょうか。

>>343
すごいトリックで目から鱗です。ただ、

template <typename T> struct Is_foo_instance< foo<T> >{enum{value=true};};

の部分特殊化がうちのコンパイラ(Visual C++ 6.0)だとネックみたいです。
やはりMSのコンパイラなんか使ってる軟弱者は諦めろということか。

345 名前:デフォルトの名無しさん :04/02/01 13:34
>>344
新しいVSを買いましょう or .NETFrameworkのcl.exeを使いましょう。

346 名前:デフォルトの名無しさん :04/02/01 13:40
>>344
>すごいトリックで目から鱗です。ただ、
そんなあなたにModern C++ Design

部分特殊化が使えないなら、
Is_foo_instanceの代わりにIs_intあたりを用意すればいいんじゃない?

347 名前:デフォルトの名無しさん :04/02/01 15:01
>>346
template <int N> struct Int_to_type{};
template <typename T> struct is_numeric { enum { value = false }; };
template <> struct is_numeric< int > { enum { value = true }; };
template <> struct is_numeric< float > { enum { value = true }; };

template < class T1, class T2 >
void hoge( T1 & t1, T2 & t2 )
{hoge_helper( t1, t2, Int_to_type< is_numeric< T2 >::value >() );}

template < class T1, class T2 >
void hoge_helper( T1 & t1, T2 & t2, Int_to_type< false > type )
{cout << t1.value << t2.value << endl;}

template < class T1, class T2 >
void hoge_helper( T1 & t1, T2 n, Int_to_type< true > type )
{cout << t1.value << n << endl;}

ってやってもみんなfalseに飛ぶっぽいです_| ̄|○

348 名前:デフォルトの名無しさん :04/02/01 15:31
>>347
差し支えなければ、参照渡しの部分をすべてconst参照にすれば良い。
それができないなら、int版とfloat版を素直に多重定義するしか…

349 名前:デフォルトの名無しさん :04/02/01 17:32
C++で、コンストラクタを抜けると、構造体のメンバの値がすべて最大になってしまいます。
普通のメンバは平気なのですが・・・

質問があやふやで、申し訳ありません。

350 名前:デフォルトの名無しさん :04/02/01 17:38
謝らなくていいから、もうちょっとわかりやすく。できれば実例を。

351 名前:デフォルトの名無しさん :04/02/01 18:07
自己解決、すいませんでした。。

コンストラクタのオーバーロードが原因みたいでした

352 名前:デフォルトの名無しさん :04/02/01 18:14
>>348
> 差し支えなければ、参照渡しの部分をすべてconst参照にすれば良い。
おぉ、constにし忘れてました。

出来ました!ありがとうございます。

353 名前:デフォルトの名無しさん :04/02/01 23:57
class {
  std::string m_str;
public:
  ...
  std::string getStringA() const { return m_str; }
  const std::string& getStringB() const { return m_str; }
  ...
};

A と B どちらがいいんでしょうか?


354 名前:デフォルトの名無しさん :04/02/02 01:03
stringの実装しだいだけど
Bは安全パイだとは思う。

355 名前:デフォルトの名無しさん :04/02/02 01:03
どちらもまちがいではない

356 名前: :04/02/02 01:41
前から疑問に思っていたのですが、
コンストラクタで適切にインスタンスが初期化できなかったことを
明示的に返す手段というのは、例外を使うか、そのクラス専用の
new 演算子をオーバーロードするしかないのでしょうか?

357 名前:デフォルトの名無しさん :04/02/02 01:58
>>356
まあ、コンストラクタでは何もせずに初期化メソッドを別に用意するという手もあるが。
普通例外を投げる。

358 名前:デフォルトの名無しさん :04/02/02 02:03
後者はちょっと妙なこと言ってないか?
newせずにインスタンス化する場合はどうするつもりだ。

まあそれだけの質問ならとりあえず例外使っておけとしか言えないが。
コンストラクタで例外投げる場合は後始末に注意な。

359 名前: :04/02/02 02:06
>>358 それはできないように、コンストラクタを private にしてしまう、とか。

360 名前:デフォルトの名無しさん :04/02/02 02:10
コーディングルールとかが一般的できちっとしてる
クラスライブラリのお手本になるC++ライブラリってどんなのがありますか?
(複数解答求む)
例Qt

361 名前: :04/02/02 02:11
>>358 なんとなく例外と実行時型情報だけは使いたくない、
という変なポリシーは捨てたほうがいいですか?

例外使うようなかなり上の次元(?)の処理なら
ついでにガベコレも持っているようなOO言語使ったほうが…
なんて思うもので。

あとはコンストラクタを private でアクセス禁止にして、
インスタンス生成はインスタンス生成用の
static なメソッドを用意するとかですかね。

たしかそういうアプローチをとっているOO言語って
ありませんでしたっけ? C++ 以外に OO って Java くらいしか
使ったことがないので「あったような…」ってくらいの
あいまいな記憶なんですが。

362 名前:デフォルトの名無しさん :04/02/02 02:23
エラー処理をきちんとやりたいなら例外使った方がいい。
その場でabortしたくなければ他に戻り値以外の出口はないから。
そのポリシーが単なる先入観と偏見からならなおさらだな。

smallTalk系列じゃクラスメソッドにallocとかcreateみたいなファクトリメソッドを作るな。
オブジェクトを常にnewで作成する考えならGC有りの言語の方が合ってるかも。


363 名前:デフォルトの名無しさん :04/02/02 05:14
>>353
Aの場合・・・
コピーのオーバーヘッド&メモリ消費が気になる

Bの場合・・・
Hoge hoge;
std::string& str = const_cast<std::string&>(hoge.getStringB());
str = "書き込んじゃうよ";


364 名前:デフォルトの名無しさん :04/02/02 06:37
突然な質問ですいません。

a = "abcdefg";
a.mid(2,2)="CD";

とすればクラスaの内容が abCDefg になる
みたいな機能って実装可能でしょうか?

365 名前:デフォルトの名無しさん :04/02/02 06:48
可能です。

366 名前:364 :04/02/02 06:57
>>365
そうですか。
一晩悩んだんですけど実装の方法がどうしてもわかりませんです。
できれば簡単な説明でいいので教えていただけないでしょうか。

367 名前:デフォルトの名無しさん :04/02/02 07:11
こんなんじゃだめですか?
class string_proxy
{
public:
 typedef std::string::size_type pos_type;

 string_proxy( std::string& target , pos_type begin , pos_type end );

 string_proxy& operator = ( std::string );
 operator std::string () const;

private:
 std::string* target;
 pos_type begin,end;
};

368 名前:デフォルトの名無しさん :04/02/02 07:25
>>367
後はstd::string::replace()か何かを使って代入演算子を
作ればよいね。まあしかしstd::stringにはメンバ関数が多量
に存在するのでBASICのような事をするのにわざわざクラス
を定義する事はほとんどないかもね。

369 名前:364 :04/02/02 07:30
>>367
元の文字列クラスに対して行ないたいんです。

o_string a = "abcdefgh";
a.mid(2,2) = "CD";

見たいな感じです。
C++標準のstringクラスとほぼ同等にには出来たんですが
上記のような処理をさせようと思うと難しいみたいで。
参照戻り値を使用しないといけないっぽいですが
どうもわかりません・・・。

370 名前:デフォルトの名無しさん :04/02/02 07:42
>>369
> 元の文字列クラスに対して行ないたいんです。

だから、>>367のクラスを実装して、mid()の戻り値にすれば良いだろ。

371 名前:364 :04/02/02 07:45
>>370
そういうことですか。
すみません。
やってみます。

372 名前:デフォルトの名無しさん :04/02/02 08:04
class Father
{
  Son special_week;
};

class Son
{
  Father sunday_silence;
};


こういう互いのオブジェクトを持ち合ってる場合、どうしたらよいですか?
この例の順序だと3行目で構文エラーになってしまいます

373 名前:デフォルトの名無しさん :04/02/02 08:09
俺、もう、コレいやだよ。
どっかにFAQで転がってないものか・・・。

374 名前:デフォルトの名無しさん :04/02/02 08:16
先頭に class Son;
関数にプロトタイプと定義があるように、
クラスにもヘッダとボディーがあるんです

375 名前:372 :04/02/02 08:27
レスありがとうございます。

>クラスにもヘッダとボディーがある
すいません、単なる仕様知らずでした。

376 名前:デフォルトの名無しさん :04/02/02 08:31
>>372
Cと同じ。ポインタでメンバを持て。

377 名前:デフォルトの名無しさん :04/02/02 19:16
>>372
「前方宣言」でぐぐれ

378 名前:デフォルトの名無しさん :04/02/03 00:36
そういうのはついてくる暮らすライブラリのヘッダとか探すと参考になるよ

379 名前:デフォルトの名無しさん :04/02/03 02:36
プロキシクラス、未だに理解できず。

380 名前:デフォルトの名無しさん :04/02/03 08:16
operatorを使って、
class hoge{
・・・
freind char* operator+(char* s1,char* s2);
};
char* operator+(char* s1,char* s2);

main(){
hoge buffer;

buffer = "A" + "B";
}

して、bufferに"AB"を入れることは可能ですか?
どうすればよいのでしょうか?


381 名前:380 :04/02/03 08:26
char* operator+(char* s1,char* s2);

の箇所の処理内容と、この宣言でよいかも分かりません。

operatorを使って、int型の足し算はできるみたいですがchar*型の
足し算pぽっい実装は可能なのでしょうか?


382 名前:デフォルトの名無しさん :04/02/03 08:40
組込型同士の演算子オーバーロードは、、
int同士の足し算が出来るのは、、

383 名前:デフォルトの名無しさん :04/02/03 10:37
>>380
stlに実装されているぞ。
<string>
の中のぞけ。

てか、
char* operator+(char* s1,char* s2);
これは、普通に書くとメモリ関連で怪しいこと起きるんじゃないのか?

384 名前:デフォルトの名無しさん :04/02/03 10:37
"A" の型はなんだ?

385 名前:デフォルトの名無しさん :04/02/03 12:17
A型


386 名前:デフォルトの名無しさん :04/02/03 12:26
だとしたら 問題はAとBの性別だな

実装を見てみたいものだ ハァハァ

387 名前:デフォルトの名無しさん :04/02/03 13:21
>>385-386
死ね

388 名前:デフォルトの名無しさん :04/02/03 18:58
>380
buffer = "A" "B";

389 名前:380 :04/02/03 23:56
>>382-388
ありがとうございました。
実際、標準stringクラスで試してみたところ、文字列の足し算ぽっいのは
駄目でしたので実装はあきらめました。

 std::string buf1;
 
buf1 = "A"+"B";
printf("%s\n", buf1.c_str());

Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
tes.cpp:
エラー E2085 tes.cpp 12: 無効なポインタの加算(関数 main() )
*** 1 errors in Compile ***



390 名前:デフォルトの名無しさん :04/02/04 00:03
>>389
するならbuf1 = std::string("A") + std::string("B"); では?
"A" + "B" だと文字列リテラルのアドレスを加算しようと
するからエラーだよ。

391 名前:デフォルトの名無しさん :04/02/04 00:14
std::string("A")
が顔文字に見えた

392 名前:デフォルトの名無しさん :04/02/04 00:14
>>389
std::string buf1="A";
buf1+="B";
これじゃダメなの?

393 名前:380 :04/02/04 00:40
>>390
>>392
分かっています。

std::string str="A"

cout << "(" << str << ")" << endl;

こういうのを実装できないのだろうかと思いました。
cout,printf()のような不確定引数はoperatorでも可能なんでしょうか?


394 名前:名無しさん@Vim%Chalice :04/02/04 00:47
>>393
operatorのオーバーロードを勉強しぃや。

395 名前:デフォルトの名無しさん :04/02/04 00:54
>>393
#include <iostream>
using namespace std;

class BracedStr {
private:
 string m_str;
public:
 BracedStr(const string& str) : m_str(str) { }
 friend ostream& operator<<(ostream& ostr, const BracedStr& bstr) {
  return ostr << "(" << bstr.m_str << ")";
 }
};

int main() {
 cout << BracedStr("str") << endl;
}

396 名前:デフォルトの名無しさん :04/02/04 01:03
#include <iostream>
using namespace std;
class CClass {
public:
 int m_i;
};

int main(){
 CClass *d;
 d = new CClass();
 d->m_i = 100;
 delete d;

 cout << d->m_i << endl; // 100が表示される。

 return 0;
}
上のソースコードを実行してみました。
一度 new でメモリを確保し、delete で開放を行ったのち
もう一度アクセスしてみたところ 100が表示されました。
開放してしまったので、アクセス違反が起こるものと思ってましたが、
起きませんでした。
これって d は、ただゴミを指してるわけで 間違いですよね?

397 名前:デフォルトの名無しさん :04/02/04 01:04
>>396
うん。

398 名前:デフォルトの名無しさん :04/02/04 01:07
>>397
thx

399 名前:デフォルトの名無しさん :04/02/04 02:10
stringとchar*の暗黙の型変換用意すればいいんじゃないの?


私ならやらないけど

400 名前:デフォルトの名無しさん :04/02/04 07:27
cout << "(" << str.c_str() << ")" << endl;


401 名前:デフォルトの名無しさん :04/02/04 11:09
string は ostream に直接渡せるはずだが。
まぁ、コンパイラが古ければその限りじゃないけど。

402 名前:デフォルトの名無しさん :04/02/04 18:28
std::cout << ( typeid(int) == typeid(const int &) ) << std::endl;

これってコンパイラによって結果が違ったんだけど、
規格的には、真偽どっち?

vc7.0 => 0
gcc3.2 => 1


403 名前:デフォルトの名無しさん :04/02/04 18:31
規格はどうあれ、その例を見る限り
実際的に移植性の無いコードであることだけは
確かなようだね。

404 名前:デフォルトの名無しさん :04/02/04 18:35
>>402
int f(int a, const int & b) {
std::cout << ( typeid(a) == typeid(b) ) << std::endl;
}

int main () {
int a;
f(a, a);
}
ってやるとVC7.0では0なの?

405 名前:デフォルトの名無しさん :04/02/04 19:07
>>404
それは1になった・・・
ためしに、

void f(int a, const int & b) {
  std::cout << ( typeid(a) == typeid(b) ) << std::endl;
  std::cout << ( typeid(b) == typeid(const int &) ) << std::endl;
  std::cout << ( typeid(b) == typeid(int) ) << std::endl;
}

main() {
  int a;
  f(a, a);
}

ってやると、1 0 1 。
変数名を入れると、const & は無視されるけど、
型名を入れると、const & は有効になるみたい。



406 名前:デフォルトの名無しさん :04/02/04 19:11
>>405
1行目で1が返るのなら、
型名をいれる必要は普通ないからどうでもいいのでは。

# > std::cout << ( typeid(b) == typeid(const int &) ) << std::endl;
# これが0なのは気持ち悪いが。

407 名前:デフォルトの名無しさん :04/02/04 20:22
5.2.8/5
The top-level cv-qualifiers of the lvalue expression or the type-id that is the operand of typeid are always
ignored. [Example:
class D { ... };
D d1;
const D d2;
typeid(d1) == typeid(d2); // yields true
typeid(D) == typeid(const D); // yields true
typeid(D) == typeid(d2); // yields true
typeid(D) == typeid(const D&); // yields true

などと書いてあるが結局どうなるのが正しいのか俺にはよくわからん。

408 名前:デフォルトの名無しさん :04/02/04 20:41
5.2.8 -4- より。
If the type of the type-id is a reference type, the result of the typeid expression refers to a type_info object representing the referenced type.

409 名前:デフォルトの名無しさん :04/02/04 23:12
>>406-408
ありがとです。vc7.0がダメっぽいですね。

templateでtypeid使うときは注意したほうがいいかも?


410 名前:デフォルトの名無しさん :04/02/05 04:50
The C++ Programming Language

411 名前:デフォルトの名無しさん :04/02/05 04:53
↑すいません。ミスです。

↑を他人から借りっぱなしで良い加減自分のを持とうと思うんですが
第4版が出るような話ってありますか?
第3版が出てからだいぶ経っているし、もうそろそろ新しい版が出ても
おかしくないと思うので、今、第3版を買うのはなんか気が引けるんですが

412 名前:デフォルトの名無しさん :04/02/05 05:38
4版なんて聞いたことないし、まえの規格で
大体大枠は決まったようなもんだから、問題ないんじゃない?

413 名前:デフォルトの名無しさん :04/02/05 05:56
あるとしたら次の標準C++の改訂合わせだという気がするが、
その前に日本語版3rd SEがでないとは言えないか。

414 名前:デフォルトの名無しさん :04/02/05 09:36
まぁ、今の版買っても問題ないってことですね。ありがとうございます。
ちなみに英語版と読み比べた方っておられますか?
日本語版の翻訳に特に不満はないんですが、
もし、英語版の方が良いよ、って方がいたら英語版の評価聞きたいです。

415 名前:デフォルトの名無しさん :04/02/05 11:16
一応2003年にちょっと改訂入ったんだが。<標準C++
まぁ実質typo修正と仕様の明確化だけらしいけど。

416 名前:デフォルトの名無しさん :04/02/07 19:37
ネタ求めage

417 名前:デフォルトの名無しさん :04/02/07 21:37
>>416
プログラムでも書いてろ。

418 名前:デフォルトの名無しさん :04/02/08 14:59
>>411
禿の証言は読んだか?

http://www.research.att.com/~bs/bs_faq.html#4th

419 名前:デフォルトの名無しさん :04/02/08 15:07
http://www15.cds.ne.jp/~xak/gotta/z200304.html
ここの2003/4/3の日記にあるような、SAFE_DELETE()ってマクロは
どこ界隈で流行っているんでしょうか?

0をdeleteしようがdelete[]しようが安全なわけだが…
安全じゃない処理系があんの?


420 名前:デフォルトの名無しさん :04/02/08 15:11
>>419
http://tt.sakura.ne.jp/~suzu/tips/delete.html

421 名前:デフォルトの名無しさん :04/02/08 15:12
>420
無関係じゃん。


422 名前:デフォルトの名無しさん :04/02/08 15:13
質問の答えにはなってなかったな
スマン

423 名前:419 :04/02/08 15:15
>>422
いや、俺はdeleteとdelete[]の混用などしないし、そもそもdeleteも
めったに使わないよ。smart pointerが正解だと思っている。
同僚がSAFE_DELETEなる意味不明な代物を愛用しているので、一応その
発祥を把握しておきたいだけ。


424 名前:デフォルトの名無しさん :04/02/08 15:18
if の部分より、delete したあとに NULL をブチ込むことのほうに意味があるんじゃないの?

425 名前:419 :04/02/08 15:29
>424
なるほど。ありがとうございました。


426 名前:デフォルトの名無しさん :04/02/08 16:42
昔のコンパイラだと delete 0; がエラーになったこともある気がする。

427 名前:デフォルトの名無しさん :04/02/08 16:44
以下のコードを実行すると
segvってしまいます。

#include <vector>
#include <iostream>
#include <string>
using namespace std;

int main(int argc, char *argv[])
{
vector <string> a;
a.reserve(8);
a[0] = string("unko");
return 0;
}

reserveしないで初めから
vector<string> a(8);
としていれば大丈夫なんですが…
この原因と対策をご教授ください。



428 名前:デフォルトの名無しさん :04/02/08 16:51
>>427
a.reserve(8);だけでは予備のメモリが確保されるだけで初期設定されないから、
a.size()は0のままだ。このとき、a[0]の結果は(多分)未定義。
a[0] = string("unko");
の代わりに
a.push_back("unko");
または、
a.resize(8);
a[0] = "unko";
とすべし。

429 名前:411 :04/02/08 16:52
>>418
読んでませんでした・・・っていうか3版買ってきちゃいました.
でもとりあえずはこれを買って後悔することはないということですね.
ありがとうございます.

430 名前:デフォルトの名無しさん :04/02/08 16:54
>>427
確かにクソみたいな質問だがウンコはやめれ

vector::reserve()は必要な領域を確保するだけ。初期化はしない。
vector<string> a(8)なら初期化もする。

このくらい、ヘルプなりドキュメントなり自分で読むことを覚えろ。

431 名前:デフォルトの名無しさん :04/02/08 16:59
>>428
即レスありがとうございます。
string でなく int ではうまくいってた(今みたらsize()は0でしたが)
ので???と思っていました。
以後気をつけます。

432 名前:デフォルトの名無しさん :04/02/09 14:57
>>431
intでもsegv起こしてくれれば悩まずに済んだのにな。

433 名前:デフォルトの名無しさん :04/02/09 18:39
関数finalizeでページ違反エラーが出てしまうのですが、解決策を教えていただけませんか?
やりたい事は、initialize関数でB*にキャストしたAのメモリを、finalize関数で解放する事です。
VC6を使っています。
--

class A : public B {}; //
class B       {}; //


void initialize( B* b )
{
   A* a = new A;
   b = ( B* )a;
}

void finalize( B* b )
{
   A* a = ( A* )b;
   delete a;
}

int main()
{
   B* b = 0;
   initialize( b );
//  ここで b を色々操作します。Aの継承内容に関わらず、操作は同じ物で済むようにしたいのです。
   finalize( b );
   return 0;
}


434 名前:433 :04/02/09 18:45
あ、すみません。
エラー出ないかもしれません。
お騒がせして申し訳ありませんでした。

435 名前:デフォルトの名無しさん :04/02/09 19:30
まーとりあえずデストラクタをvirtualにしとけ

436 名前:デフォルトの名無しさん :04/02/09 19:43
>>435
デストラクタをvirtualにする理由を教えてあげなさい。


437 名前:デフォルトの名無しさん :04/02/09 19:47
そんなことはどうでもいい。
とりあえずデバッガで一行ずつ進めて、
initialize(b);
の直後、bに入ってる値を見ろ。

438 名前:デフォルトの名無しさん :04/02/09 19:50
>>433
void initialize( B* b )

void initialize( B*& b )
にせよ。
>>435の言うようにvirtualのデストラクタも必要。
それがないと、delete a;ではaがBのインスタンスを指していることが
実行時に解らない。

439 名前:デフォルトの名無しさん :04/02/09 19:56
それ、だせーな

440 名前:デフォルトの名無しさん :04/02/09 20:11
B *initialize(void)
{
   return static_cast<B *>(new A);
}
ってか?

しかし、ほんとこの意味不明なキャストは何をしたいんだ。

441 名前:433 :04/02/09 21:02
> void initialize( B*& b )

ありがとうございました。

442 名前:デフォルトの名無しさん :04/02/09 21:09
えー?解決したのかよ。

443 名前:デフォルトの名無しさん :04/02/09 22:35
gccでダイナミックリンクライブラリ作成する予定です。
DLLを使用する側はC言語で、DLLはC++で作成使用と思うのですが

利用する側で、関数がばらばらになっていると使いずらいので、
関数を構造体とか、クラスをひとまとめにして利用する(extern)
方法はあるのでしょうか?


444 名前:デフォルトの名無しさん :04/02/09 22:42
>>443
まず日本語からやりなおせ。

445 名前:デフォルトの名無しさん :04/02/09 22:56
extern void func1();
extern void func2();
extern void func3();

だと管理しづらいので



extern struct hoge; //ここの記述がなぞ。

みたいにして

int main(){

hoge.func1();
hoge.func2();
hoge.func3();

}

構造体、クラスのメソッドみたいな利用法はできますか?



446 名前:デフォルトの名無しさん :04/02/09 23:02
> だと管理しづらいので

名前の衝突が問題ならnamespace使う。
外部参照がめんどくさいならヘッダファイル作る。
数が多いのが問題ならあきらめる。

447 名前:デフォルトの名無しさん :04/02/09 23:05
>>446
あらがとうございます。

クラスor構造体を外部参照にすることは出来ないのですね?


448 名前:デフォルトの名無しさん :04/02/09 23:08
>>447
「外部参照」を何と心得る?

449 名前:デフォルトの名無しさん :04/02/09 23:08
DLL ってそもそも C で利用されることを想定して作られたのでは?

450 名前:デフォルトの名無しさん :04/02/09 23:10
コンパイラ(リンカ)によっては、こんな記述もできるかも。試してないよ。

class hoge_tmpl {
public:
 static void func1() {...}
 static void func2() {...}
 static void func2() {...}
private:
 // no member
};
extern hoge_tmpl hoge;

int main() {
 hoge.func1();
 hoge.func2();
 hoge.func3();
}

実体をどこかに作れば確実だけどね。

451 名前:デフォルトの名無しさん :04/02/09 23:12
COM の真似するのが一番?

452 名前:デフォルトの名無しさん :04/02/09 23:18
そもそも、Cで利用するDLLで、クラスとか使ったら駄目だろ。

利用側で、関数ポインタを羅列した構造体にアドレスをぶち込んでいけば
それっぽいものになるんじゃねの?

453 名前:デフォルトの名無しさん :04/02/09 23:23
わかりますた。
普通にします。


454 名前:デフォルトの名無しさん :04/02/09 23:24
インターフェイスさえ互換性があるのなら
内部の実装なんてどうでもいいじゃん

455 名前:452 :04/02/09 23:26
>そもそも、Cで利用するDLLで、クラスとか使ったら駄目だろ。

ちょっと足りなかった。
Cで利用するDLL「のインターフェイス部分」でC++の機能を使ったら駄目だろ。

456 名前:デフォルトの名無しさん :04/02/10 00:23
COMはCでも使えるよん

457 名前:デフォルトの名無しさん :04/02/10 00:32
>>454
コレってコピペ?
最近良く見かけるけど。

458 名前:デフォルトの名無しさん :04/02/10 01:07
STLつかうと一気n(ry

459 名前:デフォルトの名無しさん :04/02/10 01:32
クラスがあまりでかいと、おかしくなりますか?
double 型変数を一個足したら、うまく動かないプログラムになりました。
sizeof(クラス) = 18048 byte でした。

460 名前:デフォルトの名無しさん :04/02/10 01:37
それは隠れたバグが表面化しただけ

461 名前:デフォルトの名無しさん :04/02/10 01:43
でも、メンバ変数をひとつ増やすかどうかだけで、
表面化するようなバグを思いつけないのです。
その行をコメントアウトすれば大丈夫なのに、しないといっちゃう。
具体的にその変数を使ってるところもないし。

462 名前:デフォルトの名無しさん :04/02/10 01:51
>>461
double自体には罪無し。
どこかのメモリをその構造体がはみ出して誤って上書きしていることが多い。


463 名前:デフォルトの名無しさん :04/02/10 01:52
>>461
配列が「プログラム全体のどこかで」あふれているときに起こることが多い。

464 名前:デフォルトの名無しさん :04/02/10 01:54
>>458
環境(略)ない。

465 名前:デフォルトの名無しさん :04/02/10 01:58
>>461
1. 初期化していない変数を使ってる箇所が「プログラム全体のどこか」に存在する。
2. 配列かポインタを使ってるときに、添え字や参照先が異常なものになってしまってる部分が
  「プログラム全体のどこか」に存在する。

大抵こんなところ。

466 名前:デフォルトの名無しさん :04/02/10 02:10
>>464
すげ(中略)ルサイズが増え(中略)人。

467 名前:デフォルトの名無しさん :04/02/10 02:24
>461
とにかくエラーメッセージか何かは出てないのか?

俺が思いつくのは単純にスタックオーバーフローとか。

468 名前:461 :04/02/10 02:24
はぁー、
結構根深いバグのようで、
みなさん、どうもありがとうございました。



469 名前:デフォルトの名無しさん :04/02/10 02:27
The Blob アンチパターン?

470 名前:デフォルトの名無しさん :04/02/10 02:42
初心者な質問ですみません。大きな配列が格納されているクラスmyclassが
あったとして、(myclassはコンストラクタもデストラクタもなし)

myclass *obj=new myclass;
(省略)
delete obj;

としたとき、newで確保された領域全部が開放されるのですか?


471 名前:デフォルトの名無しさん :04/02/10 02:46
>>470
そうです。但しポインタに内部でnewで割り当てていたりしたら
自動では開放されないのでデストラクタに突っ込むべし。

472 名前:461 :04/02/10 03:37
ほんとに低レベルですみません。
最初はスレッドセーフなC関数しか使わないし、
と思って VC++ で CreateThread を使っておきながら・・・
_beginthread で書き換えてみたら直ったようです。
>>460,462,463,465,467 さん、
C に毛を生やしただけのようなコードしか書けない私に助言してくださって、
ありがとうございます。

473 名前:デフォルトの名無しさん :04/02/10 03:50
C1010: プ(略

474 名前:デフォルトの名無しさん :04/02/10 13:12
>>473
#(ry)。


475 名前:デフォルトの名無しさん :04/02/10 21:56
>>470
あなたが使っているoperator deleteは領域全部を解放しているのですか?
デフォルトのoperator deleteを使っているなら、
そのoperator deleteのドキュメントには何と書いてありますか?

これはユーザ定義。何とも答えようがありません。

476 名前:デフォルトの名無しさん :04/02/11 03:25
>>475

そんな言い方すると、C++のほとんどの挙動はユーザ定義可能であって、
初心者にはまともな質問も回答も難しいだろ。

確かに>>470の質問は勉強不足というか、C++の教本なら絶対に書いてある
内容なので煽りたい気持ちもわかるが、ちょっと大人気ないよ。

これだけだと俺もフレームっぽいので>>470に答えておくと、
初心者の質問ということで「newで確保された領域全部」というのが
本当に把握できているのかどうか疑問だが、
「classで定義されている領域は解放される」。
だが、(コンストラクタ・デストラクタのあるなしにかかわらず)
classが動的に確保した領域は解放されない。
たとえばメンバ関数にポインタを持っていて、なんらかの処理で
このポインタに対して動的にメモリを確保した場合、ここは
解放されない。この場合、領域の解放に加えて、代入や初期化の
副作用の可能性も考慮する必要がある。

ただね、こんなのはC++の基本中の基本なのでもっとちゃんと
学習するなり自分で調べるなりするのを勧める。

477 名前:デフォルトの名無しさん :04/02/11 07:07
もう・・・名前空間とかわけわかんね・・・。

"std::ifsreamからstd::ifstreamへ変換できません”とかわけわからんエラーでるし・・・。なんねコレ
おなじやんか!!!変換しろ!

予想できる原因教えてくださいm(_ _)m



478 名前:デフォルトの名無しさん :04/02/11 07:25
スペルミス

479 名前:デフォルトの名無しさん :04/02/11 07:25
ヘルプ検索すると、新しい<fsteam>について、
『ファイル ハンドルからストリームを作成できません。』
て書いてあるんですが、この辺かな・・・。意味わからん。


問題のプログラムを省略してかくと大体こんな感じのプログラムなんですが、
using namespace std;

int Inputdata(ifstream );//プロトタイプ宣言 内容省略

int main(){

fstream fin("data.txt");

Inputdata(fin);

}

Inputdata(ifstream)にストリームを渡す時にエラーがでてます。


480 名前:デフォルトの名無しさん :04/02/11 07:35
> "std::ifsreamからstd::ifstream
      ~
> ヘルプ検索すると、新しい<fsteam>について、
                   ~

ifstreamになったりfstreamになったり、
ほんとにスペルミスでFA?

481 名前:デフォルトの名無しさん :04/02/11 07:37
それはちがいますw
コピペじゃなくて打ち込んだので、実際のプログラムではそろってます・・・。

482 名前:デフォルトの名無しさん :04/02/11 07:37
basic_fstreamはbasic_ifstreamおよびbasic_ofstreamを継承してないから

483 名前:デフォルトの名無しさん :04/02/11 09:21
>>476
> だが、(コンストラクタ・デストラクタのあるなしにかかわらず)
> classが動的に確保した領域は解放されない。

はぁ ? そういうところを含めて、「ユーザ定義」だろ。
デストラクタで解放するように作ることもできるんだから。

要は、>>475 は myclass の中身がわからんと答えようがないと言ってるだけだろ。
だから、>>470 がホントに回答得たいなら、どっかに class の定義をアップするしかないよ。

484 名前:デフォルトの名無しさん :04/02/11 11:53
ストリーム系のクラスってコピーできないんじゃないっけ?

485 名前:デフォルトの名無しさん :04/02/11 13:52
ifstreamを参照で受け取りなはれ

486 名前:デフォルトの名無しさん :04/02/11 16:46
>>485 ありがとうございます。コンパイルは通りましたm(_ _)m
でも今度はプログラムが固まってしまいます。どなたかお助けを〜環境はVisualStudio.NTEです。

『 Run-Time Check Failure #2 - Stack around the variable 'c' was corrupted. 』

やりたいこと: テキストファイルから指定の文字列を見つけてその行に書かれている整数データを入力し、結果を確認のために出力

<data.txtの内容>
data1: 2 3 5 5 5 12 35
data2: 1 2 3 4 5 6 7 8 9 10 3



487 名前:デフォルトの名無しさん :04/02/11 16:46
関数
int Mystring::InputData(ifstream &fin, char str[ ] ){

char s[100];
int data[51]={0};
int i, n;
int ret;
while(!fin.eof()){//ファイルの終わりまで文字列strを探す
fin >> s;
if(strcmp(s, str)==0){break;}//見つけたらそこで止まる
}

char c[1];
n=0;
fin >>c;

if(c[0] !='\n'){//先頭に空白文字,改行があったら読み飛ばす
data[ n]=atoi(c);
n++;
}

while(fin.peek()!='\n' && fin.eof()==0){ // 改行になったら入力終了
fin >> data[n];
cnt++;
}

for(i=0;i< 50;i++)cout << ' ' << data[i];//確認の出力
return 0;
}


488 名前:デフォルトの名無しさん :04/02/11 16:49

コノ関数をmainのなかで呼び出して、使うと確認の出力まではいくのですがそこで固まってしまいます。

int main(){
Mystring Data;

ifstream fin("data.txt");

InputData(fin,"data1:" );

int end;
cin >> end;
return 0
}


489 名前:デフォルトの名無しさん :04/02/11 17:46
ごめんなさいこの質問なし・・・ あふぉやった・・・。

490 名前:デフォルトの名無しさん :04/02/11 17:48
warota

491 名前:デフォルトの名無しさん :04/02/12 01:01
>>483

>>デストラクタで解放するように作ることもできるんだから。

>>470にデストラクタは作ってないって書いてあるじゃん。
ちゃんと流れを把握しろよな。

>>470の質問
-->>475でoperator deleteに関する突っ込み
---->>476で初心者だからデフォルトの挙動を説明

だろ。ここでデストラクタの話を出してどうするんだ。


492 名前:デフォルトの名無しさん :04/02/12 01:43
>>491
言葉は少々汚いが、根はやさしい奴(・∀・)ハケーン!

493 名前:デフォルトの名無しさん :04/02/12 18:21
ocx を作ろうと思うのですが、
VC++とBC++Builderのどちらがよいですか?
MFCを覚えるのが面倒だからBCCの方がよいかと思っているのですが。

494 名前:デフォルトの名無しさん :04/02/12 23:23
VC++でSDK
これ最適解。

495 名前:デフォルトの名無しさん :04/02/12 23:31
bccはヤメトケ
いろんな意味で不幸だ

496 名前:デフォルトの名無しさん :04/02/13 00:38
>>493
VCでもMFC使わずにいけるし、BCCでOWLとどこが違うと言いたいんだ?

497 名前:デフォルトの名無しさん :04/02/13 00:51
VC++でATL/WTL
これ最適解。


498 名前:デフォルトの名無しさん :04/02/13 03:03
>>493
ATLに一票。

499 名前:デフォルトの名無しさん :04/02/13 16:50
mingwを使ってますが、DOS窓で表示される
長いコンパイルエラーを全て見る方法はありませんか

500 名前:デフォルトの名無しさん :04/02/13 16:55
>>499
Dev-C++を使ってコンパイルし、エラー出力窓をスクロールして
見る。


■過去ログ置き場に戻る■ 1- 前250 次250 最新50
DAT2HTML 0.33f Converted.