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


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

C++相談室 part39
1 名前:デフォルトの名無しさん :05/01/24 09:49:52
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
テンプレートライブラリ(STL含む)に関する質問は
専用の別スレにお願いします。
IDE(VC++など)などの使い方の質問もその開発環境のスレに
お願いします。

前スレ part38
http://pc5.2ch.net/test/read.cgi/tech/1101473340/

過去スレ、関連スレ、関連リンクなどは >>2-20 あたり

2 名前:デフォルトの名無しさん :05/01/24 09:50:48
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://pc5.2ch.net/tech/kako/1041/10413/1041328679.html
15 http://pc5.2ch.net/tech/kako/1043/10436/1043605481.html

3 名前:デフォルトの名無しさん :05/01/24 09:51:50
16 http://pc5.2ch.net/tech/kako/1045/10457/1045746245.html
17 http://pc5.2ch.net/tech/kako/1047/10475/1047560042.html
18 http://pc5.2ch.net/tech/kako/1050/10501/1050177746.html
19 http://pc5.2ch.net/tech/kako/1052/10526/1052625846.html
20 http://pc5.2ch.net/tech/kako/1055/10551/1055162298.html
21 http://pc5.2ch.net/tech/kako/1057/10575/1057580107.html
22 http://pc5.2ch.net/tech/kako/1060/10603/1060361082.html
23 http://pc5.2ch.net/tech/kako/1062/10626/1062690663.html
24 http://pc5.2ch.net/tech/kako/1066/10665/1066546387.html
25 http://pc5.2ch.net/tech/kako/1067/10679/1067949669.html
26 http://pc5.2ch.net/test/read.cgi/tech/1070164402/ (迷子)
27 http://pc5.2ch.net/test/read.cgi/tech/1074454641/ (迷子)
28 http://pc5.2ch.net/test/read.cgi/tech/1077985164/
29 http://pc5.2ch.net/test/read.cgi/tech/1082047479/
30 http://pc5.2ch.net/test/read.cgi/tech/1084030770/
31 http://pc5.2ch.net/test/read.cgi/tech/1086185282/
32 http://pc5.2ch.net/test/read.cgi/tech/1088236078/
33 http://pc5.2ch.net/test/read.cgi/tech/1090180012/
34 http://pc5.2ch.net/test/read.cgi/tech/1092018643/
35 http://pc5.2ch.net/test/read.cgi/tech/1093958200/
36 http://pc5.2ch.net/test/read.cgi/tech/1096304546/
37 http://pc5.2ch.net/test/read.cgi/tech/1098543578/
38 http://pc5.2ch.net/test/read.cgi/tech/1101473340/


4 名前:デフォルトの名無しさん :05/01/24 09:52:48
■基本■
[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://www.open-std.org/jtc1/sc22/wg21

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

5 名前:デフォルトの名無しさん :05/01/24 09:53:40
■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/
Exceptional C++ Style
 http://www.amazon.com/exec/obidos/ASIN/0201760428/


6 名前:デフォルトの名無しさん :05/01/24 09:55:15

■Books(Templateまわり)■
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/
C++ Template Metaprogramming
 http://www.amazon.com/exec/obidos/ASIN/0321227255/


7 名前:デフォルトの名無しさん :05/01/24 09:56:01
■Libraries■
[Boost]
 Boost http://www.boost.org/
 (日本語) http://www.kmonos.net/alang/boost/
 (日本語) http://shinh.skr.jp/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


8 名前:デフォルトの名無しさん :05/01/24 12:17:14
■関連スレ■
【C++】template 統合スレ -- Part6
http://pc5.2ch.net/test/read.cgi/tech/1101384692/
どこかで誰かがC/C++の宿題を片付けます 38代目
http://pc5.2ch.net/test/read.cgi/tech/1105541524/
C/C++でのWindowsPrograming議論スレ(質問お断り)
http://pc5.2ch.net/test/read.cgi/tech/1049790146/
managed C++ やろうぜ!!
http://pc5.2ch.net/test/read.cgi/tech/1014486422/
ATL/WTL Part3
http://pc5.2ch.net/test/read.cgi/tech/1095442366/

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

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

11 名前:デフォルトの名無しさん :05/01/24 12:20:36
>>10
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。

12 名前:デフォルトの名無しさん :05/01/24 12:21:30
>>11
#include <stdafx.h>

後氏ね。

13 名前:デフォルトの名無しさん :05/01/24 12:22:27
>>12
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。

14 名前:デフォルトの名無しさん :05/01/24 13:16:43
ageておくか
個人的に技術系スレで【】は勘弁

15 名前:デフォルトの名無しさん :05/01/24 13:23:04
重複?

16 名前:デフォルトの名無しさん :05/01/24 13:23:11
?

17 名前:デフォルトの名無しさん :05/01/24 13:26:08
>>14
しかも総合スレだしな

18 名前:デフォルトの名無しさん :05/01/24 13:26:57
C++Templateスレあたりで、STL関係をC++相談室に統合って話になったんじゃなかったか。

19 名前:デフォルトの名無しさん :05/01/24 13:37:16
déjà vu?


20 名前:デフォルトの名無しさん :05/01/24 15:16:25
>>18
普通に淡々と書けばいいのにな

21 名前:デフォルトの名無しさん :05/01/24 15:26:09
C++(STL含む)相談室 とか?

22 名前:デフォルトの名無しさん :05/01/24 17:29:17
或いは38スレの伝統を守って C++相談室(STL含む) part39 とか。

STLに関しては、スレタイに含めず>>1に書けば十分な気もするけどな。
どのみちtemplateスレもstlじゃ引っかからないんだし。

23 名前:デフォルトの名無しさん :05/01/25 14:44:05
stl単体でスレ立てるバカがいるから明記しないと駄目

24 名前:デフォルトの名無しさん :05/01/26 21:58:08
このコードがコンパイルとおらない理由がどうしてもわからんです。
class point{
private:
int x;
int y;
public:
point(int a,int b){x = a; y = b;}
virtual void show();
};
void point::show()
{
cout << "x:" << x << endl;
cout << "y:" << y << endl;
}
class 3Dpoint:public point{
private:
int z;
public:
3Dpoint(int a,int b,int c):point(a,b){z = c;}
void show();
};
void 3Dpoint::show()
{
cout << "x:" << x << endl;
cout << "y:" << y << endl;
cout << "z:" << z << endl;
}

25 名前:デフォルトの名無しさん :05/01/26 22:03:55
>>24
3Dpoint ←数字で始まる識別子は許されない。

26 名前:デフォルトの名無しさん :05/01/26 22:05:11
>>24
あと、基底クラスのメンバをprivateにしているが、これだと派生クラスからアクセスできない。
protectedにすべき。

27 名前:デフォルトの名無しさん :05/01/26 22:14:31
>>25-26
どうもです。
コンパイルできました。

28 名前:デフォルトの名無しさん :05/01/27 09:52:58
News 2005-01-26: The C++ Standard Library Issues List (Revision 34) is available

29 名前:デフォルトの名無しさん :05/01/30 22:03:27
test

30 名前:デフォルトの名無しさん :05/02/04 01:52:12
test

31 名前::05/02/04 09:28:35
C++で、RS232からデータを得て、このデータでxファイルの3d画像が動かせたい(
例え:車3d画像)、サンプル source code がございませんか?
教えて頂ければ、幸いです。有難う。
Email: lixueping520@yahoo.co.jp

32 名前:デフォルトの名無しさん :05/02/04 09:52:14
>>31
外人さんですか?

33 名前:デフォルトの名無しさん :05/02/04 23:06:00
>>24
なんでエラーメッセージを読まないのか知りたい。

34 名前:デフォルトの名無しさん :05/02/07 17:04:16
>>31 は中国人

35 名前:デフォルトの名無しさん :05/02/08 02:28:02
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF|_CRTDBG_LEAK_CHECK_DF);
でリークチェックしたんですが、ファイル名、行番号が表示されない。
どなたか原因分かる方いらっしゃいませんでしょうか。
リーク情報は表示されますがファイル名、行番号のみが表示されません。

#define CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
の順で記述してます。
_CrtSetDbgFlagマクロは、プログラムエントリポイント始めに記述。

VC++スレが無いのでここで質問させて頂きました。


36 名前:デフォルトの名無しさん :05/02/08 03:42:10
>>35
あんたの目は節穴か?
http://pc5.2ch.net/test/read.cgi/tech/1104843249/
http://pc5.2ch.net/test/read.cgi/tech/1101931660/

37 名前:デフォルトの名無しさん :05/02/08 03:47:42
俺の目はドーナツだ。

38 名前:デフォルトの名無しさん :05/02/12 09:32:10
質問etc.の後に "Thank you." みたいな語句をつけるのは
日本以外では共通なのかな。
私は英語とタイ語ぐらいしか分からないけど

39 名前:デフォルトの名無しさん :05/02/25 13:43:54
test

40 名前:デフォルトの名無しさん :05/03/02 00:04:38
test

41 名前:デフォルトの名無しさん :05/03/04 01:54:21
【標準C++】C++相談室 part39【STL含む】
http://pc5.2ch.net/test/read.cgi/tech/1106466303/

↑の次スレとして再利用する?

42 名前:デフォルトの名無しさん :05/03/04 02:18:41
>>41
うん。

43 名前:デフォルトの名無しさん :05/03/04 09:54:21
さぁ、みなさんあったまってきたところで
テキストファイルの一行の処理1024バイトについて。

44 名前:デフォルトの名無しさん :05/03/04 10:50:58
向こうのスレでも書いたけど、1024と言う数字は兎も角1行全部読み切らなくていい応用ならfgets()もありジャマイカ。
1行全部読みきる必要があるならそれなりに処理しなければいけないのは言うまでもないとして。

私のところでは、設定ファイルみたいなものを処理するときには1行200バイト以内という前提で書くことが多い。
あー、そう言えば1024なんて仮定はしたことないな。その長さのテキストファイルを想定するなら素直に全部読みきる対処するから。

45 名前:デフォルトの名無しさん :05/03/04 10:59:15
見えない人のためにもう一度age

46 名前:デフォルトの名無しさん :05/03/04 11:14:36
でもistream + getline の組み合わせでいいんじゃないの?
fgets使う意味でもさ。

47 名前:デフォルトの名無しさん :05/03/04 11:18:34
v(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)v

48 名前:デフォルトの名無しさん :05/03/04 11:21:37
>>43
状況によるんじゃ。
テキストファイル 「全般」 に対して処理することが要求されるなら、
一行の文字数によって、無条件に読めない部分があってはならない。
プログラムのconfigファイルを処理したいなら、そのconfigファイルの仕様によって変わる。
configファイルでは(おそらくコンソールの横幅との歴史的関係で)一行80文字くらいにすることが多い。
この場合は1024文字でも(あるいは256文字でも)差し支えないだろう。
最も、configファイルに限定するなら、boost::program_optionsの使用を検討した方が良いかもしれない。
付け加えるなら、行という概念で扱うより、XMLなど行依存のないフォーマットを採用するのも手だ。

クラスのコンストラクタあたりに
class X {
 const size_t size_;
public:
 X(const size_t& size = 1024) : size_(size) {};
};
とデフォルト値を忍ばせる手もあるのかな。スマートじゃないな。


49 名前:デフォルトの名無しさん :05/03/04 11:22:58
前スレのダライアス継承をテンプレに入れるべき

50 名前:938 :05/03/04 11:26:44
ダライアス継承:
  A   B   C
 /\ /\ /\
D   E   F   G
|   |  |   |
H   .I.   J   K
 \/ \/ \/
  L   M   N
 /\ /\ /\
O   P   Q   R
 \ | × | /
    S   T
     \/
      U


51 名前:デフォルトの名無しさん :05/03/04 13:08:28
fgetsつかうと一気に行サイズが1024バイトに?!

52 名前:デフォルトの名無しさん :05/03/04 13:37:24
>>50
利用用途を考えて見たが、

  A   B
 /\ /\
D   E   F

まずここから用途が無い


53 名前:デフォルトの名無しさん :05/03/04 13:59:00
getlineも文字数を引数で指定できるよね?
つまり、一行読むのに可変長で読むか固定長で読むかは
C++の範囲で選択できるんじゃないの?
C言語の関数使う必要ない気もする。
streamにしとけば、いろいろSTLの恩恵受けられる可能性あるしさ。

54 名前:デフォルトの名無しさん :05/03/04 15:51:46
>>53
std::istream::getlineは選べるが、std::stringに文字列を格納するstd::getlineは文字数を指定できない。

55 名前:デフォルトの名無しさん :05/03/04 17:35:27
百戦錬磨の尾舞らに聞くが
Windowsのc++コンパイラでコンパイル時間が一番速いのってどれよ?gcc?やっぱVCのcl?

56 名前:デフォルトの名無しさん :05/03/04 17:39:50
Windowsのコンパイラとは? Windowsにコンパイラがバンドルされているとは聞いたことがないのだが。
コンパイル時間が速いとは? 時間が速いと言う概念は理解しかねるのだが。
#俺の時間は速いがお前の時間は遅いとでも言うのかな?

57 名前:デフォルトの名無しさん :05/03/04 17:40:48
質問者が質問者なら回答者も回答者だな

58 名前:デフォルトの名無しさん :05/03/04 18:15:49
百戦錬磨じゃ全然無いけど、使ったことのある中では
コンパイル開始からビルドが終わるまでにかかる時間はbccが速かった。
ただしbccはnamespaceやtemplate周りがイマイチ。最適化もイマイチ。

そもそも漏れはtemplate厨なのでビルド時間はデフォルトで長いのと
言語の標準サポート具合や最適化の質のが重要なファクタなので
Win32/64環境で動作するC++コンパイラのビルドに要する時間は気にしない方がいいんじゃ。

Boostに書いてあったコンパイラリスト↓
* GNU C++ 2.95.x, 3.0.x, 3.1.x, 3.2
* Comeau C++ 4.2.45.2
* SGI MIPSpro 7.3.0
* Intel C++ 5.0, 6.0
* Compaq's cxx 6.2
* Microsoft Visual C++ 6.0, 7.0
* Borland C++ 5.5.1
* Sun WorkShop 6 update 2 C++ 5.3
* Metrowerks CodeWarrior 8.1


59 名前:デフォルトの名無しさん :05/03/04 18:57:11
こうなったらCOBOLでも使うしかないな。

60 名前:デフォルトの名無しさん :05/03/04 19:24:35
>>44
>その長さのテキストファイルを想定するなら素直に全部読みきる対処するから。

全部読みきる時点で素直ではないでしょ。
単に、チョー長い行を扱う場面に遭遇しなかっただけだと思う。
普通は弾く。自分の想定外の長さは弾いてこそ、安全なわけで。

61 名前:60 :05/03/04 19:25:34
>>44
・・・スマン。文章よく読んでなかった。吊ってくる。

62 名前:デフォルトの名無しさん :05/03/05 00:24:55
まー、別にどの関数使おうが、どんなポリシーで処理しようが何でも構わないとは思うが。仕様に沿ってれば。
どんな入力がくるか分からない、ということを想定する程度には、どんな仕様があるか分からない、
ということも想定するべきではないか?
その意味で 1024 超えは想定(゚听)イラネ には釈然としないものを感じる。

63 名前:デフォルトの名無しさん :05/03/05 00:55:48
> 仕様に沿ってれば。
これが全てだろう。

で、どんな仕様が良いのかって話が別に存在するんだろうて。

64 名前:デフォルトの名無しさん :05/03/05 08:00:25
型定義と変数定義をいっきにやっちゃう書き方をtemplateな型でもやりたいのですがうまくいきません

struct aaa{ void f(){} } a;
template<class T>struct bbb{ void f(){} } <int> b;
 
int main()
{
  a.f();
  b.f();
  return 0;
}

65 名前:デフォルトの名無しさん :05/03/05 08:24:26
>>64
クラステンプレート使う意味がないジャン。


66 名前:64 :05/03/05 11:17:07
あるよ

67 名前:デフォルトの名無しさん :05/03/05 11:58:46
>>64
不可能

68 名前:デフォルトの名無しさん :05/03/05 12:56:14
>>66
あるか?

69 名前:デフォルトの名無しさん :05/03/05 13:51:57
>>64
これはだめ?

template<class T>struct bbb{void f(){}static bbb x;};
template<class T>bbb bbb::x;
int main()
{
 bbb<int>::x.f();
}

70 名前:デフォルトの名無しさん :05/03/05 13:54:55
2行目しくじった。
template<class T>bbb<T> bbb<T>::x;

71 名前:デフォルトの名無しさん :05/03/05 18:16:21
// ここ の部分は、規定クラスのコンストラクタだけを
使いたいのですが、こうやって空関数を作らないと、コンパイルが通りません。
何か、空関数を使わないで、コンパイルを通す方法無いでしょうか?(VC6)
class CAa
{
public:
 CAa() {printf("bone aa\n"); }
 CAa(string s) {printf("bone(%s)\n", s); }
 virtual void print() = 0;
};
class CMona : public CAa
{
 void print() { printf("mona\n"); }
public:
 CMona(string s) {}   // ここ
};
class CGiko : public CAa
{
 void print() { printf("giko\n"); }
public:
 CGiko(string s) {}    // ここ
};
void main()
{
 string s = "hage";
 CMona mona(s);
 CGiko giko(s);
 CAa* pAa;
 pAa = &mona;
 pAa->print();
}

72 名前:デフォルトの名無しさん :05/03/05 18:24:25
>>71
コンストラクタは継承されない。
よって、省略できない。

73 名前:デフォルトの名無しさん :05/03/05 18:38:06
>>72
デフォのコンストラクタは継承されるのに?

74 名前:デフォルトの名無しさん :05/03/05 18:43:20
>>73
継承されるわけではなくて、自動生成されると考えた方が分かりやすいと思う。

struct base {base(){}};
struct derived : public base{};

の場合、derivedのデフォルトコンストラクタが次のように生成される。

struct derived : public base { derived(){}};

で、これはbaseのコンストラクタを明示的に呼び出していないから、
baseのデフォルトコンストラクタが使われる。

struct derived : public base {derived() : base() {}};

結果的に、継承されたように見える。

75 名前:74 :05/03/05 18:46:14
言い忘れたけど、明示的に書かれたコンストラクタが一つでもある場合、
デフォルトコンストラクタは自動生成されない。
たとえば、>>71の例でCMonaにデフォルトコンストラクタはない。
このことからも、デフォルトコンストラクタが継承されないと分かると思う。

76 名前:デフォルトの名無しさん :05/03/05 19:27:15
>>74-75
すんまそ。ここ読んで、もう一度出直します
http://www.kab-studio.biz/Programing/Codian/Cpp/05.html

77 名前:332 :05/03/06 03:48:20
virtualについてなんだが、
・仮想関数=上書きされちゃう関数
・仮想継承=共用されちゃうクラス
・仮想デストラクタ=派生デストラクタも呼ぶデストラクタ
という事になるよな?

一貫して無くないか?皆はどうやってこの紛らわしい物を納得してるんだ。


78 名前:デフォルトの名無しさん :05/03/06 03:53:19
同じ名前に異なるセマンティックを与えるのが
C++流。static とかもそうだな。

79 名前:デフォルトの名無しさん :05/03/06 04:07:38
キーワードをむやみに増やせなかったという事情があるらしい

純粋仮想関数の =0; ってのもなかなか苦しいよな

80 名前:デフォルトの名無しさん :05/03/06 04:40:33
まぁその辺のなぜなにに関してはC++ D&Eを読め、となるわけだが。

81 名前:デフォルトの名無しさん :05/03/06 06:48:07
C++使うケースだとOO使わないでtemplateにしちゃうんだよね。
C#みたいに気持ちよくOOできないし


82 名前:デフォルトの名無しさん :05/03/06 07:00:43
標準C++のどの規格に準拠しているかは__cplusplusマクロで知ることができますが
使用しているコンパイラが何か(マニファクチャとバージョン)を識別するマクロが
掲載されているところを知りませんか?


83 名前:デフォルトの名無しさん :05/03/06 09:40:48
typename みたいな藁もあるな・・・

84 名前:デフォルトの名無しさん :05/03/06 10:09:41
>>81
> C++使うケースだとOO使わないでtemplateにしちゃうんだよね。
それだとコンパイル時に確定しない動的バインディング使えないじゃん。
ありえんよ。

85 名前:デフォルトの名無しさん :05/03/06 10:46:15
>>84
でも、コンパイル時にできることはコンパイル時にやっちゃおう、って気にはなる。

86 名前:デフォルトの名無しさん :05/03/06 13:01:40
別に virtual なんて必ずしも使わなくたってオブジェクトを作ることを指向するプログラミングはやればできるさ

87 名前:デフォルトの名無しさん :05/03/06 14:22:59
>>86
その手の極論を言うなら、アセンブリ言語でも OO できる、というところに辿り着く。
なんか詭弁のガイドライン通りの展開でアレだが。

88 名前:デフォルトの名無しさん :05/03/06 15:41:03
アセンブラでOOは現に色んな分野でやってることで極論でも詭弁でもないぜ

89 名前:デフォルトの名無しさん :05/03/06 15:43:16
要するに、OOPとOOP言語は違うってことだ。C++とVC++くらい違う。

90 名前:デフォルトの名無しさん :05/03/06 16:18:28
つまりあれか
毛の生えた女と生える前の女くらいのさ。

91 名前:デフォルトの名無しさん :05/03/06 16:26:31
・どちらも女じゃないか
・毛が生えているからこそ女だ
・毛の生えていない女しか無理だ
・実は毛のない方が好きだが、生えていても問題なく行える <- 俺は、この辺
・どちらも駄目だ

92 名前:デフォルトの名無しさん :05/03/06 18:03:07
C++とVC++は、別に大差ないだろ。
毛の生えた女と生える前の女は、雲泥の差だがな(・∀・)

93 名前:デフォルトの名無しさん :05/03/06 18:10:26
>>77
virtualな継承・・・・ 一度だけ菱形継承するためにやった
いまは反省している

94 名前:デフォルトの名無しさん :05/03/06 20:30:55
シンプル伊豆ベスト

95 名前:332 :05/03/06 21:48:56
>>94
「遠出するよりも近場で済ませてしまおう」


96 名前:デフォルトの名無しさん :05/03/06 21:50:06
>>93
仮想継承はそれ以外に使い道は無いのかな

97 名前:デフォルトの名無しさん :05/03/07 03:11:59
>>96
外道な使い方だが、「派生禁止」。

98 名前:デフォルトの名無しさん :05/03/07 21:00:40
>>97
全然外道じゃない。そういう考え方もある。

99 名前:デフォルトの名無しさん :05/03/07 21:14:24
基本クラスからの継承より融合の方がイイ



100 名前:デフォルトの名無しさん :05/03/08 11:59:40
>>91
毛が生えていれば剃ればいいじゃない
                              マリーアントワネット

101 名前:デフォルトの名無しさん :05/03/08 13:06:57
毛が嫌なら、ょぅι゛ょとつきあえばいいじゃない マリー

102 名前:デフォルトの名無しさん :05/03/08 14:50:00
C++が嫌ならJAVAを使えばいいじゃない

103 名前:デフォルトの名無しさん :05/03/08 15:39:55
>>102
全然外道じゃない。そういう考え方もある。

104 名前:デフォルトの名無しさん :05/03/08 16:28:41
マリーは101くらい無茶じゃないとな

105 名前:デフォルトの名無しさん :05/03/09 09:10:06
>>102
そのために生まれたのがJavaだし。

106 名前:デフォルトの名無しさん :05/03/09 12:46:36
メモリの管理に関して質問です.

↓のように STL の map に値を格納した場合,pair のメモリの解放は
どのように行えば良いのでしょうか?

hmap->insert(new pair<hoge, int>(new hoge(), 0));


「new hoge()」の方は以下のコードでクリア出来るのは分かるのですが,pair
の方はどうすれば良いのか分からず困っています.

for (typename hoge_map::const_iterator i = hmap->begin(); i != hmap->end(); i++) {
delete i->second;
}


アドバイスお願いします.

107 名前:デフォルトの名無しさん :05/03/09 12:52:32
>>106
それ、コンパイル通る?

108 名前:デフォルトの名無しさん :05/03/09 13:00:14
typename?

pairへのポインタを格納してるなら、delete *iでいけるべ。

109 名前:106 :05/03/09 14:42:36
hpair = new pair<hoge, int>(new hoge(), 0);
hmap->insert(hpair);
delete hpair;

でいけました.
(念のため,memset で hpair を上書きした後も hmap を通じてアクセス出来ることも確認しました.)
delete *i はダメみたいです.

あと,もとのコードでは typename つけないと implicit declaration とかい
うエラーが出てました.gcc v3.3.5 です.

110 名前:デフォルトの名無しさん :05/03/09 14:49:54
>>109
boost::shared_ptrでも使ったら?

111 名前:デフォルトの名無しさん :05/03/09 17:03:13
>>106
std::mapにはstd::pairを格納するわけだが、そのポインタをinsertするって?
ポインタでなかったとして、std::map<hoge*, int>なのにi->secondをdeleteって?
delete i->first;の間違いだったとして、std::mapのkeyを変更するって?
deleteするくせにconst_iteratorって?

112 名前:デフォルトの名無しさん :05/03/09 17:33:20
うーん、どうやってコンパイル通してるんだ(?_?)

113 名前:108 :05/03/09 22:50:26
あ、そうかmapならpairをそのまま格納してるはずだよな

いったいなぜpairをnewで生成する必要がある?根本的に間違っている。

114 名前:111 :05/03/09 23:42:10
>>106
何もかもnewしようとしているところを見ると、もしかして君は普段
JAVAをやってるんじゃないか?ソースをさらした方が何をしたい
のかも分かるし、それに対してC++ではどういう風にソースを書く
のかも示される可能性が高いぞ。

115 名前:デフォルトの名無しさん :05/03/09 23:49:34
ワラタ

116 名前:デフォルトの名無しさん :05/03/10 00:06:02
>>114
BCBもnew多用する罠。(Delphi型クラスはnewでしか生成できない)

117 名前:デフォルトの名無しさん :05/03/10 00:14:50
>>116
ネタはネタだと…

118 名前:106 :05/03/10 01:04:56
あ,たしかにいろいろ変になってますね.要点だけ切り出そうとして,意味不明になってました.
本当はこんな感じです.(まだおかしなところがあるかも)

fbpair = new pair<foo , bar>(new foo(), new bar());
fbmap->insert(*fbpair);
delete fbpair;

> いったいなぜpairをnewで生成する必要がある?根本的に間違っている。
ある関数から,pair<foo , bar> * を返して,それを map に格納してるからそういう構成にしてます.
pair<foo , bar> だと NULL が返せないので,いまのところ,ポインタを使ってます.また,

pair<foo , bar> hbpair(new foo(), new bar());
return &hbpair;

とかだと,return した直後に hbpair がなくなるのでダメですよね?NULL 使
わずに例外を使え,ていう話もあるかもしれませんが,NULL を返すのはそれほ
ど例外的な状況ではないので出来れば避けたいです.

> 何もかもnewしようとしているところを見ると、もしかして君は普段
> AVAをやってるんじゃないか?ソースをさらした方が何をしたい
> のかも分かるし、それに対してC++ではどういう風にソースを書く
> のかも示される可能性が高いぞ。

はい,その通りです.構文としては理解できても,new しないオブジェクトと
いうのがどうにも自分のなかで整理できてくて困ってます.

119 名前:デフォルトの名無しさん :05/03/10 01:28:19
>>118
map::insert()の仕様をよく読むのが先決。

120 名前:デフォルトの名無しさん :05/03/10 01:35:42
>いうのがどうにも自分のなかで整理できてくて困ってます.
落ち着け。さもなくばもっと注意深くあれ。

121 名前:106 :05/03/10 01:58:44
>> 119

すみません.おっしゃる意味がよく分かりません.
もう少しわかりやすく教えて頂けないでしょうか?

http://www.wakhok.ac.jp/~sumi/stl/header/map.html#insert によると,次の
ようになってます.

> // xを挿入し、挿入された位置を指すイテレータと成否のペア(pair)を返す。
> pair<iterator, bool> insert(const value_type& x);

引数はリファレンスとして受け取る(?)ようですが,これと関係あるのでしょう
か?

122 名前:デフォルトの名無しさん :05/03/10 02:23:57
>>121
君のやりたいことは次で事足りる。むやみにnewを使うな。
std::pair<foo, bar> make_foo_bar()
{
    return std::make_pair(foo(), bar());
}
int main()
{
    std::map<foo, bar> fbmap;
    fbpair = make_foo_bar();
    fbmap.insert(fbpair);
}

123 名前:デフォルトの名無しさん :05/03/10 02:25:20
>>121
というか1からC++の勉強をしなおせ。そもそもメモリについて理解してない。

124 名前:122 :05/03/10 02:30:29
なんかチョコチョコ間違ったから、通るソースを。
#include <map>
#include <utility>
struct foo{int x;};struct bar{};
bool operator<(const foo& a, const foo& b){return a.x < b.x;}
std::pair<foo, bar> make_foo_bar()
{
    return std::make_pair(foo(), bar());
}
int main()
{
    std::map<foo, bar> fbmap;
    std::pair<foo, bar> fbpair = make_foo_bar();
    fbmap.insert(fbpair);
}

125 名前:デフォルトの名無しさん :05/03/10 02:44:08
STLについて理解したからった本くらい買え。
2ch上で教えてもらおうなんて虫が良すぎる。

126 名前:デフォルトの名無しさん :05/03/10 05:44:25
せめてこことか。
ttp://www005.upp.so-net.ne.jp/episteme/html/stlprog/

127 名前:デフォルトの名無しさん :05/03/10 07:16:24
どなたか、>>106さんに
「知ってるが、お前の態度が気に入らない」
のAAおながいします。

128 名前:デフォルトの名無しさん :05/03/10 07:25:54
>>118
多分お前はJavaすらまともに理解してない。
そんな状態でC++をやったら混乱してさらにひどいことになるぞ。というかなってる。

129 名前:デフォルトの名無しさん :05/03/10 09:54:17
STLのコンテナのsetについて教えてください。
setにはinsertするためのメンバ関数が2つ
ありますよね。値のみを指定するものと、
ヒントとなる位置を反復子で一緒に渡すものと。
で、setはユニークでなくてはならないので、挿入失敗
のケースがあるかと思います。前者のメンバ関数だと
pair型が帰ってきてbool値で成功失敗が判断できますが
後者のメンバ関数の戻り値は反復子だけですよね?
なぜ後者は成功失敗のフラグを返さないのでしょうか?

130 名前:106 :05/03/10 10:03:51
std::pair<foo, bar> make_foo_bar()
{
return std::make_pair(foo(), bar());
}

情報不足ですみません.これだと,make_foo_bar() から NULL を返せないので,
ダメなんですが.元のコードは以下のようになってます.

std::pair<foo, bar> *hbpair;
while ((hbpair = make_foo_bar_p()) != NULL) {
hbmap.insert(*hbpair);

delete hbpair;
}

そもそも C++ ではこういった書き方はしないものなんでしょうか?

131 名前:デフォルトの名無しさん :05/03/10 10:18:54
>>130
悪いことはいわんからC++の入門書100回読み返せ。

132 名前:デフォルトの名無しさん :05/03/10 10:21:47
>>130
deleteしてどうする。

どう考えても筋悪すぎ。

133 名前:デフォルトの名無しさん :05/03/10 10:27:13
ここまで理解力のない香具師は久しぶりだな。
C++やりたいんだったら入門書一冊くらいは
読めっつーの。

134 名前:106 :05/03/10 10:36:57
; 稚拙な質問につきあって頂きありがとうございます.

つまり,C++ では(普通)そういった書き方はしない,ということで良いでしょうか?

>> 130
std::pair<foo, bar> *hbpair;
while ((hbpair = make_foo_bar_p()) != NULL) {
hbmap.insert(*hbpair);
memset(hbpair, 'a', sizeof(std::pair<foo, bar>));
delete hbpair;
}

のようにしても,後から hbmap の中身に問題なくアクセス出来たんで,
delete しても問題ないと思ったんですが,違うのでしょうか?
すぐ delete するなら new するな,というのは分かるんですが,それだと
make_foo_bar_p() から NULL 返せないのでどうしたものかと.


手元に プログラミング言語 C++ あるんで,大体どのあたりが参考になりそう
か教えて頂けないでしょうか?

135 名前:デフォルトの名無しさん :05/03/10 10:38:39
ごめん、漏れ入門書読まずにC++やってるよ。
初めて半年経ってからEffectiveC++は読んだけど。

136 名前:デフォルトの名無しさん :05/03/10 10:39:50
センスがないだけかと。
勉強しても身に付かないよ、きっと。
C++ とか、言語どうこうじゃない。

137 名前:デフォルトの名無しさん :05/03/10 10:40:34
>>135
それは読んでるっていうだろ
ってわざとか?

138 名前:135 :05/03/10 10:48:41
>>137
いやぁ、昔から入門と名のつくものは読まないもんで。
EffectiveC++も読んで驚いたよ。半年試行錯誤したことがみんな書いてあったから。
それから半年経つからそろそろ何か読もうと思ってるところ。

139 名前:106 :05/03/10 10:50:45
うーん,センスうんぬんの話が出るということはもしかして

std::map<foo *, bar *> fbmap;
foo *f;
bar *b;
while (make_foo_bar_x(&f, &b)) {
hbmap.insert(std::pair(f, b));
}

のようにしろ,ってことですか?

140 名前:デフォルトの名無しさん :05/03/10 11:07:40
というかその程度の操作ならポインタは一切不要だ

141 名前:106 :05/03/10 11:14:20
リファレンス使ってことでしょうか?

142 名前:デフォルトの名無しさん :05/03/10 11:15:27
・キーfooと値barのペアを返す関数make_foo_barを作成したい。
・make_foo_barが返す値はいつでも有効というわけではない。そのため、返り値が有効かどうか確かめる手段が必要。
・有効な値だった場合、そのペアをmapに挿入したい
・無効な返り値は結構な頻度で発生するため、例外は使えない

ということですか?

143 名前:106 :05/03/10 11:16:46
>> 142
はい,その通りです.

144 名前:106 :05/03/10 11:53:30
>>139 への補足なんですが,ああいった感じで処理すると pair の中身がむき出しになってしまって,
情報隠匿の点からいってちょっと気持ち悪く感じるのですが,C++ ではそこは
我慢するものなんでしょうか?

145 名前:142 :05/03/10 12:02:38
>>144
たぶんあなたはJavaもわかっていない。
Cからやり直せ。あとオブジェクト指向について勉強しろ。

146 名前:デフォルトの名無しさん :05/03/10 12:08:46
無礼な初心者を散々叩いているところ恐縮だが、
誰も>>122,124に突っ込まないのか?

147 名前:デフォルトの名無しさん :05/03/10 12:11:04
>>144
>ああいった感じで処理すると pair の中身がむき出しになってしまって,
>情報隠匿の点からいってちょっと気持ち悪く感じるのですが,
それならそもそもmapは使うな。
foo*, bar*をメンバにもつ十分隠蔽されたクラスを定義して
それをsetなりvectorなりに格納汁。

ともかくC++以前にヴァカ過ぎ。

148 名前:デフォルトの名無しさん :05/03/10 12:16:49
>>124もさることながら、
map::insert()の引数渡し時にstd::make_pair()の利用を推奨する
愚劣な解説書の存在も問題だな。

・・・ま、俺も持ってるんだけどね、その解説書。

149 名前:106 :05/03/10 12:30:14
>>144 書いた直後に typdef とか使えばいいじゃん,ということに気づきました.

150 名前:106 :05/03/10 12:32:36
なんかつっこまれそうなんで,補足.

他にも,いろいろとやりようはあるでしょうけど,手軽にやるなら typdedef ってことで.

151 名前:142 :05/03/10 12:34:04
>>149
typedefで何をどうするのか説明きぼんぬ

152 名前:デフォルトの名無しさん :05/03/10 12:36:41
>>139
ポインタをキーにするってか。
つか、挿入できたかどうか見ないなら
hbmap[f] = b;
でいいじゃんか。態々 pair 使わずとも。

153 名前:106 :05/03/10 12:47:55
> ポインタをキーにするってか。

あー,なるほど.入門書よめっていわれてた理由が分かりました.ありがとうございます.

現段階では,map に入れた後は,iterator を通してしかアクセスしてなかった
ので,ダメダメだということに気づけませんでした.


> つか、挿入できたかどうか見ないなら
> hbmap[f] = b;
> でいいじゃんか。態々 pair 使わずとも。

いわれてみればそうですね.

154 名前:106 :05/03/10 12:54:37
>> 144

> ああいった感じで処理すると pair の中身がむき出しになってしまって,

といったのは誤りで,

> ああいった感じで処理すると pair の定義がむき出しになってしまって,

の方が正しかったです.つまり,どの型とどの型の pair かがむき出しになっているという意味です.
pair で使う型変えたときに,make_foo_bar の宣言も書き換えるの面倒じゃん,ってことです.

なので >>149 で typedef の話が出てきてます.

155 名前:106 :05/03/10 12:57:09
さらに補足,
map や pair の方は当たり前のように typdef してますです.

変なこといってすみません.

156 名前:>>129 :05/03/10 12:59:05
鮮やかにスルーされそうなので、誰かお答えいただけませんか?
それとも設計者にしかわからないことなんでしょうかね。

157 名前:デフォルトの名無しさん :05/03/10 13:05:54
>>156
他のコンテナとインターフェースを合わせるため。

挿入に失敗=すでに同じ項目があった
だから、特別に失敗をチェックする理由が無いなら
問題にはならない。

158 名前:129 :05/03/10 13:26:48
レスどうもです。
統一のためですか。
でもまぁ引数1つだけのバージョン使えばいいだけですよね。
挿入のヒントになる反復子ってのもよくわからないし。

159 名前:デフォルトの名無しさん :05/03/10 13:34:49
iteratorを取るinsertがないとinserterとか使えなくて不便だぞ。

160 名前:129 :05/03/10 14:40:37
でもsetやmapは常にソートの基準にしたがってソート状態を
自動的に保とうとしますよね?内部構造は木構造のようですが。
ということは挿入位置は自動的に決まるわけなんですが、
それでもヒントになるiteratorを与えるとすこし速くなるとか
なんでしょうか。ヒントっていってもいまいちピンとこないですが。

161 名前:デフォルトの名無しさん :05/03/10 14:46:36
辞書引くときに2分探索すればある程度の効率はでるが、頭文字とかで大体の位置がわかってればもっと早く引けるだろ?

162 名前:デフォルトの名無しさん :05/03/10 15:07:41
>>160
自分でset風のものを実装してみるとわかるけど、何かの初期化などで沢山の
ものを挿入したいときのために、N個の追加を O(N^2)とか O(N log)N ではなく
O(N log log N)程度で実行するための手段を用意したくなるのは人の常。

・・・あとでメンテが面倒になって、インタフェイスだけのこって実装はタダの
O(N log N)の挿入に変更されてしまう、というのもありがちだけど。

163 名前:デフォルトの名無しさん :05/03/10 15:21:34
>>162
車輪を再発明した人たちが必ず通過する。
お前だけじゃない。安心汁。涙

164 名前:デフォルトの名無しさん :05/03/10 15:28:35
>>163
それは、若いほどダメージが少ないw
若い頃にSTLみたいなのをまねして作るのは良いこと。
年食ったら無駄な時間

165 名前:129 :05/03/10 16:10:16
ということは、ヒントの位置の意味は、検索はそこ以降からするって
ことにできるってことですか?じゃ、ヒントの位置が先の位置だったら
遅くなるのですか?

166 名前:デフォルトの名無しさん :05/03/10 16:20:24
とりあえずVC++7.1の実装だとヒントのすぐ前後が正解じゃない場合はヒント無視してるが。

167 名前:デフォルトの名無しさん :05/03/10 16:32:08
>>165
2分木風の構造に対する要素の追加ってのは、
a. 追加するべき位置を探す処理
b. 追加する処理
c. 追加した後の木の構造を適当に保つ処理
からなるわけだけど、初期化や以前に保存したファイルからの読み込みなどで
大量追加したい場合、「昇順に追加するから a は省略できんか」と思うでしょ?
そのためのヒントですよ。

168 名前:デフォルトの名無しさん :05/03/10 16:46:37
分けることにより、ラベル付けしてるだけ

169 名前:129 :05/03/10 17:00:49
つまり、どの位置のヒントが有効かは
実装に依存してるってことですか?


170 名前:デフォルトの名無しさん :05/03/10 17:17:08
>>169
ピンポン

171 名前:デフォルトの名無しさん :05/03/10 18:00:10
ぎゃははは、いやスマンソ。

172 名前:デフォルトの名無しさん :05/03/10 18:33:45
>>169
実際のトコは昇順か降順に前回のinsertが返してきた iter をヒントにしてinsertすると効率が良い、
ってことだと思ってるけど。ランダムな要素を追加していくならヒントは使えない、と。

173 名前:デフォルトの名無しさん :05/03/12 22:36:18
うんこ

174 名前:デフォルトの名無しさん :05/03/12 22:38:01
>>173
クソレスしてんじゃねぇ知的障害。
おまえどうせ無職だろw

175 名前:デフォルトの名無しさん :05/03/12 22:39:43
ちんこ

176 名前:デフォルトの名無しさん :05/03/12 22:41:42
>>175
クソレスしてんじゃねぇ痴女。
おまえどうせ無職だろw

177 名前:デフォルトの名無しさん :05/03/12 22:55:38
222.150.31.107はキモヲタです
死んで下さい

178 名前:デフォルトの名無しさん :05/03/12 23:01:55
同性愛系のスレでは、ウザイ女のことをまんこって呼ぶんだよ。

179 名前:デフォルトの名無しさん :05/03/12 23:08:13
教えて下さい。
class A と class B があったとして、

class A
{
class B
......................
}
上記のように、class A の中に class B と書くのは
どういう意味でしょうか?
関連のときは、B *b
集約のときは、B b
と書くのはわかりますが。。

180 名前:デフォルトの名無しさん :05/03/12 23:19:47
>>179
インターフェイスは公開されているが
実装は完全に隠蔽したいケースかな。
AbstractFactoryで使うことが多いかな。

181 名前:デフォルトの名無しさん :05/03/12 23:21:40
池沼?

182 名前:デフォルトの名無しさん :05/03/12 23:26:23
名前を外に見せる必要がないってことだね

183 名前:デフォルトの名無しさん :05/03/12 23:34:38
そうじゃないだろ

184 名前:デフォルトの名無しさん :05/03/12 23:39:37
馬鹿ばっかり

185 名前:デフォルトの名無しさん :05/03/12 23:41:44
手取り足取りお・し・え・て・あ・げない

186 名前:デフォルトの名無しさん :05/03/12 23:45:13
182 が正解

187 名前:デフォルトの名無しさん :05/03/12 23:49:10
馬鹿じゃないの?
見えちゃうけど、Bって言うのはAを使う人にも見えてるYO

188 名前:デフォルトの名無しさん :05/03/12 23:51:14
あー、そりゃすまん
private は可視性制御ではなくアクセス制御だな確かに

189 名前:デフォルトの名無しさん :05/03/12 23:52:10
どっちでもいいよ

190 名前:179 :05/03/12 23:52:49
皆さん、どうもありがとうございます。
名前を外に見せる必要がないと言われても、よくわからないです。。
すみません、もう少し詳しく書くと、

class A
{
class B;
.....................

vector < B *> b;.
}
vector で関連を定義しているのに、さらにclass B と書く意味が
わからないのですが。

191 名前:デフォルトの名無しさん :05/03/12 23:54:16
名前空間的には

namespace A
{
class B { /* ・・・ */ };
}

と同じだよね?

192 名前:デフォルトの名無しさん :05/03/13 00:00:57
>>190
前方宣言。
Bというクラスがありますよ、とコンパイラに知らせてる。
普通はBをincludeするんだけど、それができない理由があるんだろ。

193 名前:190 :05/03/13 00:05:56
>>192
どうもありがとうございます。納得がいきました。



194 名前:デフォルトの名無しさん :05/03/13 00:06:03
API(HTML含む)で質問です。

任意のURLをブラウザ(IE)で表示させるときに、ShellExecuteを使用しています。
ShellExecute(Handle, "open", URL, NULL, NULL, SW_SHOWNORMAL);
上記だと、リンクするたびに同じIEウインドウ上に表示されてしまいます。

これを別のウインドウに表示させる方法はありますか?
具体的にイメージしているのはHTMLのtargetタグのようなコントロールです。

よろしくお願い致します。

195 名前:デフォルトの名無しさん :05/03/13 00:10:00
>>194
スレ違い。
APIスレに逝け。

196 名前:デフォルトの名無しさん :05/03/13 00:35:29
マルチここにもいたのか


197 名前:デフォルトの名無しさん :05/03/13 00:37:21
環境に依存しているのでわかりません

198 名前:デフォルトの名無しさん :05/03/13 01:14:41
よく分からない現象に悩んでいます。知恵をかして頂けないでしょうか?

gcc で分割コンパイルを行うと、a.cpp で
throw runtime_error("あいうえお");
みたいに投げた例外を、b.cpp で

try {

} catch(exception &ex) {
cerr << "Error: " << ex.what() << endl;
}

として catch すると ex.what() の中身が St9exception になってしまいます。
何が問題なのでしょうか?


a.cpp で catch した場合は正しく「あいうえお」となります。
以下の用にして確認しました。
} catch(exception &ex) {
cerr << "Error: " << ex.what() << endl;
throw ex;
}

199 名前:デフォルトの名無しさん :05/03/13 04:27:58
http://www.open-std.org/jtc1/sc22/wg21/
News 2005-03-11: The C++ Standard Library Issues List (Revision 35) is available
News 2005-03-11: C++ Standard Core Language Issues List (Revision 34) is available

200 名前:デフォルトの名無しさん :05/03/13 09:47:27
>198
throw ex; → throw;

201 名前:デフォルトの名無しさん :05/03/13 21:00:57
みなさん、auto_ptrってどのくらい使ってますか?

メンバ変数をコンストラクタで初期化中に例外が発生すると、
デストラクタが発動しない。だからスマートポインタを使え・・・
ってのはよく聞きますが、実際どのくらい使われているのかと思って。

202 名前:デフォルトの名無しさん :05/03/13 21:06:58
>>201
あんまり使わない
欲しい機能がいちいち保証外だから

203 名前:デフォルトの名無しさん :05/03/13 21:15:45
>>201
俺はよく使うかな。
でもコンストラクタ中での例外に対処するために使うことはない。
bad_alloc以外が発生しそうな処理はコンストラクタに含めないようにしてる。


204 名前:デフォルトの名無しさん :05/03/13 21:24:52
>>202
保証外の欲しい機能って何?
不完全型によるインスタンス化ができないのは痛いと思ってるけど、
ほかにもあれば教えて。

>>203
メンバやベースクラスの初期化時に bad_alloc が発生したらどう対処してんの?
その基準じゃ、結局 auto_ptr 相当の必要性に変わりが無いんじゃない?

205 名前:デフォルトの名無しさん :05/03/13 21:34:58
コンテナに使えない

206 名前:デフォルトの名無しさん :05/03/14 03:01:39
^^^^^^^^^^^

207 名前:デフォルトの名無しさん :05/03/14 03:04:32
STLのcontainerに使えない(Effective STL Item 8)。

208 名前:デフォルトの名無しさん :05/03/14 03:13:08
コンテナに入らないのが理由で auto_ptr 使わないって、アホか。
コンテナに入らないから参照型も使いませんってか?

209 名前:デフォルトの名無しさん :05/03/14 03:30:26
std::auto_ptr は割と使えるぞ

何より標準で入ってるってのがでかい

210 名前:デフォルトの名無しさん :05/03/14 09:39:51
教えてください。
クラスを作るときに、コンストラクタを1つも定義しなかった場合、
そのオブジェクトを作るときに何もしないデフォルトコンストラクタが
呼び出されるのかと認識していたのですが、とある本には、コンストラクタを
1つも定義しない場合は、コンストラクタが呼び出されないという表現になって
いました。動きとしては変わらないですが、どちらが正解なんでしょうか?
てっきりデフォルトコンストラクタを自分で定義することは、オーバーライド
することだと思ってましたが、デフォルトコンストラクタを定義せずに他の
コンストラクタを定義した時点で、デフォルトコンストラクタが使えなくなる
という点では、ちょっと異質ですよねぇ。

211 名前:デフォルトの名無しさん :05/03/14 09:52:21
>>210
「何もしないデフォルトコンストラクタが呼び出される」が正解。

だがデフォルトコンストラクタを自分で定義することは、
ちょっと異質な点があることからわかるように、オーバーライドすることではない。

212 名前:デフォルトの名無しさん :05/03/14 10:04:27
>>210
その「とある本」の題名を晒した後、焼き払え。

213 名前:210 :05/03/14 10:12:35
レスどうもです。
そうですか、やはりコンストラクタはいかなるときも呼び出される
わけですね。
ちなみに読んだ本は「C++ Primer」ですが、翻訳本ですし、自分の
とり方が間違った可能性もあるので、もう一度読み返してみます。
今は手元にないですが・・・。

214 名前:デフォルトの名無しさん :05/03/14 11:32:19
次のようなクラスcomplexを定義したとします(§11.3[Stroustrup, 1997])。
class complex {
  T re, im;
public:
  complex& operator+=(complex a) {
    re += a.re;
    im += a.im;
    return *this;
  };
  // ...
};
この定義で、complex a, b; a += b;といったコードが書けるようになります。
このクラスに、例えばdouble型の値を加算する、double d; a += d;を実現するには
  complex& operator+=(double a) { re += a; return *this; };
をメンバに追加します。
ここで、double型に限らず、T型とのoperator+=が定義されている任意の型との加算を
実現するには、
  template<class T> complex& operator+=(T a) { re += a; return *this; };
と書きたくなります。ところが、これではテンプレートのTがcomplexを含んでしまうため、
  template<> complex& operator+=<complex>(complex a);
と特殊化を定義します。が、これはコンパイルが通りません、、
このように、「complex型(自分自身)」の場合と、それ以外の型の場合とで処理を分けるには
どう書けば良いのでしょうか。


215 名前:デフォルトの名無しさん :05/03/14 11:35:51
>>214
「complex型(自分自身)」の場合を非templateで宣言して、
それ以外の型の場合に使われるtemplateを宣言したのではダメですか?

216 名前:デフォルトの名無しさん :05/03/14 11:37:31
>>214
コンパイルが通りませんって、エラーメッセージくらい貼れよ。

217 名前:デフォルトの名無しさん :05/03/14 12:06:31
>>214 書き写しミスでしたので訂正します。
- T re, im;
+ double re, im;
const complex& aのようにリファレンス使えといった点は、単純化のため考えないとしてください。

>>216
main.cpp:42: error: explicit specialization in non-namespace scope `class complex'
main.cpp:42: error: invalid use of undefined type `class complex'
main.cpp:37: error: forward declaration of `class complex'
main.cpp:42: error: abstract declarator `complex&()(complex)' used as declaration

main.cpp:42: error: syntax error before `{' token
main.cpp:44: error: syntax error before `+=' token

main.cpp:47: error: syntax error before `}' token

main.cpp: In member function `complex& complex::operator+=(T) [with T = complex]':
main.cpp:54: instantiated from here

main.cpp:41: error: no match for 'operator+=' in 'this->complex::re += a'
37: class complex {
38:   double re, im;
39: public:
40:   complex() : re(0), im(0) { };
41:   template<class T> complex& operator+=(T a) { re += a; return *this; };
42:   template<> complex& operator+=<complex>(complex a) {
43:     re += a.re;
44:     im += a.im;
45:     return *this;
46:   };
47: };


218 名前:デフォルトの名無しさん :05/03/14 12:11:07
>>215
その場合、template<class T> 〜operator+=(T a)の定義はインスタンス化は行われないのですか?
つまり、コンパイラは、正確に一致する場合(§7.4[禿3rd]の[1])と、それ以外とを識別するので
テンプレートの特殊化を使わなくてもいいということですか?

次のコードはコンパイルが通り、望み通りの動きをします:
complex& operator+=(complex a) { re += a.re; im += a.im; return *this; };
template<class T> complex& operator+=(T a) { re += a; return *this; };


219 名前:デフォルトの名無しさん :05/03/14 12:15:05
それ以前になぜ引数でconst 参照渡しをしないの?
コピーコンストラクタの大量発生が起きない?

220 名前:デフォルトの名無しさん :05/03/14 14:59:06
DLLで、スレッド + newでメモリ確保したとする。

・複数のプログラムからそれぞれDLLがロードされたら
1.スレッドもメモリも共有される
2.そんなバナナ

・同じプログラムから複数回DLLがロードされたら
1.スレッドもメモリも共有される
2.そんなバナナ



221 名前:デフォルトの名無しさん :05/03/14 15:05:43
独り言はMeadowにでも書いてろボケが

222 名前:デフォルトの名無しさん :05/03/14 15:07:13
>>220
上:2(やろうと思えばメモリの共有は出来る)
下:1
同一プロセスなのかどうかが分かれ目。

223 名前:デフォルトの名無しさん :05/03/14 15:47:01
>>219
実際には const 参照渡しすべきですが、>>217で書いたとおり、単純化のためと考えてください。

>>218
調べ直したところ、「§13.3.2 関数テンプレートの多重定義」[禿3rd]に
多重定義解決規則が載っていました。疑問は晴れました。

例(これも引数は本来const T&とすべきです):
class complex {
 double re, im;
public:
 complex() : re(0.0), im(0.0) { };
 complex(double a, double b) : re(a), im(b) { };
 virtual complex& operator+=(complex a) { re += a.re; im += a.im; return *this; };
 template<class T> complex& operator+=(T a) { re += a; return *this; };
};
これを使い、
 complex a(5.0, 3.0), b(2.0, 4.0); double d = 10.0;
 a += b;  // ok, 多重定義解決規則[4]適用
 a += d;  // ok, T=double
complexを継承した場合、すなわち
class dcomplex : public complex {
public:
 friend class complex;
 dcomplex(double a, double b) : complex(a, b) {};
};
の場合の挙動について微妙に気になる点がありますが、それについてはもうちょっと整理します。

224 名前:デフォルトの名無しさん :05/03/14 16:50:10
>>220
http://www.biwa.ne.jp/~chu0296/laboratory/vcl1-50.html#vcl49
こんなことがやりたいんじゃないのか

225 名前:デフォルトの名無しさん :05/03/14 17:06:47
>>224
TlsAlloc()で取得したインデックスってどうやってスレッド毎に管理してるんだ?
呼び出しもとのスレッドから引数が渡されてるようにも見えんし、dllマネージャ
みたいのがいて、管理してんのかな。

226 名前:デフォルトの名無しさん :05/03/14 17:07:57
つーか環境依存だし

227 名前:デフォルトの名無しさん :05/03/15 13:37:22
質問です。setやmapってソートの基準を動的に変えることが可能ですよね?
たとえばソートの基準の型(クラス)でMyCmpクラスをつくってですね、

MyCmp mcmp;
set<int> iset(mcmp);

のようにsetのコンストラクタ引数にソートの基準を定めるオブジェクトを
わたしてやるという寸法です。このMyCmp自体は、コンストラクタ引数で
なんらかの情報をうけとり、それによりソートの基準を変化させるように
すれば、動的に基準を変えることができるかと思います。

MyCmp mcmp(MyCmp::desc); //クラス内でenum型{asc, desc}を定義 デフォルトはasc
set<int> iset(mcmp);

ここで思ったのは、一時オブジェクトわたせばいいのでは?ということでやってみると

set<int> iset(MyCmp()); // ok
set<int> iset(MyCmp(MyCmp::desc)); // エラー VC++.net

ということになってしまいました。
もともと一時オブジェクトを渡すこと自体が、文法エラーなのでしょうか?
それとも渡し方に問題があるのですかね。
あと、エラーメッセージが、関数がどうたらとわけわからんものでしたので、
もしや関数の宣言としてとられたりとか、そういうことなのでしょうか?

ちなみにこれは「標準C++ライブラリ チュート&リファ」の内容を参考にした
のですが、同書ではいったんオブジェクトを作成してましたね。

この問題は、どう考えればいいのでしょうか?

228 名前:デフォルトの名無しさん :05/03/15 13:48:36
>setやmapってソートの基準を動的に変えることが可能ですよね?
不可能

229 名前:デフォルトの名無しさん :05/03/15 13:49:45
基準の型そのものじゃなくて、基準の話ですよ?


230 名前:227 :05/03/15 13:54:04
あ、ちょっと訂正
set<int>じゃなくてset<int, MyCmp>ですかね。

231 名前:デフォルトの名無しさん :05/03/15 14:17:43
コンテナの比較基準を変更した瞬間ソートの保証が壊れる。やるな阿呆

232 名前:227 :05/03/15 14:22:31
比較基準を変更というのは、あくまでsetのインスタンスを確保する
前の話ですよ?その前の段階でMyCmpオブジェクトの振る舞いを制御
するということですよ。一度setオブジェクト作ったら基準は変えませんよ。


233 名前:デフォルトの名無しさん :05/03/15 14:52:18
それじゃ静的・・・

234 名前:デフォルトの名無しさん :05/03/15 14:58:51
>227
要するに述語のインスタンスに(降順か昇順か等の)状態を持たせて,
それをsetやmapに渡してソートの基準を制御しようとしているんですか?
だとすると言えるのは以下です.

 -setやmapには述語のインスタンスを渡す方法は存在しない.
  テンプレート引数として渡すことができるだけ
 -そもそも述語に状態を持たせるのは基本的に避けるべき
 -set<int> iset(MyCmp());が通るのはいわゆる「最も奇妙な解析」の結果.
  227さんが期待しているものとは全く異なる

235 名前:227 :05/03/15 15:01:12
動的という意味は、プログラムの実行時にという意味ですよ?
setのインスタンスを確保する前段階で、MyCmpオブジェクトの
パラメータを動的にいじり、振る舞いを変えることは可能ですよね?
動的の意味を、setの生存期間中にという意味にはき違えてるのでは?
というかなぜ質問してる自分がレクチャーしてるのだろう・・・鬱

236 名前:234 :05/03/15 15:01:48
うひゃあ.すごい間違いしてしまった.

>-setやmapには述語のインスタンスを渡す方法は存在しない.
> テンプレート引数として渡すことができるだけ
これ間違いです.すいません.

237 名前:234 :05/03/15 15:04:05
>set<int> iset(MyCmp(MyCmp::desc));
これが関数宣言として認識されているんじゃないですか?
set<int> iset((MyCmp(MyCmp::desc)));
としてみるとか.

238 名前:デフォルトの名無しさん :05/03/15 15:04:08
> set<int> iset(MyCmp());

「引数を取らずMyCmp型を返す関数」へのポインタを引数として取り、
set<int>型を返す関数isetの宣言ですな。

239 名前:227 :05/03/15 15:05:43
>>234
おお、ようやく本題に・・・w

MyCmp mcmp(MyCmp::desc); //クラス内でenum型{asc, desc}を定義 デフォルトはasc
set<int> iset(mcmp);

これは可能ですよね?というか、可能です。
setやmapのコンストラクタには、ソートの基準を引数として受け取るものがあるので。
これができるということを受けて、一時オブジェクトでは?という話です。

240 名前:デフォルトの名無しさん :05/03/15 15:07:08
リロードしてから書き込もうよ。

241 名前:デフォルトの名無しさん :05/03/15 15:07:11
Effective STL くらい嫁と言いたい

242 名前:デフォルトの名無しさん :05/03/15 15:07:37
>>235
>>230でいけるはず。

>>234
explicit set( const Compare& comp = Compare(),
  const Allocator& allocator = Allocator() );
setのデフォルトコンストラクタは比較関数オブジェクトを引数にとるんだよ。
ただし一度生成されたsetの持つ比較関数オブジェクトの状態を変更する
ことは当然出来ないが、227氏はそれを承知しているみたいだ。




243 名前:デフォルトの名無しさん :05/03/15 15:08:43
set<T, C> hoge(C(moge));
ならできるだろ? Cがmogeをコンストラクタ引数に取れる関数オブジェクトである必要があるが。

244 名前:227 :05/03/15 15:10:58
>>238
やっぱりそう解釈されてしまいますかね。
それを回避するテクニックで、
set<int, MyCmp> iset(MyCmp(MyCmp::desc));
において、コンストラクタの引数となっているMyCmp(MyCmp::desc)をさらにカッコで囲み
set<int, MyCmp> iset((MyCmp(MyCmp::desc)));
とやってもダメなようです。たとえ関数宣言の誤解を解いたとしても
一時オブジェクトを渡すのはだめなのでしょうかね。



245 名前:デフォルトの名無しさん :05/03/15 15:17:24
>それを回避するテクニックで
パラメータを括弧でかこってもダメだから問題になってるんあろ
アホか

246 名前:227 :05/03/15 15:20:48
>>245
パラメータってなんのこと言ってるんですか?

247 名前:デフォルトの名無しさん :05/03/15 15:22:00
>>245
パラメータを括弧でくくったら宣言としては不正だよ

248 名前:デフォルトの名無しさん :05/03/15 15:26:29
>>227
VCはその初期化を関数宣言だとみなした上で文句を言っている。
確か、規格では、関数宣言として正しくなければ、
初期化として見直さなければいけないはずだから、これはVCが悪いと思う。
g++3.4.1(mingw)だと通ったし。

249 名前:デフォルトの名無しさん :05/03/15 15:26:34
>244
いや,それで通らないのはおかしいです.一時オブジェクトを受け付けるはずです.
疑うとすればMyCmp::descあるいはMyCmpのコンストラクタかと.

250 名前:デフォルトの名無しさん :05/03/15 15:28:26
ここらでエラーメッセージが知りたい


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