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


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

C++相談室 part28
1 名前:v(^・^)v :04/02/29 01:19
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
また、テンプレートライブラリ(STL含む)に関する質問は
専用の別スレへどうぞ。

過去スレ、関連スレ、関連リンクなどはこちら>>2-13

2 名前:v(^・^)v :04/02/29 01:21
■過去スレ■
 1 http://mimizun.mine.nu:81/2chlog/tech/piza.2ch.net/tech/kako/980/980175292.html
 2 http://pc.2ch.net/tech/kako/996/996640937.html
 3 http://pc.2ch.net/tech/kako/1003/10038/1003832761.html
 4 http://pc.2ch.net/tech/kako/1009/10090/1009071535.html
 5 http://pc.2ch.net/tech/kako/1014/10142/1014217496.html
 6 http://pc.2ch.net/tech/kako/1018/10184/1018454705.html
 7 http://pc.2ch.net/tech/kako/1021/10217/1021787032.html
 8 http://pc3.2ch.net/tech/kako/1025/10250/1025010364.html
 9 http://pc3.2ch.net/tech/kako/1027/10273/1027347982.html
 10 http://pc3.2ch.net/tech/kako/1029/10293/1029315669.html
 11 http://pc3.2ch.net/tech/kako/1032/10323/1032345774.html
 12 http://pc3.2ch.net/tech/kako/1035/10350/1035005882.html
 13 http://pc3.2ch.net/tech/kako/1038/10380/1038031395.html
 14 http://pc2.2ch.net/tech/kako/1041/10413/1041328679.html
 15 http://pc2.2ch.net/tech/kako/1043/10436/1043605481.html
 16 http://pc2.2ch.net/tech/kako/1045/10457/1045746245.html
 17 http://pc2.2ch.net/tech/kako/1047/10475/1047560042.html
 18 http://pc2.2ch.net/tech/kako/1050/10501/1050177746.html
 19 http://pc2.2ch.net/tech/kako/1052/10526/1052625846.html
 20 http://pc2.2ch.net/tech/kako/1055/10551/1055162298.html
 21 http://pc2.2ch.net/tech/kako/1057/10575/1057580107.html
 22 http://pc2.2ch.net/tech/kako/1060/10603/1060361082.html
 23 http://pc2.2ch.net/test/read.cgi/tech/1062690663/
 24 http://pc2.2ch.net/test/read.cgi/tech/1066546387/
 25 http://pc2.2ch.net/test/read.cgi/tech/1067949669/
 26 http://pc2.2ch.net/test/read.cgi/tech/1070164402/
 27 http://pc2.2ch.net/test/read.cgi/tech/1074454641/

3 名前:v(^・^)v :04/02/29 01:22
■基本■
[C++ FAQ]
 http://www.parashift.com/c++-faq-lite/
 http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
  Cとその仕様を比較しながらの解説なので分かりやすい。
  ***** 質問の前に必ずこの二つに目を通してください *****

[禿 Stroustrup]
 http://www.research.att.com/~bs/
[C++ International Standard]
 http://www.kuzbass.ru/docs/isocpp/
 http://www.kuzbass.ru/docs/ansi_iso_iec_14882_1998.pdf
 http://www.iso.org/iso/en/CatalogueDetailPage.CatalogueDetail?CSNUMBER=38110&ICS1=35&ICS2=60&ICS3=
[JTC1/SC22/WG21 - C++]
 http://std.dkuug.dk/jtc1/sc22/wg21/

[C/C++ Users Journal]
 http://www.cuj.com/
[cppll (ML)]
 http://www.trickpalace.net/cppll/ (日本語)

4 名前:v(^・^)v :04/02/29 01:22
■Books■
amazon.com C,C++関連書籍
 http://www.amazon.com/exec/obidos/tg/browse/-/3956/ref=br_bx_c_1_3/

The C++ Programming Language
 http://www.amazon.com/exec/obidos/ASIN/0201700735/
 http://www.amazon.co.jp/exec/obidos/ASIN/475611895X/ (翻訳)
C++ Primer (3rd Edition)
 http://www.amazon.com/exec/obidos/ASIN/0201824701/
 http://www.amazon.co.jp/exec/obidos/ASIN/4756140068/ (翻訳)
The C++ Standard Library
 http://www.amazon.com/exec/obidos/ASIN/0201379260/
 http://www.amazon.co.jp/exec/obidos/ASIN/4756137156/ (翻訳)
Effective C++
 http://www.amazon.com/exec/obidos/ASIN/0201924889/
 http://www.amazon.co.jp/exec/obidos/ASIN/4756118089/ (翻訳)
More Effective C++
 http://www.amazon.com/exec/obidos/ASIN/020163371X/
 http://www.amazon.co.jp/exec/obidos/ASIN/4756118534/ (翻訳)
Exceptional C++
 http://www.amazon.com/exec/obidos/ASIN/0201615622/
 http://www.amazon.co.jp/exec/obidos/ASIN/4894712709/ (翻訳)
More Exceptional C++
 http://www.amazon.com/exec/obidos/ASIN/020170434X/
Effective STL
 http://www.amazon.com/exec/obidos/ASIN/0201749629/
 http://www.amazon.co.jp/exec/obidos/ASIN/4894714108/ (翻訳)
Modern C++ Design
 http://www.amazon.com/exec/obidos/ASIN/0201704315/
 http://www.amazon.co.jp/exec/obidos/ASIN/4894714353/ (翻訳)
C++ Templates
 http://www.amazon.com/exec/obidos/ASIN/0201734842/

5 名前:v(^・^)v :04/02/29 01:23
■Libraries■
[Boost]
 Boost http://www.boost.org/
 (日本語) http://user.ecc.u-tokyo.ac.jp/~s31552/wp/boost/
 (日本語) http://www.kmonos.net/alang/boost/
[STL]
 STLport http://www.stlport.org/
 SGI-STL http://www.sgi.com/tech/stl/
 STLFilt http://www.bdsoft.com/tools/stlfilt.html
 (日本語) http://www005.upp.so-net.ne.jp/episteme/html/stlprog/
 (日本語) http://www.wakhok.ac.jp/~sumi/stl/
[Loki]
 http://www.moderncppdesign.com/
 LokiPort-MSVC7 http://www.geocities.com/rani_sharoni/LokiPort.html
 LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport
[他]
 ACE http://www.cs.wustl.edu/~schmidt/
 Blitz++ http://www.oonumerics.org/blitz/
 flex++ Bison++ http://www.idiom.com/free-compilers/TOOL/BNF-15.html
[他ライブラリリンク集]
 http://www.trumphurst.com/cpplibs/cpplibs.phtml
 (日本語) http://www.kmonos.net/alang/cpp/lib.html

6 名前:v(^・^)v :04/02/29 01:24
■関連スレ■
[C++】template 統合スレ]
 http://pc2.2ch.net/test/read.cgi/tech/1066493064/l50
[ぼるじょあがC/C++の宿題を片づけますYO! 19代目]
http://pc2.2ch.net/test/read.cgi/tech/1073566342/l50
[初心者にVisual C++を教えるスレ★ Part9]
http://pc2.2ch.net/test/read.cgi/tech/1068983609/l50
[■ VisualC++(MFC限定)相談室 MFC10.dll■]
http://pc2.2ch.net/test/read.cgi/tech/1074104008/l50
[ATL 相談室]
 http://pc2.2ch.net/test/read.cgi/tech/1029029882/l50
[C/C++でのWindowsPrograming議論スレ(質問お断り)]
 http://pc2.2ch.net/test/read.cgi/tech/1049790146/l50
[COMの世界を斬る!]
 http://pc2.2ch.net/test/read.cgi/tech/981823340/l50
[managed C++ やろうぜ!!]
 http://pc2.2ch.net/test/read.cgi/tech/1014486422/l50
[C++Builder相談室 Part8]
http://pc2.2ch.net/test/read.cgi/tech/1070222674/l50
[タダで使えるBorland C++ Part3]
http://pc2.2ch.net/test/read.cgi/tech/1054390397/l50
[Borland C++ BuilderX]
 http://pc2.2ch.net/test/read.cgi/tech/1065260556/l50
[Code of the Nerds" Digital Mars C/C++]
 http://pc2.2ch.net/test/read.cgi/tech/1044210976/l50
[GCCについて part3]
http://pc2.2ch.net/test/read.cgi/tech/1072484422/l50
[OpenWatcom C++]
 http://pc2.2ch.net/test/read.cgi/tech/1033433728/l50
[タダで最強!フリーC/C++コンパイラ]
 http://pc2.2ch.net/test/read.cgi/tech/1035882599/l50

7 名前:デフォルトの名無しさん :04/02/29 01:25
こんなもんかにゃ〜
後何かあったら付け足してください。

8 名前:デフォルトの名無しさん :04/02/29 01:39
>>1
乙curry

9 名前:デフォルトの名無しさん :04/02/29 01:43
>>1
乙!

10 名前:デフォルトの名無しさん :04/02/29 03:21
すみません、質問させて下さい。
CDでのRAWに対応するものをDVDで引き出すコマンドってありますでしょうか。


11 名前:デフォルトの名無しさん :04/02/29 04:32
>>10
スレ違い

12 名前:デフォルトの名無しさん :04/02/29 05:17
STLつかうと一気に実行ファイルサイズが10倍に?!

13 名前:デフォルトの名無しさん :04/02/29 05:46
>>12
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。


14 名前:10 :04/02/29 05:47
>>11
大変すみませんでした。

15 名前:デフォルトの名無しさん :04/02/29 06:01
>>13
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。

16 名前:デフォルトの名無しさん :04/02/29 06:18
さすがに飽きたぞこの伝統芸能

17 名前:デフォルトの名無しさん :04/02/29 06:45
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいのでちゅか?

18 名前:デフォルトの名無しさん :04/02/29 08:01
>>18
(前略)(中略)(後略)

19 名前:デフォルトの名無しさん :04/02/29 08:21
そんなエサで俺様がクマ――!! (AA ry

20 名前:デフォルトの名無しさん :04/02/29 10:11
ム板の地鎮祭?

21 名前:デフォルトの名無しさん :04/02/29 11:28
iostream関連でおすすめの日本語サイトあったら教えて下さい

22 名前:デフォルトの名無しさん :04/02/29 12:38
>>21

海外サイトの翻訳だけど、iostreamだけでなくSTLのリファレンスもある。
ttp://www.shibu.jp:8080/cppreference/index.html



23 名前:デフォルトの名無しさん :04/02/29 12:52
>>1


24 名前:デフォルトの名無しさん :04/02/29 12:56
検索でたまにひっかかるRogue Waveのドキュメントはわりと参考になる。
WWWで公開されてていいものかどうかは知らんが。

25 名前:デフォルトの名無しさん :04/02/29 15:34
>>22
ttp://jbbs.shitaraba.com/bbs/read.cgi/computer/5651/1076858362/14
>引っ越しが完了したらttp://www.shibu.jp/cppreference/になります。

だそうです。

26 名前:デフォルトの名無しさん :04/02/29 16:30
前スレのレス数が1002って表示されてるんだけど、開いてみるとふつうに1001で終わってる。
これ、どういうこと?

27 名前:デフォルトの名無しさん :04/02/29 16:48
当方、以下のコードが通りません。どこが悪いかご指摘願います。
Metrowerks CodeWarrior 8.2 Pro for Winを使っております。

(hello.cpp)
class hoge
{
public:
    hoge();
    ~hoge();
private:
    struct impl* pimpl_;
};
struct hoge::impl{};
hoge::hoge() : pimpl_(new impl){}
hoge::~hoge(){delete pimpl_;}
int main()
{
    hoge hage;
    return 0;
}
(メッセージ)
エラー: 宣言シンタックスエラー
hello.cpp 行: 9 struct hoge::impl{};
エラー: 宣言シンタックスエラー
hello.cpp 行: 10 hoge::hoge() : pimpl_(new impl){}
警告: 不完全な struct/union/class 'impl' の使い方が不当です。
hello.cpp 行: 11 hoge::~hoge(){delete pimpl_;}

ちなみに
struct impl;
impl* pimpl_;
とあらかじめ宣言すれば通ります。

28 名前:デフォルトの名無しさん :04/02/29 17:16
>>27
'struct impl'の形はelaborated-type-specifierといって、でてくる文脈によって働きが微妙に異なる。
struct impl;
とかくと、そのスコープでimplが宣言され、
struct impl* pimpl_;
とかくと、「そのスコープを含む、最も内側の、非クラス、且つ、非関数宣言の」スコープ(この場合はグローバル名前空間)
でimplが宣言されたことになる。
詳しくは規格の3.3.1の5を参照すべし

29 名前:28 :04/02/29 17:28
訂正
誤:とかくと、そのスコープでimplが宣言され、
正:とかくと、その宣言を含むスコープでimplが宣言され、

誤:とかくと、「そのスコープを含む、最も内側の、...
正:とかくと、「その宣言を含む、最も内側の、...

30 名前:デフォルトの名無しさん :04/02/29 17:37
こんな怪しい仕様、根拠がさっぱりわかりません。

31 名前:26 :04/02/29 17:53
>>28
レスありがとうございます。ご指示のありました規格書を読みましたところ、
ご指摘の通り、この場合struct implはグローバル空間に宣言されていて、
struct hoge::impl〜のhoge::を削除することによってコンパイルすることが
できました。
しかしながら、一つの疑問が増えます。前掲のコードはExceptional C++(訳)の
Pimplイディオムに必要な部分だけを取り出してきたものと認識して
おります。私の認識がが間違っているのでしょうか。それとも前掲の
書籍のサンプルコードが間違っているのでしょうか。どなたか更にご指摘願います。

32 名前:31 :04/02/29 17:55
すいません、私は>>27でした。

33 名前:デフォルトの名無しさん :04/02/29 18:02
>>31
本は持ってないけど、
> struct hoge::impl{};
これを
struct impl{};
こうしてあった、とか?

34 名前:27 :04/02/29 18:12
>>33
少なくとも手持ちの本ではしっかりhoge::に当たる部分が書かれています。
(項目27に1回,30に2回)和訳の際の誤植とか…結構他にもありますし…

35 名前:デフォルトの名無しさん :04/02/29 18:58
>>34
項目27は「先行宣言してあるクラスへの」と書いてあるから
struct impl; は省略されていると解釈したほうがいいんじゃないだろうか。

しかし、項目30とか見ると、Sutterタンのサボりやね。

36 名前:デフォルトの名無しさん :04/02/29 20:14
質問おねがいします。
よくC++にはガベージコレクション(GC)がないのが欠点(?)
とか言われますが、自分的には数年C++を使ってきて
スマートポインタで十分なのですが、それでもGCが必要という
のには何か理由があるのでしょうか?


37 名前:デフォルトの名無しさん :04/02/29 20:29
すまぽすらろくに使えない人が多くてねぇ・・・

38 名前:デフォルトの名無しさん :04/02/29 20:36
STLもろくにかじらずに入門本だけ見てGC無いといってるか、
標準には使いづらいauto_ptrしかないからそのことをいってるんだと思われ。
shared_ptrとかそのうち標準になるんだろうね。

制御できないGCなんていくらあっても屑なんだが。


39 名前:デフォルトの名無しさん :04/02/29 20:41
参照カウント型のスマポぐらい C++ Templates 読んで自作しろ。

40 名前:27 :04/02/29 20:55
レスを下さった皆さん、ありがとうございました。恐らくご指摘の通り、
Sutterさんがサボったのだろうと思います。これからはきがねなく先行宣言
しようと思います。重ね重ねありがとうございました。

41 名前:21 :04/02/29 21:07
>>22
>>25
遅レスで申し訳ありませんが、ありがとうございます。

42 名前:デフォルトの名無しさん :04/02/29 23:14
>39
成熟させるのが面倒。

43 名前:36 :04/02/29 23:23
スマートポインタと書いておきながらstd::auto_ptrを
使っておりました(TT
もう一度勉強してきますです。
ありがとうございました。

44 名前:r :04/03/01 02:40
ガーベジコレクションがあったら、
スレッド間のデータの受け渡しが簡単になるよ。

45 名前:デフォルトの名無しさん :04/03/01 07:21
ハァ?

46 名前:デフォルトの名無しさん :04/03/01 07:32
>>44 そんな話聞いたことないので、詳細きぼん。

47 名前:デフォルトの名無しさん :04/03/01 10:41
>>45,46
データオブジェクトをのやり取りにキューを使用したてスレッド間通信する場合、
所有権があいまいになるからGCがあれば楽だといいたいのでは?
まあ、別にGCなくても実装簡単だけど。(それともJ*V*儲の戯言か?

>>36
ポイントされるオブジェクトの寿命によるんじゃないの?
リソースオブジェクトみたいに寿命が長ければ、smart_ptrで十分。
っていうかそういうものをGCにしてしまうとデストラクタがいつ走るか
わからんのでかえってよくないような気がする。
寿命が短く頻繁に生成・破棄を繰り返す場合には確かにGCあれば良いかも。
しかし、そういった状況は設計時に手を打てば回避可能だとおもうし。


48 名前:デフォルトの名無しさん :04/03/01 12:15
(・∀・)→(・∀・)
 ↑    ↓
(・∀・)←(・∀・)


アアアァァ━━━━━(ゞ゚Д゚)ゞ━━━━━!!!

49 名前:デフォルトの名無しさん :04/03/01 12:25
>>48
循環参照のことが言いたいのかね?

50 名前:デフォルトの名無しさん :04/03/01 13:01
C++ マニュアル
tp://www.cc.nao.ac.jp/fsunman/japanese/C++/

51 名前:デフォルトの名無しさん :04/03/01 13:28
in_availが両方とも0しか返さないのですがどうしてでしょうか。
また、in_availってどんな風に使うのでしょうか?

ifstream file("test.txt");
cout << file.rdbuf()->in_avail() << endl; ←こいつ
file.read(buf, M);
cout << file.rdbuf()->in_avail() << endl;

レスお願いします。

52 名前:デフォルトの名無しさん :04/03/01 13:28
52get

53 名前:デフォルトの名無しさん :04/03/01 13:39
ファイルの存在チェックを行うには、どんな手法がよいのでしょうか?
ifstreamを使って、エラーをチェックするのが一般的なのでしょうか?

54 名前:デフォルトの名無しさん :04/03/01 14:08
access(2)

55 名前:デフォルトの名無しさん :04/03/01 14:16
>>53
実行してエラーになったらファイルがない。

56 名前:デフォルトの名無しさん :04/03/01 16:35
VC++.NET2003なんですがネームマングリングが
日本語版と英語版で違ってたりしますか?
リンクでエラーが出るのでLIBの中身を見てみたところ
一文字だけ違ってました。
?関数名@クラス名@@QAEXI@Z

?関数名@クラス名@@QAEXK@Z
みたいな感じでI->KやH->Jみたいに
どこか一箇所がコード2つ分後ろにずれます。

ご教授よろしくお願いします。

57 名前:デフォルトの名無しさん :04/03/01 16:36
>>56
よく知らんけどスレ違いだろう。

58 名前:56 :04/03/01 16:57
スレ汚しすみませんVisualStudioスレの方に逝きます。

59 名前:27 :04/03/01 18:19
Sutterさん、項目37ではちゃんと先行宣言書いてるじゃないですか!…

60 名前:デフォルトの名無しさん :04/03/01 22:30
禿の本って全然初心者ようじゃないってことにやっと気づいた。

61 名前:デフォルトの名無しさん :04/03/01 23:08
>>53
boost::filesystem::exists

62 名前:デフォルトの名無しさん :04/03/02 00:28
>>51
test.txtは空じゃない?

ちなみにBCC5.6.4で14,278バイトのテキストを入力に取った
時の出力。

14278
3928

63 名前:デフォルトの名無しさん :04/03/02 07:45
このコード、GCCだとコンパイル通るのですが、
VC++6.0だとコンパイルできないのです。
通したいのでしがなにか技ないですか?

#include <iostream>
class A { public: int a1; char *p; int a2;};
class B {public: int b1; int b2;};
union C { A aa; B bb;};
C c = { aa:{ 1, "hoge", 2 } };
C d = { bb:{ 3, 4 } };
int main(){ std::cout<< c.bb.b2 << "\n"; return 0;}


64 名前:デフォルトの名無しさん :04/03/02 07:57
>>63
C99? 無理だと思う…

65 名前:デフォルトの名無しさん :04/03/02 08:16
最初のメンバ以外での初期化はまずできないだろうねえ。
どうしてもというのなら
独自拡張があるかどうかVCスレあたりで聞いてみては?

66 名前:デフォルトの名無しさん :04/03/02 10:29
>>63
>>65
サンクスです。
他で聞いてみます。

67 名前:デフォルトの名無しさん :04/03/03 22:23
ネタねーな。ぼるじょあスレで関数オブジェクトで苦しんでるヤシ
がいるからここに誘導するか?

68 名前:デフォルトの名無しさん :04/03/03 22:53
教えて君はイラネ

69 名前:デフォルトの名無しさん :04/03/03 23:05
まあ俺が三枚にあげてやらぁ

70 名前:デフォルトの名無しさん :04/03/03 23:34
(´-`).。oO(三枚には"開く"のではないだろうか…)

71 名前:デフォルトの名無しさん :04/03/03 23:41
おろすだよ

72 名前:デフォルトの名無しさん :04/03/04 00:06
>>69-71
ワロタ

73 名前:デフォルトの名無しさん :04/03/04 15:27
inline int foo(int a, int b) { return a * 100 + b; }
enum { VAL1=1, VAL2=2 }
int result = foo(VAL1, VAL2);

みたいに inline 関数の実引数が定数のとき、コンパイラが
a * 100 + b を定数式と認識してくれることを期待してもいいもんですか?

74 名前:デフォルトの名無しさん :04/03/04 15:43
>73
奇遇ですなぁ.漏れつい昨日これと同じことして遊んでたよ.
もっと複雑なことさせたけどね.
結論から言うと期待しても良い.
その例ではfooの呼び出しはリテラルの102に置き換えられることを期待できる.
ただし,どこまで深く定数の伝播を評価できるかはコンパイラ依存かと.

75 名前:デフォルトの名無しさん :04/03/04 15:47
>>73
期待できることもあるし、できないこともある。
コンパイラにアセンブリコードを吐かせてみたまえ。

76 名前:デフォルトの名無しさん :04/03/04 15:51
最適化の結果は多分定数になるだろうが、文法的に定数式である必要がある場所
(配列のサイズとか)には使えないんじゃないか?

77 名前:73 :04/03/04 15:59
>>74-75
大変さんくすです。マクロにしようか迷ってたんですが期待できることが
分かれば満足です。アセンブリの方は分からないので済みません、勉強
しときます

78 名前:73 :04/03/04 16:12
>>76
ごめんなさいリロード遅れました。確かに最適化で結果が
変わってしまうとなると無理かも知れませんね。

79 名前:デフォルトの名無しさん :04/03/04 16:35
そもそも inline 指定にコンパイラが従う義務はないからな。
どうしてもコンパイル時に評価して欲しければというのならテンプレート使って計算させろ

80 名前:デフォルトの名無しさん :04/03/05 00:22
アセンブリわかんないのに、はいたコードがどうと愚痴愚痴言うなよなー。

というか、その計算を何万回もやるんならともかく、
そこだけ取り上げてどういう風に最適化されるか考えるのは
どっちかというと無駄。初心者卒業あたりって、とにかくそうやって
一つ一つの命令を最適化しようとするけど、実際にはアルゴリズムとか
ループを見直した方がよい。20-80の法則ってやつ。

profiler使った結果、その関数の呼び出しがボトルネックだって
言うのが前提なら何も言わないけど。

ま、一番正解は>>76ってことで。



81 名前:デフォルトの名無しさん :04/03/05 01:17
pimplメソッドって、クラスをデフォルトのoperator=()を使って代入すると、pimplと
いうポインタがコピーされるのだから、privateメンバ変数の隠蔽に使いたい場合には
自分でoperator=()を定義する必要がありますよね?Exceptional C++にはそういう
記述は見当たらないのですが。

82 名前:デフォルトの名無しさん :04/03/05 01:30
てきとーなスマートポインタに放り込むほうが簡単。

83 名前:デフォルトの名無しさん :04/03/05 02:00
>>81

Effectiveならともかく、Exceptionalはそういうレベルは当然の話題として
わざわざ触れてないんだと思う。

>>82

smart_ptr使うのとoperator=のオーバロードはぜんぜん趣旨が違う。


84 名前:82 :04/03/05 02:06
> smart_ptr使うのとoperator=のオーバロードはぜんぜん趣旨が違う。

たとえば、
boost::scoped_ptr<impl> pimpl; // コピー禁止
boost::shared_ptr<impl> pimpl; // 参照カウンタ方式で共有
こんなふうにすると、operator=のオーバーロードは不要になると思ってる。

なんか間違ってる?

85 名前:デフォルトの名無しさん :04/03/05 02:55
コピー禁止は明示的に boost::noncopyableだな


86 名前:デフォルトの名無しさん :04/03/05 03:18
>>boost::shared_ptr<impl> pimpl; // 参照カウンタ方式で共有

「組み込み型のように振舞え」という原則にはずれている。
本当に共有していても動作に問題が無いとか、
ライト・オン・コピーしてくれてるんなら文句は無いが。

クラスライブラリとかで勝手にこんな実装されると混乱するのでやめてほしい。
デバッグの最中に「このクラスは代入されても実装部分は共有される」なんて
ドキュメントを見たらぶち切れると思う。



87 名前:デフォルトの名無しさん :04/03/05 06:51
沸点の低い奴だ

88 名前:デフォルトの名無しさん :04/03/05 10:25
みんなboostの使い方はどうやってマスターしてるの?
ソース読んでるとか?

89 名前:デフォルトの名無しさん :04/03/05 10:35
>>25
そのサイトすごくいい!

90 名前:デフォルトの名無しさん :04/03/05 10:38
とりあえずドキュメント読むだろ。不完全とはいえ邦訳もあるんだし。

91 名前:デフォルトの名無しさん :04/03/05 11:05
>>88
STL覚えるのと似たような感じ?
てーか、どうやっても糞もねーだろ。
使って覚える、これ最強。

92 名前:デフォルトの名無しさん :04/03/05 11:55
>>88
とりあえず
ttp://www.kmonos.net/alang/boost/
ここを眺めていれば使い方の概要はわかる

93 名前:デフォルトの名無しさん :04/03/05 22:26
for(i=0;i<array.size;i++)
{
  cout << array[i];
}

これをアルゴリズム(for_each ?)を使って書くには
どうしたらいいのでしょうか?

94 名前:デフォルトの名無しさん :04/03/05 22:33
>>93
#include <iterator>
copy( array.begin(), array.end(), ostream_iterator<T>(cout) );
Tはarrayの要素の型ね。

Boost使ってよければ
using boost::lambda;
for_each( array.begin(), array.end(), cout << _1 );

95 名前:デフォルトの名無しさん :04/03/05 22:39
>>94
試してみます。ありがとうございました。

96 名前:デフォルトの名無しさん :04/03/05 23:33
>>95
for_each以外に
vector<int> v;
copy(v.begin(),v.end(),ostream_iterator<int>(cout," "));

あとlambdaでの注意点。
using namespace std;using namespace boost::lambda;
for_each(v.begin(),v.end(),cout << _1 <<" ");//これは動く
/*これは動かない、少なくともbasic_ostream<char,char_traits<char> > & endl(basic_ostream<char,char_traits<char> > &)と
basic_ostream<wchar_t,char_traits<wchar_t> > & endl(basic_ostream<wchar_t,char_traits<wchar_t> > &)があるので。
*/
for_each(v.begin(),v.end(),cout << _1 << endl);


97 名前:デフォルトの名無しさん :04/03/06 00:01
Boostの「使って覚える」ような本が出れば売れると思う。

98 名前:デフォルトの名無しさん :04/03/06 00:09
for_each( array.begin(), array.end(), cout << _1 );

この衝撃的なコードがなぜ動くのかも疑問だけど、なにがどうlambdaなのかがもっと疑問
λってナニを意味してるの?

99 名前:デフォルトの名無しさん :04/03/06 00:44
関数

100 名前:デフォルトの名無しさん :04/03/06 01:11
λは ひと と ひと とが支え合ってできています

101 名前:デフォルトの名無しさん :04/03/06 01:19
一瞬、ランバダって読んだよ(w
若い人は知らんか

102 名前:デフォルトの名無しさん :04/03/06 01:55
腰の辺りがむずむずしてくる。

103 名前:デフォルトの名無しさん :04/03/06 02:12
>98
http://www.boost.org/libs/spirit/doc/phoenix.html
ここの下あたりに書いてある.っていうかlambda(;´Д`)ハァハァ

http://www.boost.org/libs/spirit/doc/subrules.html
ここでtypeofやautoキーワードが( ゚д゚)ホスィ…って愚痴ってるけど
確かにこういうの漏れも( ゚д゚)ホスィ…(何に使うかはとりあえずおいといてw)
でもexpression templateの多用って実行コードを
爆発的に肥大化させるように思えるんだが,連中は気にしてないんだろうか?

104 名前:デフォルトの名無しさん :04/03/06 02:15
ってことはオレも若くないのか。

105 名前:103 :04/03/06 02:15
あ,ごめん.templateスレだとばっかり思ってた.下半分は無視してちょ.

106 名前:デフォルトの名無しさん :04/03/06 02:26
>>105
もはや実行コードのサイズなんて問題にはなりませぬ。
むしろコンパイラ側の最適化に一任した形となっているのでは。
コンパイラ技術はまだまだこれからだけど。
コードサイズ要求のシビアな分野では普通にCを使うだろうし。
なんでも適材適所かと。

107 名前:デフォルトの名無しさん :04/03/06 02:36
> でもexpression templateの多用って実行コードを
> 爆発的に肥大化させるように思えるんだが,
確かに typeof / auto がないと途中でExpression Templateを
virtual関数に分断せざるを得ないのでその分コード量が
増えるんだがしかし、

逆に言えばtypeofやautoや型推論があれば、むしろETによって
最適コードだけが出力されるので、実行コード量は減る方向に
行くんじゃないかと思う。例えば型情報を全部手書きで頑張ると、
 http://www.boost.org/libs/spirit/doc/techniques.html
 の no_rule3.cpp
くらいにはすぐに落ちるわけで。

108 名前:103 :04/03/06 03:16
>>107
ぎゃーす!そのページ読み落としてた.ありがとう.
っていうか,すでにそのレベルの文法でも,頑張ってらっしゃる
no_rule3.cppのtypedefがやばいことになってるんですがw
やっぱauto( ゚д゚)ホスィ…
再帰的なBNFだと連中はどうするつもりなんでしょうかねぇ・・・
(仮想関数に逃げるしかなさそうな・・・)


109 名前:107 :04/03/06 08:42
>>108
> no_rule3.cppのtypedefがやばいことになってるんですがw
禿同w

再帰的BNFは、やるとすればBoostのVariantみたいな
recursive_wrapper か、コンパイラの発展を期待して
特大subruleで頑張るか…。微妙だけどな。

110 名前:デフォルトの名無しさん :04/03/06 10:16
std::for_each(text.begin(), text.end(), std::cout << boost::lambda::_1 << ' ');
これの最後に改行文字を入れる一つの式を作ることはできますか?

111 名前:デフォルトの名無しさん :04/03/06 10:40
複文を関数化すればいくらでもできるが
たぶん君の期待してるようなものは無理。

112 名前:デフォルトの名無しさん :04/03/06 14:34
std::endlが多用されてるようですが、なぜでしょうか?
出力ストリームのフラッシュは必要ない場合がほとんどだと思うのですが。

113 名前:デフォルトの名無しさん :04/03/06 17:43
>>112
その通り。'\n' と同じ効果を期待するなら '\n' で十分。
std::endl; が多用されているのは '\n' より美しく見えるという
理由だけのような気がする。

114 名前:デフォルトの名無しさん :04/03/06 18:47
>>112
出力先が常にstd::coutと仮定できればね

115 名前:デフォルトの名無しさん :04/03/06 18:52
>>112
改行コードに関する環境差は今でこそ大所では何とか辻褄あわせしているようだけど
根本的に「ヤバい状況」であることには間違いなかんべ
本格的に破綻するまで待たずに予防策を打っておく案にはおいら賛成だ

116 名前:デフォルトの名無しさん :04/03/06 19:03
cout << "HELLO " << "WORLD!" << endl;
これの意味がわかりません。Operator Overloadをどう活用すれば
こういった記述ができるようになるんでしょうか?

117 名前:デフォルトの名無しさん :04/03/06 19:24
>>116
今回の例では
A << B は
ストリームの A と文字列の B を取って戻り値として A を返す左結合の演算子

つまり
((cout << "HELLO ") << "WORLD!") << endl;
(cout << "WORLD!") << endl;
cout << endl;
cout;
と計算が進んでいく

118 名前:デフォルトの名無しさん :04/03/06 19:29
>>116
どの部分がわからんのかちゃんと書いてくれ。よけいな手間がかかる。
文字列リテラルはchar*に対するoperator<<のオーバーロード、
マニピュレータは関数ポインタに対するオーバーロードを用いている。
繰り返し適用できるのはどれも演算後に自分自身(この場合cout)をreturnしてるから。

#マニピュレータはメンバでなくフリー関数だったかもしれない。が、本質には関係ない

119 名前:デフォルトの名無しさん :04/03/06 19:52
>103
多謝。初めて知った↓
The reason this is called a lambda expression is that traditionally,
such placeholders are written using the Greek letter lambda λ.



120 名前:デフォルトの名無しさん :04/03/06 19:55
「ラムダ計算」とか「lambda calculus」でぐぐってみ。


121 名前:デフォルトの名無しさん :04/03/06 20:03
>>116

coutのoperator<<の引数としてそれ以降のやつを取る、といえば分かるか?

122 名前:デフォルトの名無しさん :04/03/07 00:38
(c +_+) < C++だけど何か質問ある?

123 名前:デフォルトの名無しさん :04/03/07 00:50
>>122
C++を使うと禿げるってホントですか?

124 名前:デフォルトの名無しさん :04/03/07 09:06
C++作ったやつはC++作ったせいで禿げたそうだ。

125 名前:デフォルトの名無しさん :04/03/07 09:29
あれだけ奇天烈で頭痛くなるもの作りゃ、禿げもしようというものだ。


126 名前:デフォルトの名無しさん :04/03/07 13:54
MACアドレスを取るのはどういう方法があるのでしょうか?

127 名前:デフォルトの名無しさん :04/03/07 14:07
そう、マックね、マック。

128 名前:デフォルトの名無しさん :04/03/07 16:18
>>126
どこのMACアドレスかわからんし処理系依存。

129 名前:デフォルトの名無しさん :04/03/07 17:39
>>117-118,>>121 どうもありがとうござます。
/usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.2/include/g++-v3/
の下を眺めているんですが、coutの定義されてる場所が見つかりません…

130 名前:デフォルトの名無しさん :04/03/07 17:42
あ、書き込んだ後に見つけたんですが、
/usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.2/include/g++-v3/iostream に

extern istream cin;///< Linked to standard input
extern ostream cout;///< Linked to standard output
extern ostream cerr;///< Linked to standard error (unbuffered)
extern ostream clog;///< Linked to standard error (buffered)
#ifdef _GLIBCPP_USE_WCHAR_T
extern wistream wcin;///< Linked to standard input
extern wostream wcout;///< Linked to standard output
extern wostream wcerr;///< Linked to standard error (unbuffered)
extern wostream wclog;///< Linked to standard error (buffered)
#endif

という記述がありました。どうもすみませんでした。

131 名前:デフォルトの名無しさん :04/03/07 17:56
>>130
演算子オーバーロード以前にC++の基本的な部分の勉強が足りな過ぎ。
処理系のソースを漁るのもいいが
標準ライブラリの体系だった説明とコード例の載った本を読め。

132 名前:デフォルトの名無しさん :04/03/07 18:02
>>131
どういうことだ?
俺には>>130が妙なことを言っているようには思えないが。

133 名前:デフォルトの名無しさん :04/03/07 18:06
おりはprintfの引数の ...) よりは operator << の方がわかりやすかったな。


134 名前:デフォルトの名無しさん :04/03/07 18:12
>>132
ん?
cout の定義場所もわからないでいるのに
演算子オーバーロードの利用もないだろうってこと。
無論学習順序はそれぞれだろうが、
その目的のためにも標準ライブラリは参考になるところが多いはずだしな。


135 名前:デフォルトの名無しさん :04/03/07 18:16
<iostream>を#includeすればcoutが使えることがわかれば十分だろうが。
細かい実装の詳細なんてどうでもいい。


136 名前:デフォルトの名無しさん :04/03/07 18:18
大元の>>116の質問を読んで言っているのか……?
お前の個人的な意見だと言うのなら勝手だが


137 名前:デフォルトの名無しさん :04/03/07 18:19
>>135
>>116を読め

138 名前:デフォルトの名無しさん :04/03/07 18:19
>>134
なるほど、そういうことか。

まあ、俺はcoutの定義場所(おそらくスタティックライブラリの中)を知ることが
重要なことだとは思わんが。

139 名前:デフォルトの名無しさん :04/03/07 18:20
面白いコピペを見つけたので、皆さんの手でこのカーチャンが言ってる事をもっと凄くしてやれませんか?

J( 'ー`)し たかしへ 最近C++勉強してるのでウィルス添付してみました 開くと自動実行するからね

(`Д)   OSごと消えたウィルス送るな殺すぞ

J( 'ー`)し ごめんね。おかあさん始めてウィルス作って見たから、ごめんね

(`Д)   うるさいくたばれ、しかも俺から世界中にウィルス発信されてるじゃねーか

J( 'ー`)し ニューヨークも全体落ちたみたいです 食事はしてますか?

(`Д)   もうおなかいっぱいです

140 名前:デフォルトの名無しさん :04/03/07 18:22
J( 'ー`)し たかしへ 最近.NET勉強してるのでウィルス添付してみました 開くと自動実行するからね

(`Д)   OSごと消えたウィルス送るな殺すぞ

J( 'ー`)し ごめんね。おかあさん始めてウィルス作って見たから、ごめんね

(`Д)   うるさいくたばれ、しかも俺から世界中にウィルス発信されてるじゃねーか

J( 'ー`)し ニューヨークも全体落ちたみたいです 食事はしてますか?

(`Д)   もうおなかいっぱいです

141 名前:デフォルトの名無しさん :04/03/07 19:19
なんだかお騒がせして申し訳ないです。coutがなんなのかは分りました。

### gcc/libstdc++-v3/src/globals_io.cc ###
typedef char fake_ostream[sizeof(ostream)]
__attribute__ ((aligned(__alignof__(ostream))));
fake_istream cin;
fake_ostream cout;

### gcc/libstdc++-v3/src/ios_init.cc ###
extern istream cin;
extern ostream cout;
・・・
ios_base::Init::Init()
{
・・・
new (&cout) ostream(&buf_cout_sync);
new (&cin) istream(&buf_cin_sync);
new (&cerr) ostream(&buf_cerr_sync);
new (&clog) ostream(&buf_cerr_sync);
・・・

しかしostreamの定義場所がどうしても見つけられません…

142 名前:デフォルトの名無しさん :04/03/07 19:35
だから不自由な調べ方しとらんで
標準ライブラリの体系だった本読めと言っているのに……急がば回れだよ。
ostream は basic_ostream の typedef。
ostream の中で定義されているはず(宣言だけなら ios_fwd にもあるが)。

http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/classstd_1_1basic__ostream.html

143 名前:デフォルトの名無しさん :04/03/07 20:00
>>142
/usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.2/include/g++-v3/iosfwd
(iostrem → ostream → ios → iosfwd という順序でインクルード)
ここに
namespace std {
・・・
typedef basic_xxx<char> xxx;
typedef basic_xxx<wchar_t> wxxx;
・・・
という風にIO関連の型定義がいくつかありました。どうもお騒がせしました。

144 名前:デフォルトの名無しさん :04/03/07 20:24
C++のmain前の初期化順序の問題なんだけど

int i=0;
struct A {
 A() {i=1;}
 static A & a() {
  static A a;
  return a;
 }
 private: static A * ap; // (*)
};
A * A::ap=&A::a(); // (*)

int main() {
 A & ap=A::a(); // (**)
 return 0;
}

(*)の部分がない場合は(**)の呼び出し前後でiの値が
変わることになる。(*)の部分があるとmainの呼び出し前に
A::a()の呼び出しが行われているみたいだけど、
これってC++の仕様的に保証されているのでしょうか?
Singletonのインスタンスにmain前にアクセス可能にする場合
上みたいに実装すること思うけど、スレッド安全性の確保の
為に、main前にはA::a()が呼び出されていて欲しくてこんな風に
してみた。まあ、mainの先頭で手動で呼び出してもいいんだけど。
apに誰もアクセスしないので最適化で消えちゃうかなあ?

145 名前:デフォルトの名無しさん :04/03/07 20:34
グローバルオブジェクトはプロセス開始時(mainの前)に初期化される。
ただ依存関係を持つ複数のオブジェクトがあったりすると話がややこしくなるけど。

146 名前:145 :04/03/07 20:42
グローバルじゃないね。スタティックだ。

ただポインタ ap はクラス変数じゃなくて
ふつうのグローバル変数として定義するべき。
翻訳単位の異なるスタティックオブジェクトの初期化順序に関する規定はないんで
そういう場所で定義するのはよろしくない。

147 名前:145 :04/03/07 20:47
あー、まだ誤解を与えそうだ。
ローカル(関数内部)のスタティックオブジェクトの初期化は
その関数を最初に呼び出したときに行われるんで、
a() の呼び出しそのものを省いたりはしないで。

ついでにグローバルの ap もポインタじゃなくて参照でいいよね。何で織り交ぜてるのか知らないけど。

無駄レススマソ。

148 名前:デフォルトの名無しさん :04/03/07 20:48
main()突入前/脱出後にアレコレするのは、はっきり言ってすすめられない。
たとえば、DLL化とか言い出した日にはもう目も当てらんない。

149 名前:デフォルトの名無しさん :04/03/07 20:56
>>148
俺もそう思う。
サボりの美学と非科学的な神頼みの境がわかってないヴォケ大杉。

150 名前:デフォルトの名無しさん :04/03/07 21:07
こういうのって見てたりしますか?
http://www.codesourcery.com/cxx-abi/

151 名前:144 :04/03/07 22:54
>>145
>何で織り交ぜてるのか知らないけど。
A * A::ap=&A::a();
とすることによりのapの初期化の為にA::a()がmain前に
必ず呼ばれる事を期待しているって意図は伝わってる?
apをprivateなクラス変数にしたのは、main前には
apがいつ初期化されるか未定だから、誰もapにアクセス
できないようにしただけです。

>>148
(Winの)DLLにしてもプロセスのアタッチ時にグローバル変数は
初期化されるんじゃないの?

>>150
私に対するレスですか?

152 名前:デフォルトの名無しさん :04/03/07 23:28
まあ一度痛い目にあうのもいいかもしれん。
そうしてヒトは成長するのさ〜

153 名前:デフォルトの名無しさん :04/03/07 23:40
>>152
本人が痛い目にあうならいいんだけどさ

154 名前:デフォルトの名無しさん :04/03/07 23:41
変ちくりんな実装が必要になる時点で
多くの場合は設計に問題があるんだけどね


155 名前:デフォルトの名無しさん :04/03/07 23:53
>>154
ここ一発ふんばらにゃならんときに
ふとよぎる悪魔のささやきだな

156 名前:デフォルトの名無しさん :04/03/07 23:57
>>151
そっちよりも↓のが重要。
>ap はクラス変数じゃなくてふつうのグローバル変数として定義するべき

まあ今回の件に関してのみ言えばどちらでもよいことなんだが
ふつうは(というかそのクラスを再利用するつもりがあるのなら)
初期化は最終的にはクライアントのコードで指示する。
簡単に説明するなら、
初期化の順序や必要なパラメータの指定はプログラムの全体像を知らないと記述できないから。
まあもっと頭の痛くなる問題もあってそっちのが重要なんだけど。

#つーかモジュールでオブジェクトの生成までやってしまうのなら Singleton の意味ないし。
#たいたいコンストラクタが引数持ってたらどうするつもりだ?

何度も言うが、今回のプログラムでしかそのクラスを利用しないというのなら別にどちらでもいい。

157 名前:144 :04/03/08 00:39
>>156
クラス変数でもグローバルでもどっちでもいいです。
どうせアクセスしないし。

>初期化の順序や必要なパラメータの指定はプログラムの全体像を知らないと記述できないから。
Singletnoの問題はむしろ破棄の順番では?勿論、ファイルやドライバのハンドル等の
場合にはまずいかもしれないけど。少なくともそういったリソースの管理クラスに
当てはめ様とは考えていません。

>#つーかモジュールでオブジェクトの生成までやってしまうのなら Singleton の意味ないし。
んー、そうですか?ちょっと言い過ぎなような気がするけど。


158 名前:デフォルトの名無しさん :04/03/08 01:14
>>144
雑談がしたいのか、仕様が知りたいのか、はっきりしる。

159 名前:デフォルトの名無しさん :04/03/08 01:24
ファイルの依存関係を最小限にするには pimpl イディオムやらなんやら
ありますが、実際にやってみると非常に面倒くさいと感じます。皆さんは
そのへんどう解決してますか?気にせずがんがん再コンパイルですか?
それとも、ちゃんと設計してからコード書けやごるぁ!!!って感じですか?

160 名前:デフォルトの名無しさん :04/03/08 01:27
ファイルの依存関係よりも、
クラスやコンポーネントの依存関係を気にするべき。
コンパイル時間なんて気にスンナ。
あ、gccをご利用?そりゃごめんなさい。

161 名前:デフォルトの名無しさん :04/03/08 01:32
pimpl使え。

162 名前:デフォルトの名無しさん :04/03/08 01:37
>>160
気にしたくないよ
気にしたくないんだよおおお
んなこと言ったって・・・(泣

163 名前:144 :04/03/08 01:38
>>158
別に雑談したかったわけじゃないんだけど。

・・・main前にあれこれするなつう事で納得しました。
ありがとうございました。

164 名前:デフォルトの名無しさん :04/03/08 02:22
漏れはファイルの依存関係も気にする。
コピペで再利用するわけじゃないし。

165 名前:デフォルトの名無しさん :04/03/08 04:05
あんただけならどうでもいいよ。

166 名前:デフォルトの名無しさん :04/03/08 06:21
>151
>147の織り交ぜるってのは
A & A::ap=A::a();
何故こうしない?と言うことでは。

しかし、普通に、一番最初のstatic A & a();呼び出しで初期化すればええやん、と思うのだが。


pimplは、めんどくさくは無いけど、
小さいオブジェクトにnewは何となく嫌症候群だからなぁ。

167 名前:デフォルトの名無しさん :04/03/08 12:13
説明不足だったので再び
MACアドレスを取るのはどういう方法があるのでしょうか?
IPのMACで例えばWindowsなどの処理系です
ipconfig.exeを使う方法があるのですがバージョンなどの問題などありますから

168 名前:デフォルトの名無しさん :04/03/08 12:20
>>167
IPにはMACアドレスという概念はありません。
Windowsは処理系ではありません。

169 名前:デフォルトの名無しさん :04/03/08 14:20
網かarp掬え。
物事を正しく把握し、説明する練習をしてからまたもどってこい。


170 名前:デフォルトの名無しさん :04/03/08 14:22
頻繁に構築・解体するコンテナ(例えばループ内の一時変数など)は、
ヒープの分断化を招きますか?
やはりループ外で事前に定義しておくか、自前でアロケータを書くべきでしょうか?
ちなみにalloca()などを使ってスタック上にアロケートするアロケータを書くことは
この場合妥当な選択でしょうか?


171 名前:デフォルトの名無しさん :04/03/08 14:23
socketのテンプレートライブラリを作成するっていう
話はどこにいったの?

172 名前:デフォルトの名無しさん :04/03/08 14:57
boost-sandbox/boost/socketも放置されてるっぽいし

173 名前:デフォルトの名無しさん :04/03/08 21:52
#include <iostream>
#include <ctime>
using namespace std;

int main()
{
std::time_t systime = std::time(0);
std::tm *cur = std::localtime(&systime);

cout << systime;
}

上のようなプログラムを実行すると1078750166と表示されるのですが、
これを2004/3/XX XX:XX というようにするにはどうすれば?

174 名前:デフォルトの名無しさん :04/03/08 22:14
curが持ってる値を使っていろいろ頑張ってください

てかC++じゃなくてCの話題だねそれ

175 名前:デフォルトの名無しさん :04/03/08 22:16
std::asctimeとかstrftimeとか

176 名前:デフォルトの名無しさん :04/03/08 22:17
asctimeないしctime
本当にそのフォーマットじゃなきゃいけないのならstrftime
あとはリファレンス見てくれ

177 名前:173 :04/03/08 22:40
>>174-176
お答えサンクス。
てぇことはですよ、プログラム中で時刻を使いたい場合は
その文字列から時分秒を求める必要があるンすか?

178 名前:こんぴゅー :04/03/08 22:40
1) 3;
2)  a=3;
3)   d;  注:この直前の文はchar d[10];
4)  ((a=3)>2 || (b=0)<-1);
5)  "abcdefg";
6)  printf("%s",string="abcdef");  注:変数stringは文字型へのポインタ変数
各式の評価値を教えてください(理由もお願いします)

179 名前:デフォルトの名無しさん :04/03/08 22:41
>>177
お前が使っているstd::localtimeはいったいなんなのかと(ry

180 名前:173 :04/03/08 22:43
ある人に質問したら、答えがこれだったんですよ。
じゃあ、どうすれば良いですか?

181 名前:デフォルトの名無しさん :04/03/08 22:53
>>180
だから>>175->>176の関数を今すぐ調べろ。

182 名前:デフォルトの名無しさん :04/03/08 22:54
Cのスーパーセットを目指していたとはいえ、
Cの標準関数は別の名前空間にしておくべきではなかったか。

183 名前:デフォルトの名無しさん :04/03/08 22:58
>>180
localtime の引数は何なのか調べればよろしいかと。

184 名前:ルージン :04/03/08 23:10
もまいら変態、いやもとい大変です!!
templateスレで聞こうと思ったのですが下がっているので
ここに来ますた。

class CTest
{
public:
void f() const
{
g();
}
void g(){}
};

このコードはもちろん通らないのですが
このクラスをtemplateにするとconstのチェック
が効かなくてコンパイルできてしまいます。
なんでですか?

185 名前:デフォルトの名無しさん :04/03/08 23:17
>>184
クラスtemplateのメンバ関数は、必要になるまで定義が実体化されないから。
たぶん、コンパイルできてるソースからは f() の呼び出しがないんでしょう。

186 名前:デフォルトの名無しさん :04/03/08 23:17
>>184
実体化されていないから。

187 名前:ルージン :04/03/08 23:20
そうですた。ありがとうございますた。

188 名前:デフォルトの名無しさん :04/03/08 23:20
>>171 ttp://www.crystalclearsoftware.com/cgi-bin/boost_wiki/wiki.pl?BoostSocket

189 名前:デフォルトの名無しさん :04/03/08 23:24
>>170
> 頻繁に構築・解体するコンテナ(例えばループ内の一時変数など)は、 ヒープの分断化を招きますか?

情報足らなさ過ぎ。実測するのが一番。
実測する方法もわからないのなら、そもそも断片化を気にしてもしょうがないし。

190 名前:デフォルトの名無しさん :04/03/09 08:11
スタックについてなんですが、大きなサイズのオブジェクトの
配列とかをローカルで宣言するとスタックの浪費になるのでしょうか?
ポインタの配列を宣言して、オブジェクト自体はヒープに
作ったほうがいいのでしょうか?

191 名前:デフォルトの名無しさん :04/03/09 09:32
>>190
うん

192 名前:デフォルトの名無しさん :04/03/09 12:38
まずはアセンブラやったほうがいいよ

193 名前:190 :04/03/09 12:49
スタックもヒープも同じメモリなのでどちらを使っても
メモリの使用量は同じだと思うのですが、スタックというのは
一定の予約された領域なので、大きなオブジェクトをバシバシ
作ってもいいのかと思いまして。(スタックオーバフローとか
いうのもあるといいますし...)

194 名前:デフォルトの名無しさん :04/03/09 12:56
細かいことは環境やプログラムの他の部分に依存するが
あまりに大きいオブジェクトの配列はスタック上よりヒープに作った方がとりあえず無難。
それよりその用途ならポインタの配列じゃなくて
ふつうにオブジェクトの配列を動的に作成すればいいんじゃないの?
あとでオブジェクトを一個一個受け渡すのならともかく。

195 名前:190 :04/03/09 13:24
>>194
そうでした。ポインタの配列である必要はないですね。
ありがとうございました。。。

196 名前:デフォルトの名無しさん :04/03/09 13:48
placement newについて教えて
いただきたいのですが、これってただ
コンストラクタを呼んでくれるだけですよね。
であれば
new ((void*)pObj) CWidget;
なんてせずに単に
pObj::CWidget();
としたらいいのになんでわざわざplacement new
という構文が必要なのでしょうか?
実際deleteにはplacement delete(?)みたいな
ものはなくて
pObj::~CWidget();
と書いているのをよく見ますが...

197 名前:デフォルトの名無しさん :04/03/09 14:21
>>196
そのpObjってのが何なのかわからん。
ともかく placement new ってのは
引数で与えられた領域にオブジェクトを生成するためのものだ。
コンストラクタを呼び出すだけってのは見当違い。

198 名前:196 :04/03/09 14:49
pObjというのはCWidget型のポインタです。
すでに確保されたメモリ上の位置をさしています。

>コンストラクタを呼び出すだけってのは見当違い。
ほかにはどんな作業があるのでしょうか?

199 名前:デフォルトの名無しさん :04/03/09 14:57
>pObj::CWidget();
>pObj::~CWidget();
>pObjというのはCWidget型のポインタです。
出典はしらんがこんなコード例が載ってるものを信用するな。

>ほかにはどんな作業があるのでしょうか?
注目してるのはオブジェクトを生成する領域だって言ってるだろ。
つーか通常のインスタンス宣言と new や placement new との違いを本当にわかってるのか?

200 名前:デフォルトの名無しさん :04/03/09 15:17
俺も疑問だ。


class AAA
{
AAA() {}
~AAA() {}
};

charbuf[sizeof(AAA)];
AAA*pa = new(buf) AAA;
pa->~AAA();

pa->AAA::AAA();
pa->~AAA();


どっちも同じように走るんだが、何が違うんだろうな?
と書いてて思ったんだが、クラスAAAにplacement newがあったら後者はまずいな。

201 名前:196 :04/03/09 15:17
>>199
ありがとうございました。
もう一度出直してきます。

202 名前:デフォルトの名無しさん :04/03/09 15:29
コンストラクタには名前がないから、
標準C++ではその様に直接は呼べないだろう。

203 名前:デフォルトの名無しさん :04/03/09 15:30
そんなわかりにくいか? それともそういう局面自体が想像外なのか?
あるオブジェクトを”割り当て済みのメモリ領域に”生成したいときに使うのが placement new だ。
コンストラクタやデストラクタの振る舞いなんかは二の次。
詳しいことは More Effective C++ の第8項を読むといい。

204 名前:デフォルトの名無しさん :04/03/09 15:33
placement newならキャストしなくてもいいとか

205 名前:デフォルトの名無しさん :04/03/09 15:34
>pObj::CWidget();
>pObj::~CWidget();
>pObjというのはCWidget型のポインタです。
っていうかこれ、コンパイル通るの?

206 名前:202 :04/03/09 15:34
だから(標準C++に従うならば)placement newを使うしかない。と思われる

207 名前:デフォルトの名無しさん :04/03/09 16:17
コンストラクタ中からコンストラクタを呼び出しても、一時オブジェクト
が作成されるだけで、呼び出しが終わると消滅してしまう。だから
placement newを使うか、コンストラクタを呼び出した結果を*thisに
代入しなければならない。

#include <iostream>

class sample_class
{
public:
 int value;
  sample_class(int i) {
  value = i;
  std::cout << "Ctor(int) called\n";
 }
 sample_class() {
  sample_class(10); // ダメダメ
//  new (this) sample_class(10);
//  *this = sample_class(10);
std::cout << "Ctor() called\n";
 }
  ~sample_class() {
  std::cout << "Dtor() called\n";
 }
};

int main()
{
 sample_class a;
 std::cout << a.value << std::endl;
}

208 名前:デフォルトの名無しさん :04/03/09 16:20
もしコンストラクタが動的にヒープを確保するようなものだと、
コンストラクタからコンストラクタを呼び出して放置すると
メモリリークが起きてしまう。

209 名前:デフォルトの名無しさん :04/03/09 16:21
>>208
ちごた、これは間違い。デストラクタが正しく書かれていれば一時
オブジェクトの消滅時にデストラクタが呼ばれる。

210 名前:デフォルトの名無しさん :04/03/09 16:39
void *operator new(size_t, void *place)

みたいなやつはあくまでデフォルトの定義。
それはそれで有用ですけど。

placement な operator new は、
例えばこんな風にオーバーロードして、
どこからメモリを確保するかをコントロールしたりとか
けっこういろんなことに使える。

void* operator new(size_t n, Allocator& a)
{
return a.alloc(n);
}


211 名前:デフォルトの名無しさん :04/03/09 16:58
placement delete の構文がないのは明らかな欠陥だよな

212 名前:デフォルトの名無しさん :04/03/09 17:00
なんで?通常のnewと同じように扱えますよ、って考えれば
別になくてもおかしくないじゃん。

213 名前:196 :04/03/09 17:02
すいませんTT
今さらなのですが、間違っていました

× pObj::CWidget();
○ pObj->CWidget();

× pObj::~CWidget();
○ pObj->~CWidget();


214 名前:デフォルトの名無しさん :04/03/09 17:05
>>212
言っていることが良くわからない。漏れが言いたかったのは、
    foo *p = new foo;
    delete p;
とやるなら、
    foo *p = new(buf) foo;
    delete(static_cast<void *>(0)) p;
とか、
    foo *p = new(myalloc) foo;
    delete(myalloc) p;
みたいにできた方が自然じゃないか、ってこと。

215 名前:デフォルトの名無しさん :04/03/09 17:14
漏れもそれやりたい。

216 名前:デフォルトの名無しさん :04/03/09 17:29
その引数は一体何に使われるんだ?
形だけ見て物を言うと引数つきのデストラクタがないのは不自然みたいな話になるわけだが。

217 名前:デフォルトの名無しさん :04/03/09 17:40
>>216
void operator delete(void *, void *) {}
void operator delete(void *p, Allocator &a)
{
    a.dealloc(p);
}
こんな感じで使えばいいと思う。

218 名前:デフォルトの名無しさん :04/03/09 17:40
デストラクタじゃなくて delete だべ。
new はコンストラクタじゃないし、delete はデストラクタじゃないよ。

219 名前:デフォルトの名無しさん :04/03/09 17:51
確かにplacement newにつきまとう、デストラクタ直呼び出しはカッコ悪いな。

220 名前:デフォルトの名無しさん :04/03/09 17:56
そうじゃなくて、
初期化は外部からパラメータ与えてカスタムできる必要があるけど
破棄は(必要なら内部でパラメータを保持していて)
外部からの指定なしにできるべきだという理屈。

そうでないと初期化のパターンすべてについて
破棄を命ずる側がよく知っていなくてはいけなくなるだろ。
この厄介さを考えれば初期化に対する破棄時の仮定は成り立ってもらわんと困る。
#STLのアロケータと同じ類の問題かな

221 名前:デフォルトの名無しさん :04/03/09 18:21
>>220
オブジェクトごとに破棄方法を記録するってこと?
それはそれで意味があるかもしれないが、記法の問題を越えるよな。
それに、C++がデフォでその方法を採用するとは思えないから、
(単純なデストラクタ呼び出しに仮想関数呼び出しを付随させるわけにはいかない)
どちらにしてもdeleteと書くたびに、そのメカニズムを使うかどうかを選択せねばならんし。

222 名前:デフォルトの名無しさん :04/03/09 18:31
いや、そうじゃなくて。
要するに、
単一の破棄手段と多様な初期化手段の両方を実現するには
どの初期化方法に対しても単一の方法で破棄できるようにするか、
それが嫌ならオブジェクト内部に何らかの形で必要な情報を記録するか
どちらかを選ぶしかないってことよ。

>deleteと書くたびに、そのメカニズムを使うかどうかを選択せねばならんし
これこそ引数つきの delete に対して>>220で指摘した問題なんだけど……
実際現行のC++はそんなものをサポートしていないわけで

223 名前:デフォルトの名無しさん :04/03/09 18:40
>>222
どうも話がかみ合っていないと思ったら・・・

>単一の破棄手段と多様な初期化手段の両方を実現するには
>>214は多様な「確保手段」と「開放手段」に似た見た目を与えようとしているのであって、
初期化・破棄についていっているのではない。

224 名前:デフォルトの名無しさん :04/03/09 18:45
開放しちゃうのか?

225 名前:デフォルトの名無しさん :04/03/09 19:22
>>223
確保・解放も含めての話のつもりだったんだけどなあ……。
多様な確保手段に”対応する”多様な解放手段を
常に考慮しなければいけなくなる状況に問題があることはわかってる?
特に解放側から確保側への依存関係を持ち込みたくない状況で。

独自のフレームワークで拡張するのは構わないが、
言語仕様にそんな厄介なものを持ち込まれてはたまらない。

226 名前:デフォルトの名無しさん :04/03/09 20:01
>>225
じゃあ、
foo *a = new foo; /* ヒープ */
foo *b = new(buf) foo; /* スタック */
foo *c = new(fixed_alloc<foo>()) foo; /* 固定サイズのメモリ確保ライブラリ */
general_free(a);
general_free(b);
general_free(c);

これがうまく動作するgeneral_freeが実現できるとでも?

227 名前:デフォルトの名無しさん :04/03/09 20:15
スレの流れ全然読まずに書くが、
>>226
using namespace boost;
shared_ptr<foo> a( new foo );
shared_ptr<foo> b( new (buf) foo, no_op() );
shared_ptr<foo> c( new (fixed_alloc<foo>()) foo, fixed_alloc<foo>::dealocater() );
とかでダメ?

228 名前:デフォルトの名無しさん :04/03/09 20:43
>>226
勝手に話を拡張しないでくれ。

placement new は実際にシステムからメモリを”確保”することは行っていないし、
それに対応する”解放”処理もその意味でのメモリの”解放”は行わないってことは踏まえてるか?
いや、俺も>>225で不用意な言い方したんで悪かったと思う。
#placement new でなされる処理をメモリの”確保”と呼ぶのなら
#それに合わせようとしたんだが過度な誤解を与えそうな言い方なのは確かだ。
しかしそこまで基本からはずれた問だと揚げ足取るための例かと邪推してしまうぞ。


229 名前:226 :04/03/09 20:51
ちょっと頭を冷やしてきた。

たとえば、
foo *p = new(myalloc) foo;
p->~foo();
myalloc.dealloc(p);
と書く場合、開放側のコードは確保側に依存しているよな?
(pがmyallocによって確保されたことを期待している)
それを>>214の様に書き直したところで依存性は変わらない。
変わるのは見た目だけで、「'new'と書いたんだから'delete'と書きたい」という
自己満足を満たす以上の何者でもない。(templateが絡むと変わってくるが。)
>>225の言うことは正論で、実行可能だ。(>>227氏thx)
けど、ここでは直接関係しない、ということでいいんじゃないだろうか。

230 名前:デフォルトの名無しさん :04/03/09 20:53
>>227
それってオブジェクトの内部にデアロケータへの参照渡してるんだよな?
(クラスの継承関係に縛られないよう関数ポインタ渡すべきだと思うけど)
それって要するに
あるフレームワークに従って
オブジェクトの内部にデアロケートのための情報を保持させるってことだろ?
>>226だかの placement delete が欲しいと言っている人(達?)の意見は
それは嫌で引数としてアロケータを渡したいと言うもののようだが。

あとついでにshared_ptr は何のために持ち出したか知らないけど。
最後にデストラクタじゃなくて delete 演算子呼んでしまわうから
実際の例としてはまずくない?

231 名前:226 :04/03/09 20:54
>>228
>>226は忘れてくれ。体温が高かった。

そろそろ退散します。すれ汚しスマソ

232 名前:225(としとく) :04/03/09 21:13
お、互いにかみ合ってなかった部分が見えてきて話がまとまって来たな。
もっかいまとめるね。

placement delete 反対派の俺としては、
(とりあえず自動変数としての宣言、 malloc や、引数なしの new のような”生の”メモリ確保は別物として)
placement new を行った場合に、
その引数に対応する適切な解放処理を解放側が
常に覚えて置いて解放時に記さなきゃいけないような記述はクライアント側のコードの独立性を下げる。
だから、もしデストラクタ以外にそうした独自の解放処理が必要なら
独自のフレームワークに従ってオブジェクトの内部に必要な情報を保持するなりして対応しろ、
ぶっちゃけ、外部から与えるような形式を言語仕様が認めるような形にはするんじゃない(※)と言っている。

もう一方の主張は、
解放処理に余分な指示を与える前提で(※)
どうせ後から解放のための関数呼び出しをするくらいなら
引数つきの delete があった方が構文が統一的になる、というようなものと解釈している。

で、※の部分の前提が目的意識を違わせ、かみ合わなくなっている気がするんだがどうだろね?

233 名前:225 :04/03/09 21:16
あー、そうした方がよさそうだね。
俺も熱くなりすぎていた。
解放時の独自の関数呼び出しがそこまで重要視されることが想像外だったのね(たぶん)、そこは謝っとく。
それじゃ俺も退散するわ。

234 名前:デフォルトの名無しさん :04/03/09 21:22
というかね、コンストラクタの直接呼出しが何で出来ないのかと。
placement new を使えばできてしまうのであれば、
どうせなら直接呼び出せるようにすればいいのに。
構文を統一的にするなら、こっちの方がよっぽどいい。

235 名前:227 :04/03/09 21:29
読んだ。placement delete の話か、なるほど。

C++でplacement delete演算子を"明示的に"呼び出す構文が
ないのは、禿曰く↓↓みたいなテンプレートを用意すればユーザ定義
できるから、という理由だったはず。
 template<typename P1, class T>
  void Delete( const P1& p, const T* ptr ) {
   ptr->~T(); operator delete( p, ptr );
  }
俺はplacement newの方も廃止して、アドレスを渡してコンストラクタを
呼び出す構文"だけ"を用意しとくべきだったと思うのでplacement delete自体に
反対だが、現にplacement newがある以上、対称性からplacement deleteを呼ぶ
構文も存在するべきだというのには全面同意する。

>>230
一個目以外はdelete呼ばないよ。継承関係?関係ない。

236 名前:デフォルトの名無しさん :04/03/10 03:34
placement_new [] で確保した領域がVCで解放できない...。
#include<iostream>
#include<cstdlib>
struct XX{
int data;
XX(){std::cout << "XX()" << std::endl;}
~XX(){std::cout << "~XX()" << std::endl;}
static void* operator new[] (size_t size){
std::cout << "new XX[]" << std::endl;
void* p = malloc(size); std::cout << p << std::endl;
return p;
}
static void operator delete[] (void* p){
std::cout << "delete XX[]" << std::endl;
free(p); std::cout << p << std::endl;
}
static void* operator new[] (size_t size,void* mem_p){
std::cout << "new (mem_p) XX[]" << std::endl;
mem_p = malloc(size); std::cout << mem_p << std::endl;
return mem_p;
}
static void operator delete[] (void* p,void* mem_p){
std::cout << "delete[] ( p , mem_p )" << std::endl;
std::cout << p << std::endl; std::cout << mem_p << std::endl;
delete [] p; //エラー!!! -> デストラクタがないときは大丈夫 ,G++3.3.1は大丈夫
}
};

237 名前:続き :04/03/10 03:36
int main(){
XX *x = new XX[5];
delete [] x;
void* mem_p=0;
XX *x2 = new (mem_p) XX[5];
XX::operator delete[] (x2,mem_p);
}

238 名前:デフォルトの名無しさん :04/03/10 04:03
それはplacement newとは言わないんじゃないのか?

まあそれは置いといて、
static void operator delete[] (void* p,void* mem_p);
の時のpとmem_pの値を見てみろ。
おまえがmallocから貰ったポインタはどちらですか?

239 名前:デフォルトの名無しさん :04/03/10 04:49
>>238
new(mem_p)[]の中では
mem_pは 003707B9
main関数に戻ったときは
mem_pは 00000000
x2 は 003707BC
従って、
static void operator delete[] (void* p,void* mem_p);
のpにx2を渡してるので不整合が起きるみたいです。

デストラクタがある場合は詰め物?があるようで、xの場合も
delete [] x; //はOK
XX::operator delete[](x); //デストラクタがあるとだめ
XX::operator delete[](x-1);//デストラクタがあるとOK
となってしまいました。

>それはplacement newとは言わないんじゃないのか?
なんか根本的に使い方を間違えてるような気がしてきた...


240 名前:デフォルトの名無しさん :04/03/10 07:27
>>236
void* ひとつを受け取るバージョンは標準ライブラリ<new>で定義されているので、
ユーザーが定義しちゃダメです。

241 名前:デフォルトの名無しさん :04/03/10 08:49
だいたい、>>237のソースでは、メモリ確保されていない領域(mem_p=0)
のところにplacement newしちまっているじゃないか。

placement newはすでに領域は確保してあって、そこにオブジェクトを
構築したい時に使う。>>236=237がやりたいような、「自分の希望した
*任意の*アドレスにオブジェクトを生成する」わけではない。

class c{...};

void *buf = operater new[](5 * sizeof(c));

c* pc = static_cast<c*>(buf);

for(int i = 0; i < 5; ++i)
 new (&pc[i]) c();

...

delete [] buf;

こんな感じ。というか、More Effective C++読もうや。






242 名前:241 :04/03/10 08:53
ちなみに、placement newは以下のコードとみなせる(More Effective C++ Item:8)。

void* operator new(size_t, void* buf)
{
 return buf;
}

ここのなかで領域確保するのでは*ない*のです。


243 名前:デフォルトの名無しさん :04/03/10 10:05
intの符号なし変数をvとして
v=0;
~((~v) >> 1)
で,intが32ビットなら,
10000000000000000000000000000000 (2)
と,最上位が1のビット列になりますよね
これと同じ事はshortやcharには通用しないんですか?
unsigned short(16bitと仮定)やunsigned char(8bitと仮定)でそれぞれ,
1000000000000000 (2)
10000000 (2)
となることを期待したのですが,参照してみると0だと言われます。
もしかして,ビット演算って1word単位でやるのですか?
だとすると,
10000000000000000000000000000000
で,右から16ビットだけ読んだ場合も,8ビットだけ読んだ場合も
どちらも0となってつじつまは合うんですが。

244 名前:じゅn :04/03/10 10:07
win2000がたちあがらなくなり、再ISしたら画面が緑。。。画像も悪い。どうしたらいいですか?




245 名前:デフォルトの名無しさん :04/03/10 10:10
>>244
http://pc2.2ch.net/pcqa/

246 名前:デフォルトの名無しさん :04/03/10 10:33
>>243
計算途中でintになっちゃうYO
最後に代入する部分で警告でてるはずだが。

247 名前:デフォルトの名無しさん :04/03/10 11:02
>>243
そそ。整数への格上げ。C++でなくCでも同じ。

248 名前:デフォルトの名無しさん :04/03/10 11:12
v=0;
v=~v;
v=v>>1;
v=~v;

ならunsigned shortやunsigned charでも最上位が1になるよ。

249 名前:デフォルトの名無しさん :04/03/10 13:11
はじめまして。現在アメリカ在住です。
アメリカの大学でコンピューターサイエンスを
専攻し、昨年卒業したんですが、未だに就職先が
見つかりません。今アメリカではIT業界で職を探すのは
非常に困難です。特に新卒にとっては…。
学校ではJavaでプロジェクトなどやったんですが、
これからはC++に変えたいと考えています。
そこで質問なんですが、C++に将来性はあるのでしょうか?
またC++のどのあたりを勉強したら就職に役立つでしょうか?
あとOSはRedhatのFedoraを使ってるんですが、
コンパイラーは何がいいんでしょうか?
よろしくお願いします。

250 名前:デフォルトの名無しさん :04/03/10 13:29
駄目な奴は何をやっても駄目。


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