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


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

C++相談室 part7
251 名前:デフォルトの名無しさん :02/05/27 11:20
>>244
駄目じゃないって。

>>249
これも。

さらに
int a = int();
と書くと0で初期化される。

252 名前:デフォルトの名無しさん :02/05/27 12:10
>>243
コピーコンストラクタが使われる。試しに class T に、
private: T( const T& );
を追加してコンパイルしてみるとよい。

>>248
operator void *() じゃなかったかな。直接 bool に変換しちゃうと、
いろいろ問題が発生するはず。

253 名前:デフォルトの名無しさん :02/05/27 12:18
Heap block at 0410E2C8 modified at 04112D00 past requested size of 4a30

VC++でこんなログを残してプログラムが終了します。
初心者なのでどういう意味かわかりません。
どうしたら、回避できるのでしょうか...

ちなみにDirectSoundのセカンダリバッファをリリースしたところで
発生します。


254 名前:デフォルトの名無しさん :02/05/27 12:33
>>245
cinはistream型でistreamはtypedef basic_istream<char, char_traits<char> > istream;。
basic_istreamはbasic_ios<E, T>をvirtual public で継承している。
basic_iosには operator void *() const;が定義されていて、これはbasic_ios::fail()がtrueの場合
nullポインタを返す。

basic_isreamのoperator>>の返り値はbasic_istream&でこれがvoid*に変換されて最終的には
basic_ios::operator void*()が呼ばれる。


255 名前:デフォルトの名無しさん :02/05/27 12:38
>>253
heap block の意味は分かる? at 〜 というのはアドレスを表している。
そして、past 〜 は、「〜を過ぎたところで」という前置詞だ。さあ、
少し頭を使ってメッセージの意味を考えてみよう。

256 名前:254 :02/05/27 13:03
0x0410E2C8におけるヒープ領域は0x04112D00に修正された

257 名前:名無しさん :02/05/27 14:07
243です
>>252
コピーコンストラクタをprivateにするとコンパイル
できないので、コピーコンストラクタが呼ばれてるこ
とがわかりました。結局、
T obj = T();
とした場合、まずクラスTのデフォルトコンストラクタが
呼ばれて一時オブジェクトが作成され、この一時オブジェクト
がコピーコンストラクタの引数に使われて obj が初期化
されるということですね。わかりました。皆様ありがとう
ございました。

258 名前:デフォルトの名無しさん :02/05/27 14:39
T &obj=T();
なら一時オブジェクトの寿命がのびてもっといい

259 名前:デフォルトの名無しさん :02/05/27 14:51
>>258
ふつう、const が必要にならないか?

260 名前:デフォルトの名無しさん :02/05/27 19:38
ポインタって使うと例えばどういうメリットがあるんですか?

261 名前:デフォルトの名無しさん :02/05/27 19:59
ソートする時クラスのインスタンスや構造体ごと並び替えるより
ポインタだけ付け替えて並び替えた方が速い。

262 名前:いさましいおsageの女の子 :02/05/27 20:31
ごめんね ++が付かなかったよ。

どうやるの?
http://pc.2ch.net/test/read.cgi/tech/1022499000/


263 名前:デフォルトの名無しさん :02/05/27 21:27
>>258
ンなこと出来たっけ!?

264 名前:デフォルトの名無しさん :02/05/28 00:40
何も表示しない出力ストリームってないでしょうか?

デバッグのときだけ、メッセージを表示させたいんです。
たとえば、

#ifdef __DEBUG
#define cdbg std::cerr
#else
#define cdbg cnull //cnullが何も表示しないストリーム
#endif
として、
cdbg << "Debug Message" << std::endl;
みたいな感じで使いたいんです。

自分で書いてもみたんですが、
gcc-2.xxでないとコンパイルが通らない(gcc-3.xxだとダメ)という
ヘタレコードしか書けませぬ。

とにかくデバッグ時にだけメッセージを表示させたいのですが、
なにかいいアイデアなどありませんでしょうか?


265 名前:デフォルトの名無しさん :02/05/28 00:41
HSPとC++どっちがにんきある???

266 名前:デフォルトの名無しさん :02/05/28 00:46
>>264 定石のdebug_printfじゃ駄目なの?

267 名前:デフォルトの名無しさん :02/05/28 00:47
>>264
a.out > /dev/null

test.exe > nul


268 名前:デフォルトの名無しさん :02/05/28 00:53
cnullを自分で作れ

269 名前:デフォルトの名無しさん :02/05/28 02:27
カナリ強引だがコレでどーよ。

class cnull{
public:
template <typename T>
cnull& operator<<(T t) {return *this;}
};

270 名前:269 :02/05/28 02:39
あぁ、std::endl とか使えねぇや、鬱氏。

271 名前:デフォルトの名無しさん :02/05/28 02:44
ofstream cnull("/dev/null");


272 名前:デフォルトの名無しさん :02/05/28 09:56
>>263
const な参照は一時オブジェクトを束縛することができる (標準仕様)。
VC++ だと const でない参照でも OK みたいで、次のようなコードも
コンパイルできてしまう。
struct X { int i; };
void foo( X& x ) { x.i = 0; }
int main() {
foo( X() );
return 0;
}
たしかに一時的なワークスペースとして使うぶんには便利かもしれんが、
バグを引き起こしやすいし移植性も無くなるので止めてほしい。

273 名前:デフォルトの名無しさん :02/05/28 12:09
>struct X { int i; };
>void foo( X& x ) { x.i = 0; }
>int main() {
>foo( X() );
>return 0;
>}
これは一つの式内だから標準仕様でもいいはず

X &x = X() ;

const X &x = X() ;
でなければ一時オブジェクトが
束縛されることを保障されないはず

bcc 5.6で試したらX &x=X();も
異常な動作はしなかったけども

274 名前:263 :02/05/28 21:35
>>272
>const な参照は一時オブジェクトを束縛することができる (標準仕様)。
初耳。紫蘭買った。その参照がスコープから外れるまで?

275 名前:デフォルトの名無しさん :02/05/28 22:07
>>274
> その参照がスコープから外れるまで?
そう。C++ 第3版 「5.5 リファレンス」のところに詳しく書いてあるよ。

276 名前:デフォルトの名無しさん :02/05/28 22:27
int main()
{
int i, n;

puts("<html><title>(゚Д゚)</title><body bgcolor = black>");
for(n = i = 0;i < 0xffffff;i+=0xffff,n++)
printf("<font style = \"font:%02dpt; color:#%06X;\">(゚Д゚)</font>\n",n,i);
puts("</body></html>");

return 0;
}

277 名前:デフォルトの名無しさん :02/05/28 22:30
printf("<font style = \"font:%02dpt; color:#%06X;\">(゚Д゚)</font><br>\n",n,i);

278 名前:デフォルトの名無しさん :02/05/28 22:36
int main()
{
int i, n;

for(i = 0;i < 10;i++)puts("<br>");
puts("<html><title>(゚Д゚)</title><body bgcolor = black><center>");
for(n = i = 0;i < 0xffffff;i+=0xffff,n++)
printf("<font style = \"font:%dpt; color:#%06X;\">(゚Д゚)</font><br>\n",n,i);
for(;i >= 0;i-=0xffff,n--)
printf("<font style = \"font:%dpt; color:#%06X;\">(゚Д゚)</font><br>\n",n,i);
puts("</center></body></html>");
for(i = 0;i < 10;i++)puts("<br>");

return 0;
}

279 名前:デフォルトの名無しさん :02/05/28 22:41
>>275
成程!なんとなぁく理解したような気がしないでもない。
理解をさらに深めるために質問、例えばこんなのは出来るんでしょうか?
const A& a = i > 0 ? A(1) : A(0);
というか試してみろって感じですな。ではまた後ほど。

280 名前:デフォルトの名無しさん :02/05/28 22:43
全然おっけー

281 名前:デフォルトの名無しさん :02/05/28 22:45
const char *text = "リテラル";
の意味を教えてくだされー


282 名前:デフォルトの名無しさん :02/05/28 22:47
>>281
本 を 読 め

子  一  時  間  読  め

283 名前:デフォルトの名無しさん :02/05/28 22:47
>>280
出来ましたです。こりゃ便利。この書き方は何かの時に役に立ちそう。

284 名前:デフォルトの名無しさん :02/05/28 22:52
inlineって数回しか呼ばれない関数とかに使うんですか?

285 名前:デフォルトの名無しさん :02/05/28 22:53
>>284違います


286 名前:デフォルトの名無しさん :02/05/28 22:55
>>284
inlineは型チェック付きのマクロと思えばだいぶ近い。

287 名前:デフォルトの名無しさん :02/05/28 22:58
関数呼び出しのコードを関数本体に書き換える指定子ですよね?

288 名前:デフォルトの名無しさん :02/05/28 22:58
試してみたら違ったよ!

VC6,VC7:
> const A& a = i > 0 ? A(1) : A(0);
コピーコンストラクタが呼ばれる(インスタンスは2回作られる)
> const A& a = A(1);
コピーコンストラクタは呼ばれない(インスタンスは1回作られる)

g++2.95.3,g++3.0.4:
> const A& a = i > 0 ? A(1) : A(0);
> const A& a = A(1);
コピーコンストラクタは呼ばれない(インスタンスは1回作られる)

gccのほうが偉い!

289 名前:デフォルトの名無しさん :02/05/28 23:01
三項演算子はリファレンスを返してくれればいいはずだが・・・・


290 名前:デフォルトの名無しさん :02/05/28 23:04
>>283
いままでも無意識にやってたんじゃないかと思うけど、関数からの戻値が
オブジェクトそのものの時とか、この書き方は必須だよね。こんな感じ。
class X { };
X foo() { x = X(); return x; }
int main() {
const X& x = foo();
}

291 名前:デフォルトの名無しさん :02/05/28 23:10
ある時以外参照にconstを付けないのはドキュソ!決定!

292 名前:デフォルトの名無しさん :02/05/28 23:16
メンバ変数でそのテクは使えませんでした・・・

293 名前:デフォルトの名無しさん :02/05/28 23:16
short &a;
short& a;
short & a;
全部同じですか?

294 名前:デフォルトの名無しさん :02/05/28 23:17
>>289
bool f;
int i = f ? 0 : 1;
でリファレンスが返ってくるのは、ちとイヤン

295 名前:デフォルトの名無しさん :02/05/28 23:28
>>290
まともなコンパイラなら
X x = foo();
と書いてもほとんど処理内容は同じ。

296 名前:デフォルトの名無しさん :02/05/28 23:57
>>293
short&a; が抜けてる。

297 名前:デフォルトの名無しさん :02/05/29 00:12
>>296 え、まじで全部同じなの?
なんでそんなあいまいにしてあるんだろ?

298 名前:デフォルトの名無しさん :02/05/29 00:12
>オブジェクトそのものの時とか、この書き方は必須だよね。こんな感じ。
ああああ、C++10年目にして目からもろこが


299 名前:デフォルトの名無しさん :02/05/29 00:26
ばん違いかもしれませんがvc++.netの良書ってあります?

300 名前:デフォルトの名無しさん :02/05/29 00:29
10年前のC++と今ではだいぶ違うような

301 名前:デフォルトの名無しさん :02/05/29 01:09
>>281 何でポインタにリテラル値を入れられるのか疑問だったりして


302 名前:デフォルトの名無しさん :02/05/29 01:58
>>295
戻り値最適化というやつですな。

303 名前:デフォルトの名無しさん :02/05/29 02:06
コピーコンストラクタがヘタレな場合は
処理が同じとは限らない

304 名前:デフォルトの名無しさん :02/05/29 03:44
プログラムの高速化をするにはたとえばどんな方法がありますかねぇ?

305 名前:デフォルトの名無しさん :02/05/29 03:45
プロファイリング→時間消費してる所を最適化

306 名前:デフォルトの名無しさん :02/05/29 04:20
マシンの高速化、これ最強

307 名前:デフォルトの名無しさん :02/05/29 04:39
プロファイリングってどうやってすればいいんですか?

308 名前:デフォルトの名無しさん :02/05/29 04:40
証拠や犯行当時の状況から
犯人像を空想すればいい

309 名前:デフォルトの名無しさん :02/05/29 04:42
それ、違うと思いますけど...

310 名前:デフォルトの名無しさん :02/05/29 04:51
>>309
空想じゃなくて妄想ってこと?

311 名前:デフォルトの名無しさん :02/05/29 04:51
てめえ、マシンを買い換えればいいって俺が書いてんだろうがゴルァ!!

312 名前:デフォルトの名無しさん :02/05/29 06:12
>>306=>>311
真理だね(w

現実にそういう手段が取れるとは限らないのが現実だけど。

313 名前:デフォルトの名無しさん :02/05/29 07:09
>>297
1 + 2
1+ 2
1 +2
1+2
どれも同じなのと一緒

314 名前:デフォルトの名無しさん :02/05/29 09:50
そういえば俺も
int* a

int *a
の違いに悩んだっけ・・・(´∀` )
今から考えるとアフォだ。

315 名前:デフォルトの名無しさん :02/05/29 11:21
昔のint *a;オンリーは、ポインタの理解をちょっとだけ妨げてるよね。
int* a;の方が別の型っぽいし。

>>304
ループ、フォースの力を信じろ、ループ!
http://www.csl.sony.co.jp/person/fnami/pentopt.htm

316 名前:デフォルトの名無しさん :02/05/29 11:22
すまない、直リンしちまったい…ここリンクフリーかねぇ

317 名前:デフォルトの名無しさん :02/05/29 11:33
>>315
int* p, i; でどつぼにはまる罠

リンク先面白そうなのでブックマークしたけどまだ世界が違いすぎる・・・

318 名前:デフォルトの名無しさん :02/05/29 11:41
>>315
そのページ、百害あって一理なしだぞ

319 名前:デフォルトの名無しさん :02/05/29 11:54
const Hoge* pとHoge* const pの違いとか。


320 名前:デフォルトの名無しさん :02/05/29 13:20
なぜに以下のコードはコンパイル不能なのでしょうか?

#include<iostream>

class B{
public:
void Hoge(int i){cout<<"hoge i="<<i<<endl;};
};

class A:public B{
public:
void Hoge(){cout<<"hoge"<<endl;};
};

main()
{
A a;
a.Hoge(5);
}


321 名前:デフォルトの名無しさん :02/05/29 13:26
using B::Hoge;

322 名前:デフォルトの名無しさん :02/05/29 13:42
>>321
ぅぉ・・・320じゃないけど知らなかったっす。

323 名前:デフォルトの名無しさん :02/05/29 13:47
Effective C++ 50項の最後の例を読むべし。
まあ、C++ やってる人は一度はこの問題にハマってると思う (w

324 名前:320 :02/05/29 13:51
>>321
ども。
でも何でこんな面倒くさい仕様になっちょるんでしょう?


325 名前:デフォルトの名無しさん :02/05/29 13:52
親クラスと同名のメソッドを定義するのは
大部分はツリーの把握ミスだったり、
単なる設計ミスだったり、あんまり良い行為とは言えないから

326 名前:デフォルトの名無しさん :02/05/29 14:05
なるほDON

327 名前:デフォルトの名無しさん :02/05/29 14:06
>>325
黙ってコンパイルを通すと、意図せぬ結果をもたらす可能性が高いものね。
発見しにくいバグよりは、明示的な宣言必須の方が有り難い。

(というのが C++ の思想なんだと思うよ)

328 名前:名無しサンプリング@48kHz :02/05/29 14:21
クラスを継承して元のクラスの1つのメンバ関数を
オーバーライドしたいのですが、元のクラスのコンストラクタ
では引数を渡して初期化処理をしています。
その部分を元のクラスのままにしておきたいのですが
継承したクラスのコンストラクタはどのように書くべきでしょうか?


329 名前:デフォルトの名無しさん :02/05/29 14:26
Derived(int x) : Super(x) { }

330 名前:名無しサンプリング@48kHz :02/05/29 14:56
>>329
即効で出来ちゃーた…
ありがとうございます!

331 名前:デフォルトの名無しさん :02/05/29 15:27
情けない質問ですんまそん。
なんで cout が通らないんでしょうか。gcc 2.95 です。
独習C++ を読んでます。

#include <iostream.h>
main () {
int i;
cout << "abo-n\n";
}


332 名前:デフォルトの名無しさん :02/05/29 15:31
>>331
どう通らないのか書いてほしいです。
プログラム板一同。

333 名前:331っす :02/05/29 15:34
すんまそん。やっぱlinkerの問題なんでしょうか。

/tmp/ccSlq0KV.o: In function `main':
/tmp/ccSlq0KV.o(.text+0xf): undefined reference to `cout'
/tmp/ccSlq0KV.o(.text+0x14): undefined reference to
`ostream::operator<<(char const *)'


334 名前:デフォルトの名無しさん :02/05/29 15:36
>>333
古いiostream.hは使わないようにしませう

335 名前:デフォルトの名無しさん :02/05/29 15:37
-lstdc++とか?

336 名前:デフォルトの名無しさん :02/05/29 15:37
あるプログラム系のHPで
newが失敗したときにnullを返すのは時代錯誤もいいところ
と言っていたのですが、これ一般論ですか?

つまりnewするところは常に例外を補足するようにしろということ
ですよね?
でも慣れたプログラマでさえ完全に資源漏れが起きないように
例外処理を書くのが難しい現状では、ちょっと理想論ぽく聞こえ
るんですけど...。

手軽にやるには、if (!(Foo *foo = new Foo(...)))はまだ健在ですよね?

337 名前:デフォルトの名無しさん :02/05/29 15:41
>>336
データ用の変数にエラーを示す値を入れるのはおかしい。

って話じゃないの。

338 名前:デフォルトの名無しさん :02/05/29 15:42
>>336
そんなあなたのために new(std::nothrow)

339 名前:デフォルトの名無しさん :02/05/29 15:43
俺はそれ以前にnewの結果チェックすらしてないんですが、逝ってよし?
いまだかつてnew失敗に出くわしたことないんだけど。

340 名前:デフォルトの名無しさん :02/05/29 15:45
手軽にやるには、if (!(Foo *foo = new Foo(...)))はまだ健在ですよね?

Foo* foo = new Foo(...);
...
の方が遙かに手軽な罠

341 名前:331っす :02/05/29 15:48
>334
find かけてみたところ出てきたのはこれだけでした。
/usr/include/g++/iostream.h 9675bytes
Copyright (C) 1993 Free Software Foundation
gcc のもっと新しいヴァーヂョン入れろちゅー事ですか?

>335
通ったァァァァァァッ
C++モードの時はこげなスイッチ必要だったんですか。
man gcc でみたら拡張子 C とか cc にすれば++モードになるみたいな
事書いてあったの鵜呑みにしてますた。ショックです。ありがとですた。


342 名前:デフォルトの名無しさん :02/05/29 15:49
ここですか?>>336
http://www.remus.dti.ne.jp/~seigo13/stl.html

343 名前:デフォルトの名無しさん :02/05/29 15:49
>>339
>>340

いや、あの、私そこまで漢ができてないんですけど。
newって開発中は絶対0を返さないくせに、クライアントの前では
平気で0を返しますよね...

344 名前:デフォルトの名無しさん :02/05/29 15:53
>>343
っていうかnewの失敗って回復できるの?
失敗をthrowしてプログラム終了するか
不正アクセスをthrowして終了するかの違いしかないような気が・・・

345 名前:デフォルトの名無しさん :02/05/29 15:55
>>336
んん? new するたびにいちいち NULL かどうかを判定するより、
new handler を使ったほうがはるかに楽だと思うけど。

346 名前:デフォルトの名無しさん :02/05/29 15:55
>>343
いや、そうじゃなくて。
例外をキャッチ出来ればそのまま不正として関数から抜けることも出来るし、
キャッチしなければ勝手に死んでくれるし、


347 名前:デフォルトの名無しさん :02/05/29 15:59
>>346
NULLポインタ引きずってえらいことになるよりはスマートですわ。

348 名前:デフォルトの名無しさん :02/05/29 16:00
>>331
gcc -o test test.cpp こうやってるに 26000knk

正しくは
g++ -o test test.cpp

349 名前:デフォルトの名無しさん :02/05/29 16:01
>>344
まず回復できないと思ったほうがよいね。ただいきなりクラッシュしちゃうと
お客さんも怒るので、エラーハンドラで出来るかぎりのシャットダウン処理を
した後、何か言い訳じみたことを表示してから落ちると。

350 名前:348 :02/05/29 16:02
 ∧||∧
(  ⌒ ヽ  。oO( もうお呼びでなかったのね… )
 ∪  ノ
  ∪∪

351 名前:デフォルトの名無しさん :02/05/29 16:02
もしかして、336は

Foo* foo;
try {
foo = new Foo(...);
}
catch(std::bad_alloc) {
何かエラー
}
復帰及び処理続行

って考えてるのか?

try {
foo = new Foo(...);
処理続行
}
catch (std::bad_alloc) {
}
catch (何か) {
}

復帰できないエラーは後ろでいっしょくたにして処理する方がいいよ

352 名前:デフォルトの名無しさん :02/05/29 16:13
>348
…そんなコマンドがあったんですね。スイッチ書かないでいいんで
重宝するです。ありがとうです。cpp とか gpp なんてコマンド叩いて
みて無いナァと思ってたです。まさかまんまの名前とは。

ママはこんなこと教えてくれなかったYO。ウワァァン


353 名前:336==343 :02/05/29 16:17
>>342
まぁ、そういうことです。
趣旨としては、nullを返すことが時代錯誤というよりもbad_allocを投げない
ことが時代錯誤といいたいんでしょうけど。

>>345
new handlerは、operator newで自前のメモリ割り当てのフレームワークを
作りたいときには便利でしょうが、単純に特定のリソースの割り当てに
失敗したときに特定の処理を行いたいときには、いちいちset_new_handler()
しないといけないわけですよね。
でもって、

>>346
キャッチしないで自滅する前に、やはり書き込み中のファイルはフラッシュ
したいし、メッセージくらいは表示したいわけです。

あ、でもどうせ死ぬんだから例外処理をさぼってメモリリークもへったくれも
ないわけか...

354 名前:デフォルトの名無しさん :02/05/29 16:30
>>352
まずは man gcc やれと、小

355 名前:デフォルトの名無しさん :02/05/29 17:08
>>353
今時の仮想記憶を備えたシステムでnewが失敗するということはそうとうまずい事態で、
中途半端なクリーンアップ処理は余計に事態を悪化させる可能性があるんじゃないか?


356 名前:馬鹿☆栗子 :02/05/29 18:50
 実は、私はプログラムを独学しています。 
だけど、何度聞いてもコマンドライン引数がわかりません。
 判っている所(argcはコマンドラインの数を取得する
:argvはコマンドライン引数のファイル名を格納する。)
あとMS−DOSのWIN98ぐらいのマニアルを読みました。
 でも、まだわかりません。
 そこで、人に聞いた過去ログをここに
掲載しておきます。 これを、もとに
 まっと判りやすく 噛み砕いて
教えてください。 こんな、十度の馬鹿を
誰か助けて。
「のままVC++から実行してる
ならVC++ならmain引数を設定して
あげないといけないよ。

もしくは、DOSプロンプトで実行するか。

試して欲しいのはwin2000か
XPならcommand.com立ち上げて、

コマンドプロンプト

まずはわかりやすいフォルダを
Cドライブの直下に作って

そこにVC++で作った実行ファイルをコピー

そこに移動して(cd c:\temp)
a.exe file1 file2

そしたらif(argc!=3)は
入らないはず

で、できなかった原因は、

VC++から実行すると 単に
実行ファイル.exe

だけ実行されて、引数はないから
argcは1になるだから if(argc!=3)
が真になってexit()が実行されて
プログラムが終了。
解決方法として、1. VC++のmain引数の設定をする
もしくは 2.コマンドプロンプトから
自分で引数を指定して実行する
いま、手元にVC++の環境がないから
設定がわからないけどwebで調べれば
あるはず。。」 読む本はどんな本
をよんでいいか 神の誤導きを!
 これから、構造体向かいたいのに
  OS WIN XP  Ver.Visual C++6.2  




357 名前:デフォルトの名無しさん :02/05/29 18:53
ザ・ワールド!!時よ!とまれぃぃい!!

358 名前:  :02/05/29 19:03
以下、二次方程式pow(x,2)-3x+1=0の解を求めるプログラムを作成しました。
解の公式は使用せず、与式をx=(pow(x,2)+1)/3に変形して求めるものです。
もう少し工夫すれば、配列や変数nを使わずに済みそうなのですが、わかる方、ヒント頂けませんか?
#include <stdio.h>
#include <math.h>

void main(void)
{
int n;
double x[1000],ep;
ep=pow(10,-3);
x[0]=1.00;
n=0;
while(fabs((x[n+1]-x[n]))>=ep){
x[n+1]=(x[n]*x[n]+1)/3;
n++;
printf("%f\n",x[n]);
}
}

359 名前:デフォルトの名無しさん :02/05/29 19:08
頼む一次法的式にしてくれ
二児は忘れた

360 名前:デフォルトの名無しさん :02/05/29 19:10
>>358
それのどの辺がC++?

361 名前:358 :02/05/29 19:11
こんな感じで・・・もう少しなのですが・・
#include <stdio.h>
#include <math.h>

void main(void)
{
double x1,x2,ep;
ep=pow(10,-5);
x1=1.00;
x2=(x1*x1+1)/3;
while(fabs(x2-x1)>=ep){
x2=(x1*x1+1)/3;
x1=x2;
printf("%f\n",x1);
}
}

362 名前:デフォルトの名無しさん :02/05/29 19:12
  

363 名前:デフォルトの名無しさん :02/05/29 19:12
>>361
C言語なら、俺に聞け! <22>
http://pc.2ch.net/test/read.cgi/tech/1022402165/

364 名前:358 :02/05/29 19:16
スマソです。

365 名前:馬鹿☆栗子 :02/05/29 19:22
<<363 栗子に教えて

366 名前:デフォルトの名無しさん :02/05/29 19:24
そして時は動き出す・・・

367 名前:デフォルトの名無しさん :02/05/29 19:25
#include <iostream>
using namespace std;

int main()
{
double x1 = 1.0, x2 = (x1 * x1 + 1)/3, ep = pow(10, -5);
while(fabs(x2 - x1) >= ep)
cout<<(x1 = x2 = (x1 * x1 + 1)/3)<<endl;
}

368 名前:358 :02/05/29 19:26
すいません・・・出来ました。
c++とcの区別ついてなくてスマソ・・・

369 名前:デフォルトの名無しさん :02/05/29 19:31
368
C++
int main() {・・・retrun 0;}
void main() {・・・}


int main() {・・・retrun 0;}


370 名前:デフォルトの名無しさん :02/05/29 20:02
retrun

371 名前:デフォルトの名無しさん :02/05/29 20:08
356は、コマンドライン引数の
・意義(なぜ使うのか)
・プログラム上の扱い方
・DOS、あるいは VC++での指定方法
のどれがわからないんだろう。
どうも2番目は分かっているような感じだけれど。

372 名前:デフォルトの名無しさん :02/05/29 22:16
かなり昔に、ある本で
「平気で void main(void) などと書いているCの教本があるが、
 Cを大して理解していないと自ら言っているようなものである。
 そんな本は買わない方がいい。」
みたいなことが書いてあって、激しく同意した記憶があるのだが、
これって今でも有効?

ていうか C++ でもいまだにこんなOS dependな規約になって
いるわけ?誰か標準化に詳しい方、意見求む。

「こんなOS dependな」を念のため補足すると
・プロセスは必ずコマンドライン引数列をmainに渡す。
 よってmain(void)はありえない。
・mainは必ず親プロセスに終了コードを返す。よってvoid main()は
 ありえない。

※コンパイラが受け付けるかどうかは別の話。

373 名前:デフォルトの名無しさん :02/05/29 22:22
>>372
「平気で void main(void) などと書いているCの教本があるが、
 Cを大して理解していないと自ら言っているようなものである。
 そんな本は買わない方がいい。」

これについては、まあそれなりに今でも通用すると思う。でも、

「こんなOS dependな」を念のため補足すると
・プロセスは必ずコマンドライン引数列をmainに渡す。
 よってmain(void)はありえない。
・mainは必ず親プロセスに終了コードを返す。よってvoid main()は
 ありえない。

この理由は違う。そんな解説してある本があったら、それも糞。

374 名前:デフォルトの名無しさん :02/05/29 22:34
マックにはコマンドライン引数はありませんよ(^^;

375 名前:デフォルトの名無しさん :02/05/29 22:41
DSPにもOSレスマイコンにもないですよ。

376 名前:デフォルトの名無しさん :02/05/29 23:00
ワイド文字のマクロなんですが、
#define __T(x) L ## x
の意味が分からないのですが。
この L は何を意味してるのでしょうか?


377 名前:デフォルトの名無しさん :02/05/29 23:06
"ABC" と書くと char[4] だけど L"ABC" と書くと wchar_t[4] になる。

378 名前:376 :02/05/29 23:13
>>377
ありがとうございます。理解できました。
マルチバイトのルーチンはunsigned charみたいなのですが、
やはりこんなふうにしないと使えないのでしょうか?

unsigned char string1[20];
_mbscpy(string1,reinterpret_cast<unsigned char*>("ABC"));
//static_castはだめ?


379 名前:デフォルトの名無しさん :02/05/29 23:14
そういうばあいは
_wcscpyだと思うし、TCHAR/_tcscpyで自動的に切り替えてくれる

380 名前:デフォルトの名無しさん :02/05/29 23:17
>>378
でしょうなぁ。
static_cast はダメ。でも void* との変換は出来るので、 static_cast を2つ重ねればいけるかもしんないけど、んなことする意味ないし・・・。

381 名前:デフォルトの名無しさん :02/05/29 23:17
>>372
個人的には、これで本の価値をけなしている文章を書く著者は
「たいしたことない」と思う。
本質的な問題じゃないだろう。

382 名前:デフォルトの名無しさん :02/05/29 23:18
>>377
たしかそんなのがあった!

383 名前:デフォルトの名無しさん :02/05/29 23:31
#define __M(x) reinterpret_cast<unsigned char*> ## (x)
unsigned char string1[20];
_mbscpy(string1,__M("ABC"));
でいけそうな気がするけど、
CString ってデフォルトでマルチバイト使ってるっぽいけど
unsigned char使ってないんだよな。
シングルバイトは無視して、char で受け付けて
ルーチンはMultiByteの使ってるってことなのか...


384 名前:デフォルトの名無しさん :02/05/29 23:42
>>383
なんでそんな事したいわけ?
普通にワイド版の関数使えばいいじゃないか。
終端のnullが1byteしかコピーされないから破壊が起きるんじゃないの?

385 名前:デフォルトの名無しさん :02/05/29 23:43
なんで_tcscpyつかわないの?
そういうポリシー?

386 名前:デフォルトの名無しさん :02/05/29 23:44
>>381
同感だけど、でも「なんでvoid main(void)やねん!」とも思う。
せめてmain()とだけ書いておいてくれれば...

387 名前:デフォルトの名無しさん :02/05/29 23:51
>>385
_tcs〜はTCHARの時だな。
wchar_t/ushortの時は_wcs〜だ。

388 名前:デフォルトの名無しさん :02/05/30 00:01
VCっぽいからこのまま続けるけど、
#define UNICODEと
#define _UNICODEするだけだろ?


389 名前:376 :02/05/30 00:09
template <typename T> CStringSTL :public basic_string<T>
とかで
場合によって T に
char(シングル),unsigned char(マルチバイト),wchar_t(ワイド),TCHAR
を割り当てるクラス作ったんですが、
CStringSTL<unsigned char> Mt;
にunsigned char*を渡して処理するときに
unsigned char*だと("ABC")とかを渡したいときに
キャストしないといけないことに後から気づいたんで。
どうしようか悩んでるんです。

390 名前:デフォルトの名無しさん :02/05/30 00:11
問題点は2つ
切り替えたいときはTCHARベースにして、文字列はマクロTEXT()/_T()を使用するべき。
もう一つはstd::basic_string()を継承してはいけないこと。

391 名前:デフォルトの名無しさん :02/05/30 00:13
mbstowcsとかそういうのもあるけど、
localeは適切に設定しておけよ

392 名前:デフォルトの名無しさん :02/05/30 00:17
なんでbasic_stringを継承してはいけないのか100文字以内で(以下略

393 名前:389 :02/05/30 00:18
>>390
前にも言われたことなのですが、
basic_stringを継承してはいけない理由がわかりません。
operator,コピーコンストラクタ等を定義し直して、
メンバ変数も持たなければ問題ない気がするのです。
でもbasic_stringって結構でかいんですよね。(26バイトもある)

394 名前:デフォルトの名無しさん :02/05/30 00:24
環境依存のTCHARベースにすると
マクロベースのルーチンになるから、
同じプログラムで両方使い分けられなくなるのが嫌だったんです。
templateにしておけば両方可能なぶんだけ柔軟性があると...。
(あくまで文字列クラスの設計としてです。結局普通に使う時はTCHARになるんだと思う)


395 名前:デフォルトの名無しさん :02/05/30 01:05
>>389
>>390 じゃねぇけど、basic_string のデストラクタ見てみれ。

396 名前:デフォルトの名無しさん :02/05/30 01:10
>>395
basic_stringのデストラクタが仮想デストラクタじゃないって事?

397 名前:デフォルトの名無しさん :02/05/30 01:47
basic_stringのデストラクタがvirtualになってないのは
安全、(速度)を考えての設計だと思いますが、
basic_stringのポインタに派生クラスをnewで動的に作成するときに
deleteしたときに派生クラスのデストラクタが呼ばれない問題は
使い方を気をつければ大丈夫だと思う。
(CStringもvirtual使ってないはずです。でないとVtableが邪魔して
Formatを使うときにCStringをLPCTSTRにキャストする必要がでてくると思う)
追記:
CStringはやはりデータはcharで保持、統一していて
reinterpret_castでchar*からunsigned char*にキャストして
_mbscmpとかを使ってるみたいです。


398 名前:デフォルトの名無しさん :02/05/30 02:15
添削お願いします
jpegのファイルをバイナリとして表示したいのですができません。
以下のプログラムではどこがだめなんですか?

#include<stdio.h>
main()
{
int a[100],i;
FILE *fp;
fp=fopen("test.jpg","rb");
for(i=1;i<=3;i++){
fscanf(fp,"%x",&a[i]);
printf("%x",a[i]);
}
fclose(fp);
}

399 名前:デフォルトの名無しさん :02/05/30 02:25
>>398

>>363

400 名前:デフォルトの名無しさん :02/05/30 02:27
なぜ3回しかループせんのよ?

401 名前:デフォルトの名無しさん :02/05/30 02:28
>>398
char型の配列にそのままよみこんで、1バイトずつprintfで表示させればいいんじゃネーノ?
それと、配列の添え字は0から。

402 名前:デフォルトの名無しさん :02/05/30 02:34
#include<stdio.h>
main()
{
 FILE *fp = fopen("test.jpg","rb");
 int c;
 while((c = fgetc(fp)) != EOF)
  printf("%02x",c);
 fclose(fp);
}

403 名前:401 :02/05/30 02:35
>>402
そうだ。表示だけなら全部読み込む必要なんてないな。

404 名前:デフォルトの名無しさん :02/05/30 02:43
#define MACRORIN "\n\nEOF\n"
while(a = fgetc(fp), printf((a != EOF)?"%02X ":"%s", (a != EOF)?a:reinterpret_cast<int>(MACRORIN)) != sizeof MACRORIN -1);

405 名前:デフォルトの名無しさん :02/05/30 02:46
おまいらC++スレなんだからもっとC++らしく書けよ。

406 名前:デフォルトの名無しさん :02/05/30 02:47


407 名前:デフォルトの名無しさん :02/05/30 02:48
>>405
C++らしさって何?

408 名前:デフォルトの名無しさん :02/05/30 02:49
stdioじゃなくてiostream使えって事じゃないかと…

409 名前:デフォルトの名無しさん :02/05/30 02:50
>>408
そういうこと言うとマ板のあの人たちに怒られちゃいますよ・・・・

410 名前:デフォルトの名無しさん :02/05/30 02:52
#include<cstdio>
using namespace std;
main()
{
 FILE *fp = fopen("test.jpg","rb");
 int c;
 while((c = fgetc(fp)) != EOF)
  printf("%02x",c);
 fclose(fp);
}

411 名前:デフォルトの名無しさん :02/05/30 02:53
ひねくれもの(w

412 名前:デフォルトの名無しさん :02/05/30 02:57
>>410
せめて ifstream とか get() とか使えって。

413 名前:デフォルトの名無しさん :02/05/30 03:07
ifstream ifs("test.jpg") ;
while(ifs) cout << hex << ifs.get() ;

414 名前:デフォルトの名無しさん :02/05/30 03:16
>>413
while (ifs) cout << hex << setw(2) << setfill('0') << ifs.get();

ああーまたマニピュレータの悪魔が・・・・・

415 名前:デフォルトの名無しさん :02/05/30 03:20
>>413
バイナリだから
ifstream ifs("test.jpg", in | binary);

416 名前:デフォルトの名無しさん :02/05/30 05:50
ストリームを使用してバイナリファイルの読み書きを行いたいのですが、
basic_istream::read/basic_ostream::writeの引数はchar_type*なので、毎回キャストしてやら無ければいけませんし、読み書きサイズも単位が文字数なのでデータが文字サイズの倍数じゃないときはうまくいきません。

fread/fwriteのように、キャストが必要なく、バイト単位で読み書きできる方法をご存知でしたら教えてください。

417 名前:デフォルトの名無しさん :02/05/30 07:27
template<typename T>__declspec(dllexport)void func(T t){....}

という関数をDLLにしたんですが、何故かリンクエラーになります。
何故なんですか?さっぱり分かりません。

418 名前:デフォルトの名無しさん :02/05/30 07:52
DLLにしなくてもリンクエラーにならなかった?

419 名前:デフォルトの名無しさん :02/05/30 07:56
>>417
実体がないからじゃないでしょうか?
DLL側でfunc<int>(10);などとやりたければ、
どこかにfunc<int>が存在しなきゃいけないけど、
DLLを作成した時点ではfunc<int>は存在していないし。

420 名前:名無しのゴローさん :02/05/30 20:06
仕方ねぇ。
今日こそstreamでもやるか。

421 名前:デフォルトの名無しさん :02/05/30 22:00
干す

422 名前:デフォルトの名無しさん :02/05/30 22:29
押す

423 名前:デフォルトの名無しさん :02/05/30 22:55
exceptional C++あげ

424 名前:デフォルトの名無しさん :02/05/31 00:11
メンバに構造体を持ってるクラスで、コンストラクタでその構造体の初期化を
したいのですが、memset()するしかありませんかねえ?

HOGE hoge = {0};
とした時と同じようにスマートに書きたいんですが・・・


425 名前:デフォルトの名無しさん :02/05/31 00:16
初期化リスト

426 名前:デフォルトの名無しさん :02/05/31 00:18
デフォルトコンストラクタで memse するのがスマート。

427 名前:デフォルトの名無しさん :02/05/31 01:25
staticなinitialize専用の実体を置いといて
初期化リストでデフォルトのコピーコンストラクタを使って初期化する
・・あんまりスマートじゃないか

428 名前:デフォルトの名無しさん :02/05/31 01:49
レスありがとうございます。
>>425素直には初期化子リストには書けないようです。

>>426Cでも使う構造体なんで、ヘッダは変更できないんです。継承すればいいんですけどこのためだけにはちょっと・・・

>>427こういうことですか?
struct HOGE{
 int i,j,k;
};

class Foo{
 static const HOGE zerohoge_;
 HOGE hoge_;
public:
 Foo():hoge_(zerohoge_){}
};
const HOGE Foo::zerohoge_ = {0};

たしかに、これでいけますね。でもちょっとイマイチかなあ。
でもこのやり方、他の場面に使えそう。
まあ、素直にmemsetしておきます。

429 名前:デフォルトの名無しさん :02/05/31 01:53
newすればはじめからゼロと言ってみるテスト

430 名前:デフォルトの名無しさん :02/05/31 02:19
>>428
staticメンバじゃ、クラスをたくさん作っても、一つしかないよ。その辺は
不都合ない?

431 名前:デフォルトの名無しさん :02/05/31 02:40
>>430
ないと思われ。constだし、初期化専用だし。

432 名前:初心者 :02/05/31 02:40
ここで質問してる人はどんな機能のプログラムを作ってる(作ろうとしてる)のですか?

433 名前:デフォルトの名無しさん :02/05/31 07:14
げぃむ。

434 名前:デフォルトの名無しさん :02/05/31 13:32
Win2000, MS VC/C++6.0 環境で勉強しています。
マルチタスクのところなのですが
例題にでている<unistd.h>というファイルが
見当たりません。

gcc 2.95環境も探してみましたがありません。
これはどこorどのファイルなのでしょうか。

435 名前:デフォルトの名無しさん :02/05/31 13:42
>>434
gccだと。
マルチタスクとそれがどう関係するのか?だけど。

436 名前:デフォルトの名無しさん :02/05/31 13:46
そのうちfork()がないとかpthreadがありませんとか言い出すに違いない

437 名前:デフォルトの名無しさん :02/05/31 15:08
>>435 >>436
見当違いなことを書いていたみたいですみません。
質問を変えて、fork()関数はどのヘッダに定義されているのですか?

438 名前:デフォルトの名無しさん :02/05/31 15:23
MS-Windowsにfork()はない。Cygwinはかなりトリッキーなことをして
実装しているが。スレッドを動かしたければWin32APIの
CreateThreadを使う。

439 名前:デフォルトの名無しさん :02/05/31 15:30
>>438
お早いお答えどうもありがとうございました。

440 名前:デフォルトの名無しさん :02/05/31 17:51
>>437
UNIX でも fork() はヘッダには「定義」されてないと思うが。宣言と定義の違い、
それからシステムコールとユーザ関数の違いは知っておいた方が良いぞ。

441 名前:デフォルトの名無しさん :02/05/31 21:24
仮想コンストラクタは作れますか?

442 名前:デフォルトの名無しさん :02/05/31 21:28
コンストラクタを仮想にして何の意味がありますか?

443 名前:デフォルトの名無しさん :02/05/31 21:34
仮想コンストラクタはDelphiの特権です。それと同じことをしたいなら、ファクトリを書いてください。

444 名前:デフォルトの名無しさん :02/05/31 21:39
最近のfork(2)はユーザー関数でラップされているという罠

445 名前:441 :02/05/31 23:39
>>442-443
ヽ(`Д´)ノ

446 名前:デフォルトの名無しさん :02/06/01 04:25
cでexternで変数を外部のファイルに公開することができるけど
c++でクラスオブジェクトをグローバルに共有したい場合はどうすればいいのですか?
externで良い?

447 名前:デフォルトの名無しさん :02/06/01 04:27
よい

448 名前:デフォルトの名無しさん :02/06/01 04:30
>>446-447

こんな朝早く、、、、
お前らもエッチだな(*´д`*)

449 名前:デフォルトの名無しさん :02/06/01 04:39
>447
そうですか。うーん。。

ヘッダファイルglobal.hで
#include "cfooclass.h"
#if defined _INSTANCE_
#define EXTERN
#undef _INSTANCE_
#else
#define EXTERN extern
#endif

EXTERN CFooClass g_foo;

とか定義して、いくつかのcppファイルからincludeしてるんですが、
そのうちのmain()を記述してるcppファイルで#define _INSTANCE_して
一回だけ変数を宣言して、そのほかのcppファイルでは外部宣言にしてるんですけど
エラーとなってしまいます。

d:\test\global.h(xx) : error C2146: 構文エラー : ';' が、識別子 'g_foo' の前に必要です。
d:\test\global.h(xx) : fatal error C1004: 予期せぬ EOF が検出されました。

エラーメッセージは↑ですが、これは何が間違っているのでしょう。・゚・(ノД`)・゚・。

450 名前:デフォルトの名無しさん :02/06/01 04:52
>>449
その奇怪な extern がヤバイと思われ。
素直に cpp で実体定義したらいいじゃん。

451 名前:449 :02/06/01 05:00
もしかしてこの奇怪なexternの部分を
extern "C" {
}
でくくる必要ってありますか?

452 名前:デフォルトの名無しさん :02/06/01 05:09
必要ない。関数名のときに多重定義での
名前変形を阻止するために必要なだけ

453 名前:デフォルトの名無しさん :02/06/01 05:12
C でコンパイルしたならそれ。
C++ なら header で extern CFooClass g_foo; と宣言して
cpp ファイルで そのまま CFooClass g_foo 〜と定義したらいいんちゃう。


454 名前:デフォルトの名無しさん :02/06/01 05:13
CFooClassの宣言はちゃんとincludeしてる?

455 名前:デフォルトの名無しさん :02/06/01 05:15
cfooclass.hに問題があるとか・・・

456 名前:デフォルトの名無しさん :02/06/01 05:17
CFooClass {
....
} <- ここにセミコロンがない


457 名前:449 :02/06/01 05:18
あ、みなさんどうも。
>452
そうでしたか。

>453
VC++でございます。
>449のやり方って結構Cではやりません?

>454
してます。

458 名前:デフォルトの名無しさん :02/06/01 05:21
VC++か.. まぁあれは腐ってますからな..(w

459 名前:デフォルトの名無しさん :02/06/01 05:24
まー global instanceをひとつ共有するなら
>>453 が定番だよ。
ヘッダ側は extern のみ。条件コンパイル不要。
実体定義をひとつのモジュールで行う。

460 名前:449 :02/06/01 05:30
>459
そうですか。その方法でやることにします。定番って事で安心ですし
みなさま、早朝からお騒がせしましたm(_ _)mペコリ

461 名前:デフォルトの名無しさん :02/06/01 05:34
>>460
いや、問題が解明できていないので
単にそう直しても直るかどうか・・

462 名前:デフォルトの名無しさん :02/06/01 10:16
>>460
つか、C++でexternなんて使うなよー。Singletonパターンにしとかないと、
後でひどい目に遭うぞ。

463 名前:デフォルトの名無しさん :02/06/01 11:30
CFooClass が定義されていない、にもう1票。
つまり、extern (int) CFooClass … に解釈されてる。

464 名前:デフォルトの名無しさん :02/06/01 16:14
>>462
どんな目?

465 名前:デフォルトの名無しさん :02/06/01 17:34
>>464
異なるコンパイル単位での初期化順序の制御が問題になる。
詳しくは、Effective C++を買って読むべし。

466 名前:デフォルトの名無しさん :02/06/01 19:49
知らないとひどい目に遭うC++

467 名前:デフォルトの名無しさん :02/06/01 19:52
int main()
{
class T{
public:
int operator<<(int i){return f();}
int p;
virtual int f(){*this<<0; return 0;}
}o;

cout<<(o << 9)<<endl;

return 0;
}

なんでエラー?

468 名前:デフォルトの名無しさん :02/06/01 20:07
>>466
五・七・五?

469 名前:デフォルトの名無しさん :02/06/01 20:15
>>465
なるほど
ではそのクラス自体はSingletonでは困る場合はどうするの?

470 名前:デフォルトの名無しさん :02/06/01 20:16
>>467
とりあえずスタックオーバーフローがおきそう。
コンパイルエラーになるようには見えないけど。

471 名前:469 :02/06/01 20:19
Singletonで包めばいいのか

472 名前:デフォルトの名無しさん :02/06/01 21:21
>>465
それが問題になるのは、複数の大域変数(というかクラスのインスタンス)の
初期化時に相互に依存する場合に限られるのと思うが、どうか。
それ以外の場合は普通に>>453でOKと思うが・・・。

473 名前:465 :02/06/01 21:57
>>472
そのとおり。でも、問題が起きるまで手抜きな実装手段をやってて、いざ問題が起きたときに
泥縄でやり直すのはよろしくないよ。……ってなことは、More Effective C++に書いてあるので、
買って読もうな。

474 名前:デフォルトの名無しさん :02/06/01 22:23
>>473
俺はEffectiveシリーズは読んだYO。Moreの方は手元にないが・・・。確かに必読の
良い本だと思う。

言いたかったのは、事情がわかっていれば、>>453の実装でなんら問題はないと
いうこと。つまり、なんでもパターンを駆使すればよいということではなく、
それがTooMuchになるケースもあると。もちろん、シングルトンのメリットも
理解しているつもりなので、適材適所で使い分けるのが良いと言いたかった。

>手抜きな実装手段をやってて、いざ問題が起きたときに泥縄でやり直すのはよろしくないよ。
これには同意。でも>>453が必ずしも手抜きとは思わないよ。(あくまでケースバイケースだが・・・)

それに、シングルトンを使用すべきところをグローバルインスタンスを使用して
泥縄になるのは、手抜きな実装に起因するというよりも、設計段階の問題と思うが・・・。

475 名前:465 :02/06/01 23:02
あー、うん。「わかってて、あえてやらない」のならOKだと思うよ。
「わかってないから、やろうとしない」の可能性があるから言っただけだから。

476 名前:デフォルトの名無しさん :02/06/02 03:48
Singleton は参照するオブジェクトがすべて消滅すると一緒に
消えるからなぁ.. constructor で時間がかかるオブジェクトだと
作って、消えて、作りなおして、消えて、とパフォーマンスが落ちるよね
いや、単に実装が悪いだけだけど.. ダミーの参照オブジェクトで
管理するのが泥臭いんだけど, いいのかな

関連するオブジェクトをまとめてコンポジションして
相互に依存しないように新しいクラス作って extern つのもあるけど..

477 名前:デフォルトの名無しさん :02/06/02 04:12
http://homepage.ruhr-uni-bochum.de/Marcus.Brinkmann/title.jpg

これからC++を学ぼうとしてるならこれだ。

478 名前:476 :02/06/02 04:14
んー.. みんなやっぱり寝てる?
effective C++ とか読んだことないんでみんなどうやって
スマートに解決してるのか知りたいんですけども..
やはり本はちゃんと読んでおくべきか..

479 名前:デフォルトの名無しさん :02/06/02 04:15
>>476
> Singleton は参照するオブジェクトがすべて消滅すると一緒に
> 消えるからなぁ..
それは Singleton の要件とは無関係の気が。むしろ、そんな実装にしたら
Singleton オブジェクトの状態を保持できないから、制限キツすぎだと思う。

480 名前:476 :02/06/02 04:23
>>479
どもどもレスサンクス..
某所でアップされてたSingletonの実装は参照カウンタになってたのね
それで参照カウンタゼロで消滅。たぶん使ってるオブジェクトがいないなら
状態を保つ必要もないと考えたんだろうなぁ
C++だといつ消すか問題になるよね 使わないオブジェクトがいつまでも
居座るのもいまいちアレだし..
やっぱりスマートな定番の実装ってのがあるんでしょうか..?

481 名前:480 :02/06/02 04:25
スマートな実装.. 一度作るとプログラムの最後まで居座るけど、
任意に消せるってパターンかな..?

482 名前:(゚д゚;) :02/06/02 07:51
vector<char> vc(5, 'a');
vector<char>::iterator f, e;
++++++++(&++++++(&++++(&++(f = vc.begin())[1])[1])[1])[1];
for(e = vc.end();f != e;f++) cout<<*f<<"\t";

bccで通っとる・・。

483 名前:デフォルトの名無しさん :02/06/02 07:53
>>481
Modern C++ Designでそういう実装の考察してるね

484 名前:初心者 :02/06/02 10:04
みなさん、こんにちは
BYTE a ;
a = ~a+1;
と、あった場合には、aを反転したものに1をたすという意味で
よろしいですよね。
教えてください。

485 名前:デフォルトの名無しさん :02/06/02 10:09
>>484
C++固有の話として聞いてるんだよな?
演算子オーバーロードで違う挙動になってるかもしれない、と答えてみるか。

486 名前:465 :02/06/02 10:39
>>476
いや、君のような人には、マジでEffective C++を読んでもらいたい。
Singletonのスマートな実装が載ってるから。あまりのショックにひっくり返り
そうなほどのスマートさで。

ただ、>>481でいう、「任意に消せる」は実装してないけど。
それをやりたいなら、>>483のいうとおり、Modern C++ Designだね。
でもModernのコードは高度すぎて、コンパイラがついてこれてないから、
今は意味がない(ちなみにVC.NETでも通らないらしい)。

487 名前:デフォルトの名無しさん :02/06/02 11:25
>>486
洋書ですか?

488 名前:デフォルトの名無しさん :02/06/02 11:34
>>487
http://bookshelves.tripod.co.jp/Html/programming.html#Cpp

489 名前:デフォルトの名無しさん :02/06/02 13:35
>>488
サンクスです。
ちなみに、Cを終わったばかりでC++をはじめようって時に
一番のお勧め本はなんですか?

490 名前:初心者 :02/06/02 13:52
>>485
どうもです。

491 名前:デフォルトの名無しさん :02/06/02 13:55
>>489
Cをマスターしてるんなら、Accelerated C++がお勧め。
>>488の推薦図書の中にもあるっしょ。そこでは
「中級者向け」ってあるけど、これは「プログラミングの中級者向け」
であって、内容的には「C++初心者〜中級者向け」のことが
書いてある。

492 名前:デフォルトの名無しさん :02/06/02 14:00
VC.NET「は」通らない。gccやcode warriorなら通るらしい
とか言ってみたりして。

493 名前:465 :02/06/02 14:45
>>492
あ、そうらしいね。Genericスレに書いてあったわ。ちなみに、俺が持ってる(使ってる)のが
VC6だから、「(VC6だと通らないんだけど、)VC.NETでも通らないらしい」って意味だ。

494 名前:デフォルトの名無しさん :02/06/02 15:48
>>491
ありがとうございます。
注文してみます。

495 名前:デフォルトの名無しさん :02/06/03 00:02
MIDIファイルを解析したいです。
ファイルのフォーマットについて詳しく書いてあったり、
実際のMIDIファイルを例に取り上げて記述しているような
ページがあったら教えてください。

496 名前: :02/06/03 00:18
http://www.google.com/search?num=100&hl=ja&q=MIDI%83t%83@%83C%83%8B+%83t%83H%81%5B%83%7D%83b%83g&btnG=Google+%8C%9F%8D%F5&lr=lang_ja

497 名前:デフォルトの名無しさん :02/06/04 01:28
struct SA{
template<typename A,typename B>class tCA{};
template<typename C>class tCA<C,int>{};
};
エラー出ないのにナンデ動かないんだヨ??もうワケワカンネェヨ。

498 名前:デフォルトの名無しさん :02/06/04 04:05
template<typename A=int,typename B=int>struct TCA{
template<typename I>struct TCB{
typedef typename TCA<I> HEAD;
};
TCA(){cout<<typeid(TCA).name()<<endl;}
};

499 名前:デフォルトの名無しさん :02/06/04 18:33
OpenWatcomを落としたのですが、
落としたアイコンをダブルクリックすると
Could not intialize inst・・(省略)・・パラメータが正しくありません。
とでてOKをクリック(OKしかない)すると元の画面に戻ります。
何度やっても同じです。
どうすればいいでしょうか?


500 名前:デフォルトの名無しさん :02/06/04 18:51
>>499
省略するなよ


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