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


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

C++相談室 part55
251 名前:デフォルトの名無しさん :2006/12/14(木) 00:00:27
>>250
だれがうまい事ry

252 名前:デフォルトの名無しさん :2006/12/14(木) 00:01:30
>>250を無視リストに入れた

253 名前:デフォルトの名無しさん :2006/12/14(木) 00:12:41
>>50
責任は取りなさい。

254 名前:デフォルトの名無しさん :2006/12/14(木) 00:17:48
急速にスレの質が低下してまいりました

255 名前:デフォルトの名無しさん :2006/12/14(木) 00:27:00
ム板ではよくあること

256 名前:デフォルトの名無しさん :2006/12/14(木) 01:02:55
>>217
> といった感じのエラーが出てしまいます。

ずばりエラーメッセージそのものを張りなよ。

257 名前:220 :2006/12/14(木) 01:21:30
>>226
ありがとうございます

258 名前:デフォルトの名無しさん :2006/12/14(木) 14:49:25
拡張子の問題なんだけど

*.hpp, *.cpp
のファイルはboostと同じ命名方法でclassを書いた

.hxx, cxx
適当な命名規則でむちゃくちゃ

が混在していて

A.hxx
A.hpp
A.cpp
で2つのヘッダーに分けるか2重に名前定義するか迷ってるんだけど
なにかいい解決方法ない?

259 名前:デフォルトの名無しさん :2006/12/14(木) 19:52:11
>>258
よくわからんが、「適当な命名規則でむちゃくちゃ」を捨てればいいんじゃね?

260 名前:sage :2006/12/14(木) 22:46:09
すみません、低レベルで申し訳ないのですが、
int* num;
はポインタですよね、
int& num;
の意味は何でしょうか?

261 名前:デフォルトの名無しさん :2006/12/14(木) 22:50:05
リファレンス

262 名前:デフォルトの名無しさん :2006/12/14(木) 22:55:08
参照

263 名前:デフォルトの名無しさん :2006/12/14(木) 23:03:30
ありがとうございます。
あと、クラスのconstメンバや参照メンバ
の初期化ってどうすればいいのでしょうか?

264 名前:デフォルトの名無しさん :2006/12/14(木) 23:07:39
きりがないから、まず本なりで一通り勉強しろ。

265 名前:デフォルトの名無しさん :2006/12/14(木) 23:14:20
すみません。質問禁止とは知りませんでした。
申し訳ないです。
明日図書館に行ってみます。

266 名前:デフォルトの名無しさん :2006/12/14(木) 23:19:35
禁止ではないが、入門レベルの本を見ればずばりの方法が書いてあることは、本を見ろよと思う。
お前以外にも山ほど同じような疑問を抱くやつは出てくるから答えるほうだって飽きてくる。

267 名前:デフォルトの名無しさん :2006/12/14(木) 23:24:40
>>263
コンストラクタの初期化リストで行う
というか行わないとエラーになるだろ

268 名前:デフォルトの名無しさん :2006/12/14(木) 23:37:26
参照はともかくconstなメンバはコンストラクタで代入しても、実は平気。
コンストラクタ・デストラクタの中ではconstがないものとして扱われるはず。
勿論なるべく初期化リスト使うべきだろうが。

269 名前:デフォルトの名無しさん :2006/12/14(木) 23:47:22
気持ち悪い仕様だな

270 名前:263 :2006/12/14(木) 23:55:24
みなさん本当に申し訳ありません。
明日図書館で調べてみます。
迷惑かけてしまって本当にすみませんでした。

271 名前:デフォルトの名無しさん :2006/12/14(木) 23:58:00
>>268
おい、嘘付くな。
コンストラクタ内でconstに代入しようとしたら当然のごとく
コンパイルエラーになったぞ。

staticでないconstは初期化リスト、staticの場合は外部で
定義するか、static const intだけは直接書いてもいいけど、
コンストラクタ内ではだめだろ。

272 名前:268 :2006/12/15(金) 00:21:48
本当だ、すまん。
オブジェクト自身にconstが付いている場合とごっちゃにしていた。○| ̄|_

273 名前:デフォルトの名無しさん :2006/12/15(金) 00:38:44
>>272
>オブジェクト自身にconstが付いている場合とごっちゃにしていた。○| ̄|_

どういうこと?

274 名前:デフォルトの名無しさん :2006/12/15(金) 03:23:43
1418544個のデータをint型の配列に格納しようとしたんですけど、
異常終了っていうんでしょうか?強制的に終了しました。
int data[1418544]も一気に確保する事ってできないようになってるんでしょうか?

275 名前:デフォルトの名無しさん :2006/12/15(金) 03:42:04
>>274
お前がMS-Windowsを使っているなら、デフォルトのスタックは1MBだ。
後は分かるな?

276 名前:デフォルトの名無しさん :2006/12/15(金) 04:14:41
>>275
?! そうだったんですか!

分けなくてはならないって事でしょうか?
どうしたらいいんでしょうか?


277 名前:デフォルトの名無しさん :2006/12/15(金) 05:00:38
つnew

278 名前:デフォルトの名無しさん :2006/12/15(金) 05:19:20
あっ!
ありがとうございました!

279 名前:デフォルトの名無しさん :2006/12/15(金) 13:16:01
Cの基礎勉強しなおしたいんですけど、
基礎とその基礎を使った問題が載ってる本てあるんでしょうか?
何かお勧めの本あったら教えてください

280 名前:デフォルトの名無しさん :2006/12/15(金) 13:25:15
独習C

281 名前:デフォルトの名無しさん :2006/12/15(金) 13:42:56
独習シリーズは簡単すぎると思うのはオレだけ?

282 名前:デフォルトの名無しさん :2006/12/15(金) 15:45:02
というより独習C++から初めても簡単だからね。

283 名前:デフォルトの名無しさん :2006/12/15(金) 16:02:30
boostのシリアライズって、
ポインタを渡しても自動的にポインタが指すインスタンスが
シリアライズされますよね?
あれってどうやって、ポインタか否か判別してるんですか?

284 名前:デフォルトの名無しさん :2006/12/15(金) 16:43:37
んー、俺のスキルでは簡単にまとめられん。
ソース嫁。

285 名前:デフォルトの名無しさん :2006/12/15(金) 17:03:29
type_traints

286 名前:デフォルトの名無しさん :2006/12/15(金) 17:23:59
ポインタで特殊化してるとか?

287 名前:デフォルトの名無しさん :2006/12/15(金) 18:12:56
>>284
読んでみました。
extended_type_infoとかあやしいんですが、
ややこしいですね…

>>285
ブースト内検索してみましたが
出てこなかったです。

>>286
う〜ん。見た感じserialize関数はテンプレート使ってないです。
最初それでやってたんですが、記述量が無駄に増えてスマートにならなかったので、
boostはどうしてるのか気になったんです。

288 名前:デフォルトの名無しさん :2006/12/15(金) 18:14:18
http://www.kmonos.net/alang/boost/classes/type_traits.html

289 名前:デフォルトの名無しさん :2006/12/15(金) 18:19:13
あ、type_traitsですね。
ありがとです。
調べてみます。

290 名前:デフォルトの名無しさん :2006/12/15(金) 20:05:18
↓のソースコードみたいにyやnを入力してループを終了するのではなく、

 画面に
  continue finish
 のようなのを用意しておき、方向キーの「←」「→」で、
 選択した方されたほうを、括弧([ ])で
  continue [finish]
 のように表示させて、enterキーを押すと
 決定される(上の場合はループを抜ける)ようにしたいのですが、
 どうしたらいいのでしょうか?

#include <iostream>
using namespace std;

void main()
{
char cInput = 'n';
do {
cout << "終了する場合は y を入力\n";
cin >> cInput;
} while ( cInput != 'y' );
return 0;
}


291 名前:デフォルトの名無しさん :2006/12/15(金) 20:13:09
環境依存。他所でどうぞ。

292 名前:デフォルトの名無しさん :2006/12/15(金) 20:16:16
>>291

はい。

293 名前:デフォルトの名無しさん :2006/12/15(金) 20:16:40
ブロッキングせずに入力状態にするのってスレッド使わなきゃ無理?

294 名前:デフォルトの名無しさん :2006/12/15(金) 20:35:38
環境依存。

295 名前:デフォルトの名無しさん :2006/12/15(金) 22:27:38
gcc 3.4.5使ってます

template< class T, class T2 > class Hoge {
public:
 map< T, T2 > _map;
 map< T, T2 >::iterator GetBegin(){ return _map.begin(); }
};

と書くと、"expected ';' before GetBeginとエラーになります。
map< T, T2 >::iteratorって文法違反なのでしょうか?


296 名前:デフォルトの名無しさん :2006/12/15(金) 22:29:26
typename map<T, T2>::iterator

297 名前:デフォルトの名無しさん :2006/12/15(金) 22:31:40
ありがとうございます。
出来ました。typename必要だったのですね・・
VSだとiterator前にtypename無くてもOKだったので気づきませんでした

298 名前:デフォルトの名無しさん :2006/12/16(土) 05:22:59
VC++じゃない方のC++で
分かりやすくMakefileの書き方が載ってるサイトがあれば教えてください

299 名前:デフォルトの名無しさん :2006/12/16(土) 06:25:55
>>298
スレ違い……いや、鼬害だ。
Makefileは言語に関係なく書式が決まっている。先ずはmakeのマニュアルページでも見たまえ。

300 名前:デフォルトの名無しさん :2006/12/16(土) 10:56:12
>>298
UNIXプログラミングスレで答えておきました。

301 名前:デフォルトの名無しさん :2006/12/16(土) 14:09:31
>>299
鼬害(?)失礼しました。

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

302 名前:デフォルトの名無しさん :2006/12/16(土) 17:01:21
一応この板にもmakeスレはあるけどな。
ttp://pc8.2ch.net/test/read.cgi/tech/1029599472/

俺はmakeわけわかめだったからもうビルドツール自作した。

303 名前:マリー :2006/12/17(日) 12:08:55
antにすればいいじゃない

304 名前:デフォルトの名無しさん :2006/12/17(日) 12:36:02
C++だったらboost jamだろ

305 名前:デフォルトの名無しさん :2006/12/18(月) 12:51:27
#define max
が使ってるライブラリのどこかにあるみたいなんだけど
(max)って書くと避けられるとも聞いたのだが
(max) = #define max のこと?

306 名前:デフォルトの名無しさん :2006/12/18(月) 12:53:57
環境依存スレへ

307 名前:デフォルトの名無しさん :2006/12/18(月) 13:33:03
言語仕様の話だろ

#undef max
でいいんじゃないか?

308 名前:デフォルトの名無しさん :2006/12/18(月) 14:42:47
>>305
()をつけるとマクロ展開が抑制される。

309 名前:デフォルトの名無しさん :2006/12/18(月) 15:02:05
maxを定義しているのが<windows.h>の中からなら#define NOMINMAX

310 名前:デフォルトの名無しさん :2006/12/19(火) 01:56:19
>>308
引数つきの奴だけ、な。

311 名前:デフォルトの名無しさん :2006/12/19(火) 09:02:06
stringstreamの内部バッファをクリアするには
どうすればいいのでしょうか?





312 名前:デフォルトの名無しさん :2006/12/19(火) 09:17:42
>>311 str(string())

313 名前:311 :2006/12/19(火) 09:27:19
>>312
本当にありがとうございました。

pubsetbuf、clearとかそれらしいものみてたけど
str()で取得できるのは知ってたんで
まさかstrで設定もできるとは...orz

io関係の命名則、意地悪すぎ...


314 名前:デフォルトの名無しさん :2006/12/19(火) 18:15:31
stringstreamの内部バッファのサイズを変更する方法を教えてください。

315 名前:デフォルトの名無しさん :2006/12/19(火) 18:20:46
数値計算系のプログラムつくってると
デバックのために、計算の途中結果を図でみたくなることがよくある

例えば
std::vector<double> a(100)
のヒストグラムを図でみたくなったりする

こういう場合に図示するのに使えるライブラリーとかないのでしょうか?

例えばこんな感じです

std::vector<double> a(100)
....
plot_hist(a);
wait_key(0);



316 名前:デフォルトの名無しさん :2006/12/19(火) 18:36:07
>>315
C++を使わずにRを使いましょう。

317 名前:デフォルトの名無しさん :2006/12/19(火) 20:04:25
静的なstd::mapを作成する方法ってないですかね
enum{id_0,id_1,id_2};
static const std::map<int,char*> m ={
{id_0,"val0"},{id_1,"val1"},{id_2,"val2"}
};
キーと値のマッピング情報はコンパイル時に確定しているので、
わざわざ動的にmapを生成するのは無駄の様な
気がします・・

318 名前:デフォルトの名無しさん :2006/12/19(火) 21:05:38
普通にchar*の配列じゃだめなのか・・・?

319 名前:デフォルトの名無しさん :2006/12/19(火) 21:11:33
>>318
vectorじゃなくてmapなんだから、きっとこんなenumなんだよ。たぶん。
enum ID {id_1= 10001, id_2 = 10001} ;

320 名前:317 :2006/12/19(火) 21:21:58
>>318まさに>>319の通りです。keyが0オリジンとは限らないし、stringの場合もあります
今までは
struct foo{ int key,char* val };
foo[]={ {1,"one"},{3,"tree"},{5,"five"}};
してループでサーチしたりしてたんですが
せっかく標準で用意されてるんだからmap(set)を使えばサーチが楽じゃね?

と思ったわけです


321 名前:デフォルトの名無しさん :2006/12/19(火) 21:36:06
binary_searchでも使っとけ

322 名前:デフォルトの名無しさん :2006/12/19(火) 23:19:32
1つのクラスにメンバが100個(含むポインタ)くらいあるんですが、
コピーコンストラクタとコピー代入演算子はどう書けばいいんでしょう。。。


323 名前:デフォルトの名無しさん :2006/12/19(火) 23:27:16
>>322
俺ならそのクラスをrm

324 名前:デフォルトの名無しさん :2006/12/19(火) 23:40:10
>>322
設計からやりなおせ

325 名前:デフォルトの名無しさん :2006/12/19(火) 23:45:56
ソース書き直しとか
設計やり直しって、
本当に効果あったことあります?

326 名前:デフォルトの名無しさん :2006/12/19(火) 23:46:18
重量級だなオイ

327 名前:デフォルトの名無しさん :2006/12/19(火) 23:49:16
>>322
先ずそのクラスの100個のメンバを4個に分けてそれぞれクラスとする。
次にその4個のクラスの平均25個のメンバを5個に分けてそれぞれクラスとする。
更に、20個+4個+1個のクラスについてコピーコンストラクタを用意すればいい。

328 名前:デフォルトの名無しさん :2006/12/19(火) 23:52:22
>>327
えーまじーー???
100個書くのは変わんないじゃんwww

329 名前:デフォルトの名無しさん :2006/12/20(水) 00:01:31
いっそのことコピー不可にしちゃえ

330 名前:デフォルトの名無しさん :2006/12/20(水) 00:03:57
>>325
当然ある。

331 名前:デフォルトの名無しさん :2006/12/20(水) 00:06:28
クラスの「仕様の継承」について質問なのですが
メソッドは virtual void func() = 0; の様に宣言するとしても
コンストラクタはどうすればいいのでしょうか?
特定の型を引き受けるコンストラクタ、というのを用意しようとしたとき
その実装をサブクラスに要求するにはどうすればいいか、という事なんですが・・・

332 名前:デフォルトの名無しさん :2006/12/20(水) 00:07:44
>>331
コンストラクタは継承されないから、
変わりにgetInstanceとかを用意するとかかね

333 名前:デフォルトの名無しさん :2006/12/20(水) 00:08:18
>>325
全く同じ知識経験の人間がもう一度設計しても同じものになるのは当たり前。
問題点を把握してればそれなりに意味はある。

334 名前:デフォルトの名無しさん :2006/12/20(水) 00:13:32
>>332
C++の機能とか予約語の事じゃなくて
「欲しい型のデータを取るメソッドを用意しろ」ってことですよね、
要するにコンストラクタは使わないと

やっぱりそれしかないですか・・・

335 名前:デフォルトの名無しさん :2006/12/20(水) 00:30:08
class Hoge {
public:
Hoge(int foo) {}

private:
Hoge(); //no implement
};

じゃダメ? >>334


336 名前:デフォルトの名無しさん :2006/12/20(水) 01:09:59
>>331
どうせ template で使うんだろ?なら concept を定義するんだ。
今のところ言語は何も助けちゃくれないけどな。

337 名前:デフォルトの名無しさん :2006/12/20(水) 01:54:16
VC++6.0でこうやっても大丈夫なんですけど。
これって規格ではどうなんですか?安全が保障されてます?
void *p = NULL;
delete p;
free(p);

338 名前:デフォルトの名無しさん :2006/12/20(水) 01:55:21
>>337 何にも起こらない。安全。

339 名前:デフォルトの名無しさん :2006/12/20(水) 02:02:12
>>338
じゃあNULL判定しなくてもいいな。どうも。

340 名前:デフォルトの名無しさん :2006/12/20(水) 02:10:01
free(NULL)はどうだっけ?

341 名前:デフォルトの名無しさん :2006/12/20(水) 02:16:50
free(NULL); は問題ナシ。
delete NULL; はコンパイルエラーになりましたよ。
(VC++6.0 Pro SP6)

342 名前:デフォルトの名無しさん :2006/12/20(水) 07:32:28
>341
よーくかんがえろ。C++では
#define NULL 0
なので、文脈によってはポインタとして扱われない。キャストが要る。

343 名前:デフォルトの名無しさん :2006/12/20(水) 08:49:48
そこでnullptrですよ

344 名前:デフォルトの名無しさん :2006/12/20(水) 09:09:20
そこでnullpoですよ

345 名前:デフォルトの名無しさん :2006/12/20(水) 09:16:01
ゲッ

346 名前:デフォルトの名無しさん :2006/12/20(水) 18:02:50
STLのsetを使っていて、だいたい

set<X> a;
a.insert(b);

のようなことをやると、

Core was generated by `XYZXYZ'.
Program terminated with signal 11, Segmentation fault.
#0  0x400000000002f320 in std::_Rb_tree<X, X, std::_Identity<X>, std::less<X>, std::allocator<X> >::insert_unique ()
(gdb) backtrace
#0  0x400000000002f320 in std::_Rb_tree<X, X, std::_Identity<X>, std::less<X>, std::allocator<X> >::insert_unique ()
#1  0x4000000000002aa0 in main??unw ()

のような感じでエラーになってしまうようです。
(完全に再現性のある小さいコードを用意することが
出来ませんでした。すみません。)

コンパイラはicc9.0で、gccだと問題なく動作します。
個人的にはsetのinsertでcoreを吐くというのは、
あまりないような気がするのですが、どういうことを
念頭におきながらデバッグすればよいでしょうか?

347 名前:デフォルトの名無しさん :2006/12/20(水) 18:26:22
346です。
すみません、どうやらスレ違いみたいですね。
ttp://pc8.2ch.net/test/read.cgi/tech/1160821240/l50
で質問させていただきます。

348 名前:デフォルトの名無しさん :2006/12/20(水) 19:45:45
すごく初歩的な質問なんですけど、
CMyClassというクラスのcppファイル内で

#define FILEPATH L"C:\Test\File"
(中略)
void CMyClass::test
{
CString ss = FILEPATH;
}

というコードを記述してコンパイルすると
error C2065: 'INIFILEPATH' : 定義されていない識別子です。
というエラーが出てきてしまいます。#defineの使い方を
間違っているのでしょうか?であるならば正しい使い方を教えてください。
よろしくお願いします。



349 名前:デフォルトの名無しさん :2006/12/20(水) 20:04:00
エラー嫁。

350 名前:348 :2006/12/20(水) 20:07:40
>>349
すみません、名前間違っていたのを直しました。
ですがそれでも同じエラーが出てきてしまったんですけど
根本的になにか間違っているんでしょうか?

351 名前:デフォルトの名無しさん :2006/12/20(水) 20:23:22
ソース晴れ

352 名前:デフォルトの名無しさん :2006/12/20(水) 20:24:28
バックスラッシュ絡み?

353 名前:348 :2006/12/20(水) 20:42:47
みなさんすみません
ソースではなくヘッダーに記述したところ
コンパイル通りました。
お騒がせいたしましたm(_ _)m

354 名前:デフォルトの名無しさん :2006/12/20(水) 20:46:32
しかし\は\\にしないといかんと思うが

355 名前:デフォルトの名無しさん :2006/12/21(木) 01:16:59
>>348
C++で定数つかうならconstで
あとVC++みたいなので
const WCHAR *const FILEPATH = L"C:\Test\File";

356 名前:デフォルトの名無しさん :2006/12/21(木) 01:21:19
>>355
const WCHAR *const FILEPATH = L"C:\\Test\\File";
だろう

357 名前:デフォルトの名無しさん :2006/12/21(木) 02:08:59
注:私の有意義な発言に対し、自分の理解不足を棚に上げ煽り、1行レス
で返す方が多いようですが、そのような方はスレの皆様を混乱させるだけでなく
スレの雰囲気を崩しかねないのでお黙り下さい。
また質問者は回答者に知識を披露する場を与える貴重な存在なので、
質問者を見下した回答、あまりにも儀礼を欠いた回答も厳重に禁止いたします。
忙しい中、少ない時間の合間を縫って質問しに来てるわけですので、
その辺ご承知下さい。なお、当方が質問に対して有意義な答えであると
判断した方には評価いたしますので各自よく調べ、よく考え正確な回答をするように。

358 名前:デフォルトの名無しさん :2006/12/21(木) 02:35:30
257 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん

359 名前:デフォルトの名無しさん :2006/12/21(木) 03:09:20
257?

360 名前:デフォルトの名無しさん :2006/12/21(木) 07:52:21
>>356
const WCHAR FILEPATH[] = L"C:\\Test\\File";
だろう

361 名前:デフォルトの名無しさん :2006/12/21(木) 15:15:07
注.:.私.の.有.意.義.な.発.言.に.対.し.、.自.分.の.理.解.不.足.を.棚.に.上.げ.煽.り.、.1.行.レ.ス
で.返.す.方.が.多.い.よ.う.で.す.が.、.そ.の.よ.う.な.方.は.ス.レ.の.皆.様.を.混.乱.さ.せ.る.だ.け.で.な.く
ス.レ.の.雰.囲.気.を.崩.し.か.ね.な.い.の.で.お.黙.り.下.さ.い.。
ま.た.質.問.者.は.回.答.者.に.知.識.を.披.露.す.る.場.を.与.え.る.貴.重.な.存.在.な.の.で.、
質.問.者.を.見.下.し.た.回.答.、.あ.ま.り.に.も.儀.礼.を.欠.い.た.回.答.も.厳.重.に.禁.止.い.た.し.ま.す.。
忙.し.い.中.、.少.な.い.時.間.の.合.間.を.縫.っ.て.質.問.し.に.来.て.る.わ.け.で.す.の.で.、
そ.の.辺.ご.承.知.下.さ.い.。.な.お.、.当.方.が.質.問.に.対.し.て.有.意.義.な.答.え.で.あ.る.と
判.断.し.た.方.に.は.評.価.い.た.し.ま.す.の.で.各.自.よ.く.調.べ.、.よ.く.考.え.正.確.な.回.答.を.す.る.よ.う.に.。

362 名前:デフォルトの名無しさん :2006/12/21(木) 18:57:23
テンプレートの部分的特殊化で

template<class T> class Hoge{ /* ... */ };
template<class T, class U> class Hoge<T(U)>{ /* ... */ };

というコードを見たんですが、
T(U)という書き方はC++標準に適合しているのですか?

363 名前:デフォルトの名無しさん :2006/12/21(木) 20:12:01
クラスへのポインタがNULLでも
とりあえずメソッド呼べるんだねー
(もちろんメンバにアクセスしないメソッドだけだけど)



364 名前:デフォルトの名無しさん :2006/12/21(木) 20:22:59
>>363
鼻から悪魔が出てるぞ

365 名前:デフォルトの名無しさん :2006/12/21(木) 20:24:13
>>362
T(U)は、U型を引数に取りT型を返す関数型。

>>363
静的メンバがなかった頃には、それで代用していたらしい。
今の規格では、たぶんそれをやるとどうなるかは未定義にしていると思う。

366 名前:362 :2006/12/21(木) 20:33:23
>>365
ありがとうございます
ところで規格書のどのセクションにあるかわかりますか?

367 名前:デフォルトの名無しさん :2006/12/21(木) 20:34:46
質問です

newで確保したメモリに対して、
2回delete走らせると死ぬのはなぜですか?

368 名前:デフォルトの名無しさん :2006/12/21(木) 20:40:24
平気と思うその感覚がわからん。

369 名前:デフォルトの名無しさん :2006/12/21(木) 20:42:03
Linux上でg++を使ってプログラムを書きたいと思っています。
標準ライブラリのオンラインマニュアルはどのようにしたらみれるのでしょうか?
(日本語でも英語でも構いません)

370 名前:デフォルトの名無しさん :2006/12/21(木) 20:45:10
>>366
強いて言えば8.3.5@JIS X 3014:2003

>>365
deleteされても、deleteしたポインタを指す変数は、そこを指していると言う状態のままである。
そこで、2度目のdeleteを行うと、deleteされたはずの場所をdeleteしようとして、あらぬことになる。

原理的には1度目のdeleteの後で、そこを指す変数に0を代入しておけば2度目のdeleteでは、
ヌルポインタをdeleteすることになって落ちない(ヌルポインタのdeleteは何も起きないと定められている)。
勿論実際には、2度もdeleteするなと言う話になるが。

371 名前:デフォルトの名無しさん :2006/12/21(木) 20:53:59
>>370
丁寧なご説明
ありがとうございました。


372 名前:デフォルトの名無しさん :2006/12/21(木) 20:55:27
const変数の値が書き換わってしまうのってどんな場合がありますか?
(メモリ直接上書きとconst_cast以外で)

373 名前:デフォルトの名無しさん :2006/12/21(木) 20:57:03
放射線

374 名前:デフォルトの名無しさん :2006/12/21(木) 20:59:45
>>369
http://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-3.4/index.html


375 名前:デフォルトの名無しさん :2006/12/21(木) 21:16:35
const変数の値が書き換わるかどうかは未定義では?
const_castは実際にはconstでないオブジェクトへのconstポインタのconstを外すのに使われるだけ
つまり、
int a = 0;
void f(const int* a){
*const_cast<int*>(a) = 1;
}
これはおk
const int a = 0;
void f(const int* a){
*const_cast<int*>(a) = 1;
}
未定義

376 名前:デフォルトの名無しさん :2006/12/21(木) 21:20:19
>>370
そこで auto_ptr ですよ。

377 名前:デフォルトの名無しさん :2006/12/21(木) 23:56:10
質問です。

WinXP Pro
VC2005 SP1

RaiseException にて発生させたエラーを、ただの try でキャッチしたいのですが、
try {


378 名前:377 :2006/12/21(木) 23:59:20
質問です。

RaiseException にて発生させたエラーを、ただの try でキャッチしたいのですが、
catch (...)
だとキャッチ出来ます。さらに詳しい情報が欲しいため、catch の () の中に書くべき
コードがわかりません。そもそも、仕様上無理なものなのでしょうか?

ちなみに、__except では成功しました。

WinXP Pro
VC2005 SP1
コンパイルオプションで、「SEH の例外あり (/EHa)」を指定しています。


379 名前:デフォルトの名無しさん :2006/12/22(金) 00:27:36
そもそも標準にRaiseExceptionなんてものは無いわけで

380 名前:369 :2006/12/22(金) 00:37:13
>>374
ありがとうございました。

381 名前:デフォルトの名無しさん :2006/12/22(金) 00:39:23
>377
Windowsの構造化例外をC++例外に変換する方法があるが
環境依存なのでスレ違い

382 名前:377 :2006/12/22(金) 04:49:07
>>381
ありがとうございます。
381さんの書き込みで解決しました。

383 名前:デフォルトの名無しさん :2006/12/23(土) 14:57:35
MFCスレで聞いたら、スレ違いといわれたので、こちらに来ました。

VC++6.0 WinXPProで開発を行っております。
ダイアログアプリの開発を行っており、そのアプリ上で、XPログオン用のユーザ名とパスワード
を利用者に打ち込ませています。このパスワードが正しいかどうかを、開発したプログラム上で
確認したいと思っているのですが、どのようにすればよろしいでしょうか。

384 名前:デフォルトの名無しさん :2006/12/23(土) 15:06:20
>>383
strcmp() でいいんじゃね?

っていうか、まずは自分で書け。
それで困ったことがあったら相談してもいいから。

385 名前:デフォルトの名無しさん :2006/12/23(土) 15:12:02
いや、>>383は、そのユーザ名とパスワードが、
正しいアカウントとパスワードであるかどうかを確認したいんじゃないのか。

しかし、そんなAPIはエクスポートされているのかね。

386 名前:デフォルトの名無しさん :2006/12/23(土) 15:13:13
>>384
strcmpだと、Windowsパスワードとの比較ができません。
そもそも、Windowsパスワード自体知らないわけで、知らない文字列との比較は……

387 名前:デフォルトの名無しさん :2006/12/23(土) 15:15:21
APIスレのが適切だと思うけどな
APIで、パスワードが「必ずある」ならLogonUserあたりかもしらん
自PCパスワードつきのアカウント1個もないからわからんけど

388 名前:デフォルトの名無しさん :2006/12/23(土) 15:19:43
あまり環境依存な話は持ち出すべきじゃないと思うが、
ぐぐったら一発でヒットしたぞ。
面倒そうではあるが。
ttp://support.microsoft.com/kb/180548


というわけで終了。

389 名前:383 :2006/12/23(土) 15:52:22
ありがとうございます。

390 名前:デフォルトの名無しさん :2006/12/25(月) 00:02:49
イブだけど、とりあえずtemplateがキモすぎて俺は失禁しそうです><

391 名前:デフォルトの名無しさん :2006/12/25(月) 00:55:50
>>390
クリスマスに失禁とはとんだ茶番だな

392 名前:デフォルトの名無しさん :2006/12/25(月) 01:00:54
fstreamのバイナリモードで数メガのファイルを数バイトずつシークし読み取って変数に格納してるんですが、
なんだかHDに優しくないような気がしてきました。
もっと外道でないやり方はありますか?

393 名前:デフォルトの名無しさん :2006/12/25(月) 01:03:13
>>392
シークする必要はどうしてあるの?どういう格納方法になってるんだ?

394 名前:デフォルトの名無しさん :2006/12/25(月) 01:03:50
環境依存だがデカいファイルの読み書きにはmemory mapped fileを使うべし。

395 名前:デフォルトの名無しさん :2006/12/25(月) 01:11:30
>>392
バッファリングされているから問題ない


396 名前:デフォルトの名無しさん :2006/12/25(月) 01:13:33
>>392
std::getline()でstd::stringにファイルを一括して読み込み、それを元に
std::stringstreamを作成し、そこから変数を読み取る。

シークの部分はstd::stringstreamではseekpとseekgの意味が異なるので
移植に注意。

397 名前:デフォルトの名無しさん :2006/12/25(月) 01:15:20
うわっやべえ
ベンチマーク取って遊びたくなってきた。

どちらが速いのか?あーでもファイルはディスクキャッシュを無効に
したりいろいろしないといけないので面倒だな。

398 名前:デフォルトの名無しさん :2006/12/25(月) 02:59:35
extern "C" void register_callback(void* object, void (*callback)(void* object));

C で作ったライブラリにこんな関数あるんだけど、こいつにクラスの
インスタンスを食わせたいとき、

class C {
public: void foo() { register_callback(this, callback); }
private: static void callback(void* this_);
};

こんなふうに書いてたんだ。コンパイルも通るし、動作にも問題ない。
でも実は extern "C" の中にある関数の型と C++ で普通に宣言した
関数じゃ型が違うらしいんだ。つまり register_callback() に渡す
関数は extern "C" で宣言しないとダメってことね。

それじゃぁってことで、

extern "C" void callback(void* this_);
class C {
public: void foo() { register_callback(this, callback); }
private: friend void callback(void* this_);
};

としたんだけど、これだと callback() が外部シンボルになってしまう。
じゃぁ static つければ内部リンケージになるだろうと思ったけど、

static extern "C" void callback(void* this_);

はコンパイル通らなかった。

どうすればいいと思う?

399 名前:デフォルトの名無しさん :2006/12/25(月) 03:01:18
>>>398
extern "C" の関数にthisポインタを渡さないようにする。これで解決。

400 名前:デフォルトの名無しさん :2006/12/25(月) 08:34:12
コンパイルもとおって動作に問題もなくて
何がダメだったのかが分からない

401 名前:デフォルトの名無しさん :2006/12/25(月) 09:29:55
extern "C"の意味を理解してないのがダメ。
C++側で、Cの流儀に合わせる願望がダメ。

402 名前:デフォルトの名無しさん :2006/12/25(月) 10:08:48
extern "C" の関数を別につくり、クラスへのアクセスはそこ経由のみ、とか

403 名前:デフォルトの名無しさん :2006/12/25(月) 11:54:03
>>400
規格の 7.5p1 より
"Two function types with different language linkages are distinct types even if they are otherwise identical."
ということで C++ language linkage を持つ C のメンバ関数 callback() は
C language linkage を持つ register_callback() の引数 callback とは型が違うことになる。

型が違えばエラーになるはずなんだが、コンパイルが通る。ってことは
暗黙の変換か何か行われるのかと思うけど、規格にそんな記述は無い。

型を合わせるために extern "C" をつければいい( >>402 の方法ね)んだけど、
そうすると外部リンケージを持つことになるんで名前付けが面倒。そもそも
別のソースから呼び出したいわけじゃない。

404 名前:デフォルトの名無しさん :2006/12/25(月) 12:14:14
Linkage from C++ to objects defined in other languages
and to objects defined in C++ from other languages is
implementation-defined and language-dependent. Only
where the object layout strategies of two language
implementations are similar enough can such linkage
be archived.

405 名前:デフォルトの名無しさん :2006/12/25(月) 12:35:49
これだな。
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=2316

規格に沿って修正するとえらいことになってしまう罠。
pthread_create() に C++ の関数渡してるコードなんて
山ほどある。 qsort() や bsearch() もヤバイ。

406 名前:デフォルトの名無しさん :2006/12/25(月) 12:47:15
>>405
それとは違うでしょ。
同じ名前使ってるんじゃなくて、
リンケージの違うものを渡して型は大丈夫なのかって話だから。
大丈夫でしょ。

callbackにstatic修飾は必要なの?

407 名前:デフォルトの名無しさん :2006/12/25(月) 12:51:09
>>406
extern "C" と extern "C++" で関数の型を区別するかどうかってことで、
関連はあるだろう。

static つけないとプログラム全体で完全にユニークな名前をつける必要が
あるんで、面倒になる。

408 名前:デフォルトの名無しさん :2006/12/25(月) 13:09:06
static付けると void (C::*)(void*) ではなくて、
void (*)(void*) と見做されているみたいだが。> g++


409 名前:デフォルトの名無しさん :2006/12/25(月) 13:23:01
>>408
そんなことはみんな知ってて話してる。

410 名前:デフォルトの名無しさん :2006/12/25(月) 14:15:33
>>408
当たり前だろwwwwボケはすっこんでろwwwwwwww

411 名前:デフォルトの名無しさん :2006/12/25(月) 14:17:04
410は初めて知ったようだ

412 名前:フォルトの名無しさん :2006/12/25(月) 15:12:44
どうみてもC++の基礎知識の欠如です
本当にメリークリスマスでした

413 名前:デフォルトの名無しさん :2006/12/25(月) 15:40:26
>>403
規格でも認められてる。よく読め。

414 名前:デフォルトの名無しさん :2006/12/25(月) 17:59:57
初歩的な質問で恐縮ですが教えてください。

int n=10;
int & nRef = n;

上記のような宣言が行われているとして、あるタイミングで
変数nRefに別の参照を設定したいのですが、

int i=8;
nRef = i;

としてみても変わらず変数nを参照してしまいます。
どうしたらよいのでしょうか?



415 名前:デフォルトの名無しさん :2006/12/25(月) 18:03:15
ポインタにする。

416 名前:デフォルトの名無しさん :2006/12/25(月) 18:06:52
ポインタを使えばいいという理由で、参照先は後から変えられない。

417 名前:413 :2006/12/25(月) 18:17:13
>>415-416
レスどうもです。
ポインタですか・・・。まだあまりポインタ理解できていないので
使いたくはなかったのですが、これもいい機会だと思って勉強します。
ありがとうございました。

418 名前:デフォルトの名無しさん :2006/12/25(月) 18:18:34
ポインタが理解できないうちは参照使わない方が良いよ

419 名前:414 :2006/12/25(月) 18:18:34
間違えました。>417は私です。

420 名前:デフォルトの名無しさん :2006/12/25(月) 18:29:56
つーか、参照先を変えたい理由如何によってはポインタ云々以前かも試練。

421 名前:デフォルトの名無しさん :2006/12/25(月) 23:53:51
こういうのってOKなの?

#define WORKPATH "c:\\temp\\aaa"
const string g_WORKPATH = WORKPATH;



422 名前:デフォルトの名無しさん :2006/12/26(火) 00:02:56
何か懸念でも?


423 名前:デフォルトの名無しさん :2006/12/26(火) 02:23:00
>>413 規格のどこで何が認められてるの?

424 名前:デフォルトの名無しさん :2006/12/26(火) 02:25:42
>>421
なぜそんなことをしたいのかわからないが、問題ないと思う。

425 名前:デフォルトの名無しさん :2006/12/26(火) 06:19:24
もしかしたらCからの移行かもな・・・

426 名前:デフォルトの名無しさん :2006/12/26(火) 06:59:02
クラスのprivateメンバが例え一つしかなくても
Pimplイディオムを使う意義はありますか?

427 名前:デフォルトの名無しさん :2006/12/26(火) 08:37:42
変数名が置き換わらないのかなと思って

428 名前:デフォルトの名無しさん :2006/12/26(火) 08:41:52
>>426 あるよ

429 名前:426 :2006/12/26(火) 09:17:09
レスdです

気にせず常にPimpl使おうと思います

430 名前:デフォルトの名無しさん :2006/12/26(火) 09:47:45
常に…?

431 名前:デフォルトの名無しさん :2006/12/26(火) 09:57:08
いや、使えそうな場面では常に、ですorz
今まではprivateなメンバが一つの時とかはどうしようか迷ってたんで

432 名前:デフォルトの名無しさん :2006/12/26(火) 15:10:15
二つに増えるかも知れないから、Pimplを使うと考えろ
ゼロになるかも(ry

433 名前:デフォルトの名無しさん :2006/12/26(火) 23:23:17
いろんなスレッドから参照されるクラス(インスタンス)
に適用できるデザインパターンて何かな
まあ、普通に全メソッドにクリティカルセクションかけりゃいいけど
なんかいいの無いかな

434 名前:デフォルトの名無しさん :2006/12/26(火) 23:25:29
Immutable, Read write lockとか?
つかそんなんじゃワカラン

435 名前:デフォルトの名無しさん :2006/12/26(火) 23:43:13
>>434
ありがトンございます
ともあれデザパタ本買います

436 名前:デフォルトの名無しさん :2006/12/26(火) 23:45:23
C++ マルチスレッド関連のデザパタ本無いですか?
アマゾンで検索したのですがJAVAしか出てきません

437 名前:デフォルトの名無しさん :2006/12/26(火) 23:51:59
Javaは言語規格にスレッドがあるからな
素直にJava勉強してその本読んだ方が良いかと

438 名前:デフォルトの名無しさん :2006/12/26(火) 23:56:38
ACE本はフレームワークの存在が前提だし
デザパタを前面に押し出しているわけじゃないし

POSAの第2巻とか?あれはC++に限ってないけれど

あとはJavaな本をC++の言葉に噛み砕いて読むくらいかな
437に書かれているような言語機能の違いからC++特有の苦労が必要になるけれど

439 名前:デフォルトの名無しさん :2006/12/27(水) 00:25:14
>>437,438
そうですね。とりあえず基本的なクラスの設計は
Javaと共通の部分があると思うのでJava本買おうと思います。
レスありがとうございました。

440 名前:デフォルトの名無しさん :2006/12/27(水) 02:29:29
>>439
thread local specifier, __threadってのが多くのベンダのコンパイラで使えて、
標準になりそうなので、調べてといて。
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1966.html

441 名前:デフォルトの名無しさん :2006/12/27(水) 02:54:25
TLSはもう普通に使われてるんじゃね

>>C++でデザパタ
「プログラムデザインのためのパターン言語」って本はサンプルがC++だったよん
すこしsmalltalkもあったけど。
あとネット上なら
http://www002.upp.so-net.ne.jp/ys_oota/mdp/index.htm
とか
http://www.01-tec.com/document/cpp_design_pattern.html
とか。
ハテナダイアリでちょこっと検索するとブログで書かれてるのが出てきたりもする

442 名前:デフォルトの名無しさん :2006/12/27(水) 15:35:56
質問です
#defineにとっての#undefに相当することを
usingに対してやりたいんだけど、
namespaceを一個作成してその中でusingするしかないんでしょうか

443 名前:デフォルトの名無しさん :2006/12/28(木) 12:38:58
{
 using ...;
}


444 名前:デフォルトの名無しさん :2006/12/28(木) 15:57:57
サブルーチンの中にサブルーチンを書くのはどうでしょうか?
というのも指導教官に「それはよくない。美しくない」と指摘されたのですが、
実用性を重視するなら、ありといえばありですよね?
みなさんが直面された重要な困難があれば教えて欲しいです。

445 名前:デフォルトの名無しさん :2006/12/28(木) 16:06:30
>>444
スレ違い

446 名前:デフォルトの名無しさん :2006/12/28(木) 16:16:55
すいませんでした。初心者スレで聞いてきます。

447 名前:デフォルトの名無しさん :2006/12/28(木) 20:19:28
>>444
案外C++な話題かも?

void foo(void)
{
 struct local {
  static void func(void) {
   // do something
  };
 };
 local::func();
 local::func();
}

ある関数内でのみ可視な関数を使いたいときに便利。


448 名前:デフォルトの名無しさん :2006/12/28(木) 20:41:38
>>444
別に美しくないとは思わない
その教官のセンスがおかしいだけ

449 名前:デフォルトの名無しさん :2006/12/28(木) 20:56:51
>>448
じゃあお前もおかしいな、センスとか

450 名前:デフォルトの名無しさん :2006/12/28(木) 21:01:06
>>449==教官
>センスがおかしいだけ

451 名前:デフォルトの名無しさん :2006/12/28(木) 22:15:31
>>443
これ、いいですね。ありがとん

452 名前:デフォルトの名無しさん :2006/12/29(金) 10:22:22
lambdaを否定された気がする

453 名前:デフォルトの名無しさん :2006/12/29(金) 17:19:04
質問です。
C++で、ファイルの内容を一度にstd::stringに読み込む方法は
ないでしょうか?

いろいろ調べてみたのですが、std::getline()では改行文字まで
しか読み取らないし、他にはread()で何バイトかずつ読み込んで
stringに足すか、get()で一文字ずつ読み込んで足す、位の方法
しか思いつきません。

rdbuf()を使ってstd::stringstreamに読み込もうとしたら、fstreamとは
違ってコンストラクタがないんですね。

454 名前:デフォルトの名無しさん :2006/12/29(金) 17:45:04
std::string str;
std::ifstream fin;

std::copy(std::istreambuf_iterator<char>(fin),std::istreambuf_iterator<char>(),std::inserter(str,str.begin()));

455 名前:デフォルトの名無しさん :2006/12/29(金) 17:54:24
>>454
ありがとうございます。これならスマートになりますね。
速度的には1文字ずつ読んでいるのであまり変化ないかもしれませんが、
一行で書けるという点が魅力です。

istreambuf_iteratorを使うという所が私には盲点でした。

さっそく使わせていただきます!

456 名前:デフォルトの名無しさん :2006/12/29(金) 17:55:30
std::ifstream file;
std::istreambuf_iterator<char> first(file);
std::istreambuf_iterator<char> last;
std::string fileData(first, last);

457 名前:デフォルトの名無しさん :2006/12/29(金) 17:58:29
1行で書きたいのなら
std::string fileData((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());
しかし分かりにくいので>>456のように書いた方がよい
>>455-456のやり方は>>454のように1文字ずつの代入ではなく初期化なので効率は少しはマシになるはず

458 名前:デフォルトの名無しさん :2006/12/29(金) 18:03:47
>>455-457
度々ありがとうございます。
私も書いてみました。これでも行けるようです。
s.insert(s.begin(), std::istreambuf_iterator<char>(ifs), std::istreambuf_iterator<char>());

459 名前:デフォルトの名無しさん :2006/12/29(金) 18:09:42
>>457
あと、stringのコンストラクタにistreambuf_iteratorを取る形式ですと、
遅延評価を行っているのかよくわかりませんが、私の環境では直後の

std::istringstream strstr(s);

で "istreambuf_iterator *を取るコンストラクタが見つからない"という
エラーが出てしまいます。ちょっと謎です。

環境はBCC5.8.2、Dinkumwareです。

460 名前:デフォルトの名無しさん :2006/12/29(金) 18:13:38
コンストラクタやinsertを使わずにinserter使う奴大杉

461 名前:デフォルトの名無しさん :2006/12/29(金) 18:16:10
世間に?職場に?

462 名前:デフォルトの名無しさん :2006/12/29(金) 18:18:40
>458
文字列が空の場合この方がよいと思う。
(空で無い場合意味が異なる)
s.assign(std::istreambuf_iterator<char>(ifs), std::istreambuf_iterator<char>());

463 名前:デフォルトの名無しさん :2006/12/29(金) 18:21:59
>>462
それはコンパイルエラーになりました。
C++標準ライブラリという本にも、assignメンバ関数にはイテレータを
取る形式は書いてありませんでした。

464 名前:デフォルトの名無しさん :2006/12/29(金) 18:23:09
空なんだったらassignなどせずに初期化した方が良かろう

465 名前:デフォルトの名無しさん :2006/12/29(金) 18:24:39
>>464
>>459でも書いたように、コンストラクタにイテレータを使う形式ですと、
そのstringでistringstreamを構築するとエラーが出てしまうので、
今回は使えないのです。

466 名前:デフォルトの名無しさん :2006/12/29(金) 18:35:48
>463
そんな本とコンパイラなんて窓から投げ捨ててしまえ。

467 名前:デフォルトの名無しさん :2006/12/29(金) 18:49:39
助けてください
結構凄いことなってる。助言とかお願いします
http://ex17.2ch.net/test/read.cgi/news4vip/1167379476/

468 名前:デフォルトの名無しさん :2006/12/29(金) 19:00:55
>>459
なんかそれ変だな
以下のソースでどんなコンパイルエラーが出る?
#include <fstream>
#include <iterator>
#include <string>
#include <sstream>
using namespace std;
int main () {
ifstream ifs ("hoge");
string s ((istreambuf_iterator <char> (ifs)), istreambuf_iterator <char> ());
istringstream strstr (s);
return 0;
}


469 名前:デフォルトの名無しさん :2006/12/29(金) 19:41:53
Effective STLでいうところの「C++で最も奇妙な解析」が絡んでるな、この会話。
なんか一言あったほうがいいかもしれないけど、説明が面倒だな。

470 名前:デフォルトの名無しさん :2006/12/29(金) 19:43:49
>>468
いえ、これは通りました。
どうもstringを定義している位置で出たり出なかったりするようです。
間違いなくコンパイラのバグだと思います。

471 名前:デフォルトの名無しさん :2006/12/29(金) 19:45:04
>>469
その本持ってます。確か「関数と見なせるものは関数とみなす」
という意味で、防止法は、括弧で囲む事でしたね。それでちょっと
試してみます。

472 名前:デフォルトの名無しさん :2006/12/29(金) 19:47:42
>>469
済みません、本当にありがとうございました。
Effective STLの第6項、P32そのままの問題でした。
コンパイラのバグではありませんでした。

本は読んでいましたが、実際に遭遇したのは初めてです。
覚えておきます。

473 名前:デフォルトの名無しさん :2006/12/29(金) 19:49:26
だから>>456のように書いた方が良いわけだ・・・・

474 名前:469 :2006/12/29(金) 20:28:40
>>457-458ペアと>>462-463ペアのコード&反応の違いを見て
急に気になって書いたんだが、書いてよかったな。

475 名前:デフォルトの名無しさん :2006/12/29(金) 20:31:00
>>474
実は>>457の第一パラメータに括弧が付いているのを見落として
いたんです。申し訳ありません。

476 名前:デフォルトの名無しさん :2006/12/29(金) 21:34:12
実際にこれに引っ掛かってるのを初めて見た

477 名前:デフォルトの名無しさん :2006/12/29(金) 22:03:00
真の通過儀礼か。

478 名前:デフォルトの名無しさん :2006/12/29(金) 22:43:04
ここでC++糞と思うかC++面白いと思うかが今後を分ける
かも。

479 名前:デフォルトの名無しさん :2006/12/29(金) 23:57:00
Effective STL持ってないんだけど、どういう問題なのかサラっとでいいから教えてくれないかな。

480 名前:デフォルトの名無しさん :2006/12/30(土) 00:03:02
>>479
string s(istreambuf_iterator<char>(ifs), istreambuf_iterator<char>());

が s という名前の関数宣言と見なされてしまうという問題で、これを
回避するために

string s((istreambuf_iterator<char>(ifs)), istreambuf_iterator<char>());

これで ifs のファイル内容で初期化された string型の変数 s が出来る。

481 名前:デフォルトの名無しさん :2006/12/30(土) 00:12:03
string s(istreambuf_iterator<char>(ifs), istreambuf_iterator<char>());
が何で関数宣言にみなされるの?

482 名前:デフォルトの名無しさん :2006/12/30(土) 00:16:08
>>481
string s(istreambuf_iterator<char> ifs, istreambuf_iterator<char>);

とみなされるから。これで分からなければ是非本を読んでね。

483 名前:デフォルトの名無しさん :2006/12/30(土) 00:20:04
なんとなく予想してたので合ってたわ

484 名前:デフォルトの名無しさん :2006/12/30(土) 00:26:01
sはstring型を返す関数で、引数を2つとる。
最初の引数はistreambuf_iterator<char>型で、名前はifs。
2番目の引数は、「引数をとらずistreambuf_iterator<char>型を返す関数」へのポインタ。

・・・とコンパイラは解釈する。

485 名前:デフォルトの名無しさん :2006/12/30(土) 00:34:34
>>484
あ、そうだった。

string s(istreambuf_iterator<char> ifs, istreambuf_iterator<char>());

こうですね。本を持っててもちゃんと読んでいないとこんなもんです。

486 名前:デフォルトの名無しさん :2006/12/30(土) 00:39:16
あーくそ。C++ Primer Plus fifthを書店で見かけたと思ったら、
何と"C Primer Plus fifth"だった。まあ内容的にはC99の事も
取り上げられていていいのだが。

注文せんと入れてくれんかなぁ。

487 名前:デフォルトの名無しさん :2007/01/01(月) 02:25:28
これって邪道すぎ?

class mystrfnc{
  std::string str;
  mystrfnc(const std::string &str):str(str){}
public:
  friend mystrfnc operator--(const std::string &str,int i){return mystrfnc(str);}
  mystrfnc *operator--(int i){return this;}
  std::string func(){return "["+str+"]";}
};
int main(){
  std::string str="STRING";
  std::cout<<str----->func()<<std::endl;
  return 0;
}

もちろん、個人で組んでる趣味のコードですが

488 名前:デフォルトの名無しさん :2007/01/01(月) 02:39:02
>>487
何がしたいのかわからん。
邪道だと思うんならやめればいい。
個人だ趣味だと予防線を張るくらいなら好きにすればいい。

489 名前:487 :2007/01/01(月) 03:10:54
>>488
本当にしたいこと:stringにsubstr系のメソッドを追加したい

std::stringを継承するのは大変そうなのでやりたくない
関数にするよりメソッドっぽくしたい(元のstringの部分が長いのでを()で囲みたくない)

こうゆう状況で、
「んなことするよりこうする方が見やすくてええやん」
「それはこうゆうときにこんなことがおこるから素直にこうしとけ!」
の様な意見あるかを聞きたいわけです

490 名前:デフォルトの名無しさん :2007/01/01(月) 03:13:31
演算子を本来の意味意外に使うのはなんちゃってプログラミング専用。

491 名前:デフォルトの名無しさん :2007/01/01(月) 03:35:30
>>487
何じゃこりゃ!新年早々気持ち悪いプログラムを見てしもた。
後置演算子として解釈されているのか。

((str.operator--(str, int)).operator--(int))->func() と読めばいいのか。

492 名前:デフォルトの名無しさん :2007/01/01(月) 04:19:40
修行が足らんな。iocccの美しいコードたちを眺めて目を養うことだ

493 名前:デフォルトの名無しさん :2007/01/01(月) 04:24:34
>>492
鍛えられるが養えない。
昔VAX11用のコードでスゲェ、キタコレーなのがあったなぁ(遠い目



494 名前:デフォルトの名無しさん :2007/01/01(月) 04:44:43
int main() { return E--++----++----++------++------->result; }

なぜか無限の可能性を感じずにはいられない。

495 名前:デフォルトの名無しさん :2007/01/01(月) 05:00:52
brainf*ckかとオモタ


496 名前:487 :2007/01/01(月) 05:15:09
追伸
mystrfnc *operator->(){return this;}

str--->func()
に減らせたーー!

497 名前:デフォルトの名無しさん :2007/01/01(月) 11:23:55
operator ->*のほうがスマートでは、と思ったが、いざやってみたらBoostが要るわ(TR1でもいいが)。
まあ趣味ならBoostも気兼ねなく使えるだろう。
#include <iostream>
#include <string>
#include <cassert>
#include <boost/function.hpp>
#include <boost/bind.hpp>
std::string do_func(const std::string& str) {return "[" + str + "]";}
enum func_type {
  func
};
boost::function<std::string ()> operator->*(const std::string& str, func_type fn) {
  switch (fn) {
  case func:
    return boost::bind(do_func, str);
  default:
    assert(0);
    return boost::function<std::string ()>();
  }
}
int main() {
  std::string str = "STRING";
  std::cout << (str->*func)() << std::endl;
}

498 名前:デフォルトの名無しさん :2007/01/01(月) 13:55:35
どちらにしても呼び出し部分から意図が汲み取れない酷いコードにはちがいないね

499 名前:デフォルトの名無しさん :2007/01/01(月) 14:32:29
>>489
> 本当にしたいこと:stringにsubstr系のメソッドを追加したい

std::string::substr() は既にあるわけだが。

500 名前:487 :2007/01/01(月) 16:01:39
>>497
すごく面白そうですが、最終的に()で括ってるのが悲しいです。
boostよく知らないんでちょっとした修正で()外せたりするのかもしれませんが

>>499
本当にしたいこと:stringに元の文字列の部分文字列を返すメソッドを何種類か追加したい
こう言えば解ってもらえますかね


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