5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

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
ここらでエラーメッセージが知りたい

251 :デフォルトの名無しさん:05/03/15 15:28:56
MyCmpのコンストラクタ、コピーコンストラクタ、operator()のどれかがまともじゃないに1カノッサ

252 :デフォルトの名無しさん:05/03/15 15:31:23
くだらない解決策だけど、
std::set<int, my_cmp> s(my_cmp(static_cast<my_cmp::order>(my_cmp::desc)));
(orderはdescの型)

253 :デフォルトの名無しさん:05/03/15 15:31:24
>>227
cl ver13.10.3077でコレ通った。多重の括弧を除くと、insert()の行で
「isetが'overloaded-function'だ」と言うお叱りを受ける。

#include <set>
struct MyCmp
{
    enum rule {asc, desc} r_;
    MyCmp() : r_(asc) {}
    MyCmp(rule r) : r_(r) {}
    bool operator()(int x, int y)
    {
        return r_ == asc ? x < y : x > y;
    }
};
int main()
{
    std::set<int, MyCmp> iset((MyCmp(MyCmp::desc)));
    iset.insert(3);
}

254 :デフォルトの名無しさん:05/03/15 15:32:39
>>227氏は

 set<int,MyCmp> iset( MyCmp( MyCmp::desc ) );
 set<int,MyCmp> iset( ( MyCmp( MyCmp::desc ) ) );

この2つでテストしてダメならエラーメッセージを提示してくれ。
上はともかく下は通るはずだ。
通らなかったら、MyCmpが怪しい。



255 :248:05/03/15 15:32:56
g++では二重の括弧は要らなかった。念のため。

256 :デフォルトの名無しさん:05/03/15 15:39:10
規格では>>254の上のやつでも規格上問題ないよね?
MyCmp::desc は変数名としても型としてもおかしいし

257 :デフォルトの名無しさん:05/03/15 15:40:54
了解しました。
昨日実験してだめだったコードは、本から引っ張ってきたものですが
今、家ではないので正確にはわかりません。
帰宅してから、貼り付けます。夜になってしまうと思いますが。


258 :デフォルトの名無しさん:05/03/15 15:41:05
Visual C++ .NET 2003で試しました.

#include <set>
class MyCmp{
public:
enum order{asc, desc};
MyCmp(order const &o)
{ }
};

int main(){
std::set<int, MyCmp> iset(MyCmp(MyCmp::desc));
//std::set<int, MyCmp> iset((MyCmp(MyCmp::desc)));は通る
}

error C2751: 'desc' : the name of a function parameter cannot be qualified

一重のカッコが通らないのはVCの欠陥でしょうね,恐らく.(>248)

259 :227:05/03/15 15:41:57
あ、>>257は自分です。

260 :デフォルトの名無しさん:05/03/15 15:43:30
2005 beta 持ってる人にも>>254試して欲すぃ

261 :デフォルトの名無しさん:05/03/15 15:44:21
>>260
だめだった。

262 :デフォルトの名無しさん:05/03/15 15:46:54
>>261
トンクス
VC は相変わらず詰めが甘いですなあ

263 :デフォルトの名無しさん:05/03/15 15:51:45
>>258
Metrowerks CodeWarrior for Windows v8.3でも
std::set<int, MyCmp> iset(MyCmp(MyCmp::desc));が関数宣言だとみなされる。

264 :デフォルトの名無しさん:05/03/15 16:05:21
次のwに似てないか?

struct S {
    S(int);
};
void foo(double a) {
    S w(int(a));
}
(ISO/IEC 14882:1998 8.2 Ambiguity resolution -1 Exampleより)

265 :デフォルトの名無しさん:05/03/15 16:12:46
>>264
そのwはint型引数aをとるSを返す関数でしょ
今回のとはちと違うと思う

266 :デフォルトの名無しさん:05/03/15 23:18:05
>>211
無いものを呼び出すことはできんがなあ……
暗黙に何もしないデフォルト・コンストラクタが合成されることはないはず……

267 :デフォルトの名無しさん:05/03/15 23:26:50
Effective C++の45項ネタかな

268 :デフォルトの名無しさん:05/03/16 00:07:00
45P だな。

269 :デフォルトの名無しさん:05/03/16 00:22:59
struct onepair {
  std::string first;
  std::string second;
};
は、safe だろうか、out だろうか。

コンストラクタを定義しないと、インスタンスを作った時に
何もされないと思ったので、std::string のコンストラクタも
呼ばれなくて、まずいんちゃうかと思ったんだが…
実際、BC++ で実験してみたが、特に問題なく動作してしまっている。

std::string を自前のクラスにしてみたところ、ちゃんと
メンバーのコンストラクタも呼ばれているみたいなんだが、
これって、処理系依存コードなんだろか。規格上は、どうなってんだろ。
(その Effective C++ とかの本を持ってないので、教えてくれー)

270 :デフォルトの名無しさん:05/03/16 00:31:49
>>269
そいつは包含(コンポジション)だから、クラスそのもののコンストラクタの有無に
関わらず、クラスメンバのデフォルトコンストラクタが呼び出される。

271 :デフォルトの名無しさん:05/03/16 00:32:50
メンバ変数のコンストラクタは普通に呼ばれるんじゃないの?

272 :デフォルトの名無しさん:05/03/16 00:33:11
すまん、リロードするべきだったな。

273 :デフォルトの名無しさん:05/03/16 00:39:16
>>270 >>271

ありがとん。それを聞いて一安心だ。
マジで感謝!

# C言語経験済みのC++初心者に、
# 「std::string 使えー」と言っちゃった時に
# struct の中で使われて、ハマらないか心配だったんだ。
#
# コンストラクタを説明するのが面倒というわけじゃないんだけど
# 一度に説明すると、頭があふれちゃう人が多いから…



274 :デフォルトの名無しさん:05/03/16 00:45:19
>>269
コンストラクタを宣言しなければ、 class C に対して
C() {} というコンストラクタが暗黙のうちに定義される。

コンストラクタの初期化リストに現れないメンバに対しては
それぞれデフォルトの初期化が適用される。

デフォルトの初期化では、PODは不定値となり、
それ以外はデフォルトコンストラクタが実行される。
(PODに対しては「何も行わない」という実装が可能)

275 :デフォルトの名無しさん:05/03/16 00:48:55
そうだね。クラスの初期化リストに現れているメンバについては
デフォルトコンストラクタは呼び出されないや。規格書だなこういう時は。

276 :269:05/03/16 01:03:29
>>274

ふむふむ、なるほど。
POD って、文脈からすると、古典的な型(int とか、コンストラクタの無い構造体)っぽく
聞こえますが、そういう認識でオケーでしょうか?

あと、調子に乗って、も一つお聞きしたいんですが、
以上を踏まえると、コピーコンストラクタの未定義時の動作も
メンバ単位でのコピーコンストラクタ呼び出しを試みてくれると
考えてよろしい…んでございますよね?

いや、実験はして、呼び出してくれてるみたいなんで、
多分、そうなんかなとは思うんですが。
(この夜中にしょうもない質問につきあっていただき、実にありがたく)


277 :デフォルトの名無しさん:05/03/16 01:15:45
>>276
そんなに心配なら、規格なりFDISなり読めよ。

278 :デフォルトの名無しさん:05/03/16 01:17:11
>>277

あー、たしかに調子に乗りすぎました。
とりあえず、ここまで教えていただいただけでも
とても助かりました。どうも、ありがとうございました。m(_ _)m

279 :デフォルトの名無しさん:05/03/16 01:20:52
std::string
このやり取り見てて思ったんだが(馬鹿な質問だったらすまん)内包クラスのことだよな?
つまり、クラスの中で宣言されてるクラスの事、と認識したんだけど合ってる?

合ってるなら話を先に進めて、内包クラスって外からもクラス定義として見えるの?
見えるんだったら内包する意味がわからないし、
見えないんだったらこの会話がおかしいよな。

っていうか、俺がおかしいのか?

280 :デフォルトの名無しさん:05/03/16 01:30:35
>>279
「内包クラスのことだよな?」って、何を指して言ってるのかもわからないし、
「内包クラス」自体もはっきりわからない。

つまり、おまえがおかしい。

281 :デフォルトの名無しさん:05/03/16 01:38:23
pugya-

282 :デフォルトの名無しさん:05/03/16 01:44:51
>>279
> std::string
> このやり取り見てて思ったんだが(馬鹿な質問だったらすまん)内包クラスのことだよな?
> つまり、クラスの中で宣言されてるクラスの事、と認識したんだけど合ってる?

多分あっているような。。

> 合ってるなら話を先に進めて、内包クラスって外からもクラス定義として見えるの?

見えるように、内包クラス(?)の型宣言を、そのソース(あるいは#include している
ヘッダ)の中に置かないと、そのクラスのインスタンスを(別のクラスのメンバーとしても)
宣言できないし(参照やポインタだけなら、その限りにあらず)

283 :282:05/03/16 01:46:59
あ、見える/見えないの話が private/public とかに絡んだ話だったら、
この限りにあらず。多分、ちゃうと思うけど

284 :デフォルトの名無しさん:05/03/16 01:55:36
用語の使い方がいい加減な者の相手をするのは時間の無駄。

>>280,>>282
無駄にスレ消費してしまうだけから回答するな。

285 :デフォルトの名無しさん:05/03/16 02:12:05
>>279
言ってる事はオカシイが、言いたい事は解る。
お前、内部クラスと間違ってないか?JAVAの世界に帰れ。

内包(コンポジット)ってのは、その、まあ、簡単に言うと、
メンバにオブジェクトを持つ事だ。「オブジェクトコンポジション」で検索して来い。


286 :285:05/03/16 02:15:58
>>279
269が心配してるのは、
---------------------------------
struct onepair {
  int first;
  int second;
};
メモリは確保されますか?
---------------------------------
とかそのレベルの話だ。お前の考えてる事とはかなり違う。


287 :279:05/03/16 02:24:23
すみません、出直してきます・・・・・・・

288 :デフォルトの名無しさん:05/03/16 02:27:41
メンバ変数ってm_つけないですか?

289 :デフォルトの名無しさん:05/03/16 02:31:23
>>288
早急に↓こちらへ非難してください。
ttp://pc5.2ch.net/test/read.cgi/tech/1096687703/
ttp://pc5.2ch.net/test/read.cgi/tech/1068752664/

290 :マイク ◆yrBrqfF1Ew :05/03/16 04:25:37
データメンバはサフィックスにアンダバー。
初心者はよく`m_'のサフィックスを使う。

291 :マイク ◆yrBrqfF1Ew :05/03/16 04:26:19
いやプレフィックス。

292 :デフォルトの名無しさん:05/03/16 06:40:23
>279
スレの無駄だし、馬鹿にしてる気がするが一言、
stdがnamespaceだってのは当然分かってるよな?

293 :デフォルトの名無しさん:05/03/16 08:48:37
delete thisの話はFAQなんだけど、
似たようなケースで
自分自身を再構築するというのもありだよね?

あるclassが、内部に持っている別のデータ(のポインタ)に極端に依存していて
そのデータが大幅に更新されていた時に作り直したいんだけど、
具体的には
class hoge {
 Data *data;
 ...;
 hoge(Data *) { ... }
 void update() {
  Data *np = check_update(data);
  if (np != data) {
   this->~hoge();
   new (this) hoge(np);
  }
  //以下、何事もなかったかのように続行
 }
};
のような。
メンバ関数を、「thisを引数に持つ以外は普通の関数と同じ」と仮定すれば
当然動くはずなんだけど
以後も処理が継続するメンバの内部でこれをやるのは
規格上はあまりよろしくないのかな。

294 :デフォルトの名無しさん:05/03/16 08:57:16
んー、もう一度考えると
最初のthis->~hoge()が終了した時点でもthisの値が有効であることは、
規格上はおそらく保証してないんだろうな。

とするとnew (this) hoge()の呼び出しをする時のthisは
どこを指しているかわからないから
やっぱり鼻から悪魔なのかも。

295 :デフォルトの名無しさん:05/03/16 09:32:32
あれ、でもそれだけなら
thisを直接使わないで
一時変数に代入してそれを使って再構築すれば
仕様上も問題ないか。

296 :デフォルトの名無しさん:05/03/16 09:39:26
>>295
あれこれ試行錯誤するのは構わないから、検証してから報告してくれ。

297 :デフォルトの名無しさん:05/03/16 10:05:36
レスを読んでると、コンストラクタってのは、未定義で自動的に起動する
何もしないコンストラクタまたは定義したコンストラクタの初期化メンバ
リストにないメンバーは、自動的にデフォルトコンストラクタを呼びだすの?
じゃ、クラスをメンバにもってたら、そのクラスのデフォルトコンストラクタ
を読んだあと、そのクラスのメンバのデフォルトコンストラクたも呼びだす
みたいなループになったりもするの?

298 :デフォルトの名無しさん:05/03/16 10:21:06
>>297
EffectiveC++でも読め。
それから日本語も勉強しとけ。
クラスのメンバであるクラスは、大きなクラスの初期化に先立って初期化リストに従って初期化される。

299 :デフォルトの名無しさん:05/03/16 10:36:57
>>298
よく解読できたな。

300 :デフォルトの名無しさん:05/03/16 11:07:32
コンストラクタやデストラクタって、
明に呼び出したりするものなんですか?


301 :デフォルトの名無しさん:05/03/16 11:10:41
>>300
あまりない。

302 :227:05/03/16 11:20:24
昨日コード貼っつけることになってましたが、寝ちまいました失礼。
ソートの基準クラスはこれ。昨日参加してない人はスルーしてください。

template<class T>
class MyCmp{
public:
enum cmp_mode{asc, desc};
MyCmp(cmp_mode m=normal):mode(m){}
bool operator()(const T& t1, const T& t2) const{ //要素の比較
return mode == asc ? t1 < t2 : t2 < t1;
}
bool operator==(const MyCmp& mc){ //ソートの基準の比較
return mode == mc.mode;
}
private:
cmp_mode mode;
};

303 :227:05/03/16 11:26:56
ドライバは適当に作りました。

#include <iostream>
#include <set>
using namespace std;

int main()
{
MyCmp<int>::cmp_mode vmode;
char c;

do{
cout << "Input order(a or d)=>"; cin >> c;
switch(c){
case 'a': vmode = MyCmp<int>::asc; break;
case 'd': vmode = MyCmp<int>::desc; break;
default : c = '\0'; break;
}
}while(!c);

MyCmp<int> mcmp(vmode);
set<int,MyCmp<int> > iset(mcmp);
// 代替案(一時オブジェクト) TEST: Borland C++ 5.5.1
//set<int,MyCmp<int> > iset(MyCmp<int>(vmode)); //エラー
//set<int,MyCmp<int> > iset((MyCmp<int>(vmode))); // ok
//set<int,MyCmp<int> > iset(MyCmp<int>()); //エラー
//set<int,MyCmp<int> > iset((MyCmp<int>())); //エラー

iset.insert(4);iset.insert(3);iset.insert(5);
iset.insert(1);iset.insert(6);iset.insert(2);
copy(iset.begin(),iset.end(),ostream_iterator<int>(cout," "));
}

304 :デフォルトの名無しさん:05/03/16 11:27:43
>>302
> cmp_mode m=normal
コレ、コンパイル通るのか?

305 :227:05/03/16 11:32:24
もともと.net非2003で起きたことでしたが、昨日時間なくて再テスト
できませんでした。今はBorlandしか試せません。コンパイラによって
クセがあるのかもしれませんね。著者もそのあたりを気にして
一時オブジェクト使わなかったのかもしれません。

306 :デフォルトの名無しさん:05/03/16 11:32:43
setは使わないほうがいいよ。以外に消費メモリが大きい。
map > set > list > vector
後々、順序づけの方法を変えたくなるのが人の常。仕様変更に弱い。
並べ替えされた配列も欲しくなる。setだけでなく、mapも仕様変更に弱い。

素直にvectorにするというのが普通だと思う。

307 :227:05/03/16 11:34:59
あ、編集ミスでしたw。
cmp_mode m=asc
にしてください。昨日asc,descでやったので、本のコードも
それに書き換えたのですが、漏れがありました。(本はnormal,reverse)
ってことで、デフォルトコンストラクタのものもエラーに
なりませんかね。失礼。

308 :227:05/03/16 11:37:44
テスト結果には影響なかったみたいです。しかしnoramlのままで
コンパイル通るbcc素敵ですね。

309 :デフォルトの名無しさん:05/03/16 11:38:29
vectorは使わないほうがいいよ。以外に挿入のコストが大きい。
vector > deque > map > set >
後々、要素数の規模を変えたくなるのが人の常。仕様変更に弱い。
無効化されないイテレータも欲しくなる。vectorだけでなく、dequeも仕様変更に弱い。

素直にsetにするというのが普通だと思う。

310 :デフォルトの名無しさん:05/03/16 11:39:25
>>303
cl ver13.10.3077
//set<int,MyCmp<int> > iset(MyCmp<int>(vmode)); //エラー
//set<int,MyCmp<int> > iset((MyCmp<int>(vmode))); // ok
//set<int,MyCmp<int> > iset(MyCmp<int>()); //エラー
//set<int,MyCmp<int> > iset((MyCmp<int>())); //ok

Metrowerks CodeWarrior for Windows v8.3
//set<int,MyCmp<int> > iset(MyCmp<int>(vmode)); //エラー
//set<int,MyCmp<int> > iset((MyCmp<int>(vmode))); // ok
//set<int,MyCmp<int> > iset(MyCmp<int>()); //ok ←コレは誤りだろ…鬱
//set<int,MyCmp<int> > iset((MyCmp<int>())); //ok

311 :227:05/03/16 11:48:57
すごいばらつき。
.netがクソというオチでは済まなかったようですね。

312 :デフォルトの名無しさん:05/03/16 11:51:57
>>309
vector::reserve()を知らないの?
配列の途中にinsert()する意味は何なの?
無論、不可能ではないがわざわざinsert()する人は稀。

あらかじめ全体サイズの概要がわかっている、
あるいは、大きく余裕をもって確保して大丈夫という場合が多い。

この条件に該当してないかどうか、よく吟味してみることだ。

313 :デフォルトの名無しさん:05/03/16 11:55:58
あらためて>>309を読んだが、ますます>>309がアフォだと確信した。

哀れな>>309・・・。
良い上司・仕事に恵まれない、自己満足の世界に長く居すぎたのだろう。

314 :デフォルトの名無しさん:05/03/16 12:04:04
言っちゃいけないことなのかもしれないが、STLってク

315 :デフォルトの名無しさん:05/03/16 12:06:19
>>313
相手にすんな。
>>309は、該当機能があたかもsetだけのもののように思い込んでる真性だ。
listを検討対象から除外している時点で完全に真性。

316 :デフォルトの名無しさん:05/03/16 12:09:04
そもそも>>227がどういう用途に供するつもりかも分からない状態で
コンテナの選択について議論すること自体が不毛。

317 :デフォルトの名無しさん:05/03/16 12:10:41
>>312
reserve() しても途中に insert() するときの要素移動にかかるコストは消えない。
set の替わりに vector 使うなら途中に insert() するのは当たり前。

> あらかじめ全体サイズの概要がわかっている、
> あるいは、大きく余裕をもって確保して大丈夫という場合が多い。

それが理由になるのであれば、逆に
あらかじめ順序づけの方法がわかっている、
且つ、並べ替えされた配列はイテレータで代用して大丈夫という場合が多い
とも言える。

vector で代用したほうがいいケースがあるのも確かだが、
特に前提が無い場合は素直に set を使ったほうが、
ソースコード量、複雑さともに優れている。

318 :デフォルトの名無しさん:05/03/16 12:19:30
>>309
は挿入位置の後の参照とiteratorうんぬんのことじゃないの?


319 :デフォルトの名無しさん:05/03/16 12:32:03
>>227がset/mapだけを使うことにとりつかれた亡者にしか見えない。

320 :デフォルトの名無しさん:05/03/16 12:39:32
>>319
眼科行ったほうがいい。

321 :デフォルトの名無しさん:05/03/16 12:44:18
std::vector::reserve()って、コンテナへの要素の挿入中に、メモリの再割り当て
が起きないようにあらかじめ空コンテナを用意しておくだけの話だぜ。別に呼び出さなく
ても、空コンテナがなくなると自動的にreserve()してくれるしな。

ただし、デフォルトコンストラクタを呼び出すstd::vector::resize()とは違い、要素
の数が増えるわけではない。

322 :227:05/03/16 12:47:23
誤解しないで欲しいのは、質問したのはあくまで
言語学習の過程で起きた疑問からです。
何を作ってるわけでもないです。
まぁ設計論もけっこうですが、自分は関わりませんw

323 :デフォルトの名無しさん:05/03/16 12:54:22
素直に選ぶならsetじゃなくてlistじゃないの。

324 :デフォルトの名無しさん:05/03/16 12:54:39
>>322
俺も設計論はどうでもいいが、
>まぁ設計論もけっこうですが、自分は関わりませんw
馬鹿かお前。

325 :227:05/03/16 13:50:42
>>324
どちらかというと、その突っ込み(というか言いがかり)のほうが
馬鹿だと思いますがw

326 :227:05/03/16 13:58:17
>>325
偽者が現れたところで退散しますw
後は好きにどうぞ
どうもでした〜

327 :デフォルトの名無しさん:05/03/16 14:09:15
どうでもいいが、ム板で[w]使わないほうがいいぞ
アホにしか見えん 使ってる奴探してみ

328 :デフォルトの名無しさん:05/03/16 14:14:24
そういう見方しかできないお前がアホだ

329 :デフォルトの名無しさん:05/03/16 14:17:42
>>327
俺も君の意見に賛成できるな。
技術系スレの真剣な質問・回答のハザマに出現する荒しは、かなり見苦しい。

330 :デフォルトの名無しさん:05/03/16 14:24:37
wはともかく、論拠を一切示さないレスはアホっぽいな
具体的には>>313とか、勝ち馬に乗りたいだけな気がする

331 :デフォルトの名無しさん:05/03/16 14:31:40
荒らしと、'w'使うこととは、別のことだろ
荒らしってのは、無根拠に馬鹿とかアホとかいって煽ってる
連中だな。

それに、むしろム板とか言ってここに精通してますみたいな奴の方が
人間として終わってる場合が多い。

332 :デフォルトの名無しさん:05/03/16 14:32:35
とりあえずset厨はlistを使わなかった理由を100字以内で書け。
限りなく反省文・始末書に近くなるだろうが、逃げずに頑張れ。

333 :デフォルトの名無しさん:05/03/16 14:40:53
まずset厨とは誰のこと言ってるのか
それを明らかにする必要はあるな
少なくとも227は、単に解説書を読んでいて
躓いた箇所を質問しているだけのようだし
コードも解説書から引用してるだけなので
set厨ではないわけだが…

334 :デフォルトの名無しさん:05/03/16 14:44:13
おまえらスレ違いですよ。
↓こちらへどうぞ。

最高に頭悪そうな発言してください in ム板 (IV)
http://pc5.2ch.net/test/read.cgi/tech/1108989422/


335 :デフォルトの名無しさん:05/03/16 15:03:49
>>333
人が vector 使ってるのを見つけて
「素直に set にするのが普通」などと
莫迦な事をいう >>309 の事じゃないかと推測。

336 :デフォルトの名無しさん:05/03/16 22:29:54
人が set 使ってるのを見つけて
「素直に vector にするのが普通」などと
莫迦な事をいう >>306 はvector厨?

337 :デフォルトの名無しさん:05/03/16 23:21:26
なぜ「アプリケーションの要件に依る」という当たり前の結論がでませんか

338 :デフォルトの名無しさん:05/03/16 23:24:48
>>337
簡単だ。それは誰も求めない結論だからだ。

339 :デフォルトの名無しさん:05/03/16 23:25:11
>>337
お前、対人コミュニケーションできないだろ?

340 :309:05/03/17 00:05:08
なんだこの流れ?悪いのはおれか?そんなわけないよな?

341 :デフォルトの名無しさん:05/03/17 02:05:18
>>340
お前だ

342 :デフォルトの名無しさん:05/03/17 02:53:29
>>339
お前のほうができなさそうなのは、一種の自爆ギャグ?

343 :デフォルトの名無しさん:05/03/17 03:06:22
ワロス

set厨の>>336が必死にlistの話を避けているのが涙ぐましい。

344 :309:05/03/17 07:19:13
>>343
やっぱりわからんな。
set厨ってのは >>309 を指して言ってるんじゃないのか?
listの話ってなんだ?

345 :デフォルトの名無しさん:05/03/17 09:03:24
ちゅうか使い分けるだけだと思うが、コンテナ。


346 :デフォルトの名無しさん:05/03/17 11:19:19
もういいだろ、その話は。
ハッシュ最強ということで。

347 :デフォルトの名無しさん:05/03/17 11:26:11
ハッシュ関数がウンコだと最弱になる

348 :デフォルトの名無しさん:05/03/17 11:32:46
boostにハッシュないよね?
なぜ?

349 :デフォルトの名無しさん:05/03/17 11:45:01
>>348
STLportにあったから。
…かどうかは知らんが今作ってる最中。

標準C++ライブラリにunordered_mapって名前で入ることになったしな。

350 :デフォルトの名無しさん:05/03/17 11:52:30
次の標準化への動きって、どうやって知ることができるの?
なんかサイトがあるの?


351 :デフォルトの名無しさん:05/03/17 12:34:33
>>350
あるけど、お前にだけは教えてやら無い。

352 :デフォルトの名無しさん:05/03/17 12:59:49
どうせ晒しても日本語版は無いですかとか聞き返されるのがオチ

353 :デフォルトの名無しさん:05/03/17 12:59:59
>>342
見てて悲しくなってきた。日本人の知能の低さ…

354 :デフォルトの名無しさん:05/03/17 13:02:35
日本語版は無いのですか?

355 :デフォルトの名無しさん:05/03/17 13:03:20
>>353
朝鮮人はお呼びじゃないです ;-)

356 :デフォルトの名無しさん:05/03/17 13:03:49
>>353
お前、ひょっとして「竹島問題」でファビョり中の、話題の韓国人か?

357 :デフォルトの名無しさん:05/03/17 13:06:58
ム板でこの手の話題みるようになっちゃ終わりだな

358 :デフォルトの名無しさん:05/03/17 13:08:20
>>357
しかもC++本スレ…

359 :デフォルトの名無しさん:05/03/17 13:09:19
じゃあ竹島問題を解決するプログラムをC++で
開発するということにしよう

360 :デフォルトの名無しさん:05/03/17 13:13:00
>>359
竹島のライフラインを停止するプログラムか?

Kの御世話にならないように心とは裏腹に反対と言っておこう。

361 :デフォルトの名無しさん:05/03/17 13:19:12
#define TakesimaDay 02/22

if( korea.claim() ){
use_atomic_bomb();
}
else{
std::cout << "Yonsama Saiko-" << std::endl;
}


362 :デフォルトの名無しさん:05/03/17 13:27:59
C++なのに#defineかよ

363 :デフォルトの名無しさん:05/03/17 13:42:09
お前の声は半音上がってるぞ

364 :デフォルトの名無しさん:05/03/17 13:51:24
しかも八進数

365 :デフォルトの名無しさん:05/03/17 14:41:10
C++でもふつうに#define使いますが

366 :デフォルトの名無しさん:05/03/17 14:55:22
##とかでプリプロセス結合するとか、ディレクティブで使用するとかいった場合は#defineだな。

単なる定数とかはstatic constで型チェックさせる。
マクロもinlineにして型チェックさせる。

367 :デフォルトの名無しさん:05/03/17 15:14:34
static使うの?
無名namespaceは使わないの?

368 :デフォルトの名無しさん:05/03/17 15:17:04
無名ネームスペース使うとタイプ数がだいぶ増えるからなあ…
ブロック開いて閉じる手間も増えるし。

369 :デフォルトの名無しさん:05/03/17 15:26:31
>>368
テキストエディタの自動インデント機能がうざくなる瞬間でもあるね。

370 :デフォルトの名無しさん:05/03/17 18:32:26
シリアルキー解析集「ALTEA」
大好評発売中!

http://openuser10.auctions.yahoo.co.jp/jp/user/dancexxx1960?


市販SOFTやオンラインSOFTのパスワード集です。
オークション関係から画像・OS・表計算・CAD・・・・etc
国内・国外のあらゆる分野のSoftを解析済です。


これを初めて手にされた時には、驚愕される事でしょう。
そして・・・手当たり次第にインストールを始める筈ですw
パソコンをご使用の方なら、必ず!満足されると思います。

解析結果のデータベースには15,000点を越えるパスワードが入ってます。
このパスワード集から検索するだけで、登録や制限解除が出来てしまいます。
シェアウェアを購入して、正規登録したのと同じ状態になります。
余りにもデータが多すぎる為、辞書引のようなパスワード検索SOFTで提供します。

シェアウェア以外にもパッケージ版をVectorなどでオンライン販売してるSOFTにも
多数対応しています。これらをダウンロードして無期限に試用する事も可能です(^^;

WindowsXPやOfficeなどのCDキー(プロダクトキー)ジェネレーターを使えば複数のパソコンに
インストールする事も可能です。デスクトップとノートPCなど2台以上持ってる場合は特に有効ですね。

オンラインSOFTを購入した経験は有りますか?
ありとあらゆる分野の優れたSOFTが、数多くありますよね。
しかし、ほとんどが試用期間や機能制限をして、「気に入ったら購入してください」です。

もう少し使いたいが使用期限切れで、削除・・・再インストールを繰り返していませんか?


371 :デフォルトの名無しさん:05/03/17 20:55:50
クラスのメンバ定数でstaticつけない意味なんてないですよね?

372 :デフォルトの名無しさん:05/03/17 21:07:10
staticをつけなかったらそもそもクラスのメンバ定数って意味じゃないし。

373 :デフォルトの名無しさん:05/03/17 21:30:25
ああ、そういう言い方にはならんですか。
ただのconstの場合は、初期化したら不変のままで
オブジェクトごとに値が違うみたいな使い方ですかね。

374 :デフォルトの名無しさん:05/03/18 01:50:06
皆さんC++で何の仕事してますか。

私C++のプログラマでがんばりたいのですが
派遣とかに声掛けると、制御系の知識あるかとか
ネットワーク知ってるかと聞かれて凹んでます。


375 :デフォルトの名無しさん:05/03/18 01:54:11
数日前からC++に手付けてるんだが、
結構とっつき難いね。
参考書籍買う金もないのでWeb探しまくってお勉強中だけど。


('A`)普通にプログラム書ける人間がすげー偉く思える。いや、実際偉いのか

376 :デフォルトの名無しさん:05/03/18 01:55:55
>>374
板違い
>>375
書籍代だけは惜しまない方が良い

377 :375:05/03/18 01:58:51
>376
やっぱそうですか。Web上のだけじゃ足りないですよねぇ…
ちょっと明日(今日)にでも本屋行って見てきます。どもです


378 :デフォルトの名無しさん:05/03/18 04:20:26
C++を書いていくうちに、自分用関数がどんどんふえていくじゃないですか。
int→char[]とか、都合のいい16進数解釈関数とか、。
そういったのが多くなったので、これまでother.cppとしてまとめていたものをこの際分割して管理しようと思います。

何かこうしたほうがいいとか、陥りやすいmissとかありますか?

379 :デフォルトの名無しさん:05/03/18 05:41:23
>>378
陥りやすいmiss
「自分用関数がどんどんふえていく」

趣味や勉強程度で、コードの再利用を考えるのは無駄なことが多い。
プロジェクト内で完結させておけばいい。
コピペの手間 << コードの管理

380 :デフォルトの名無しさん:05/03/18 07:20:34
>379 マジですかー。
自分用関数が増えていくのが楽しかっただけにちょっとショック。

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

381 :デフォルトの名無しさん:05/03/18 07:45:51
>>378
いや、16進数解釈関数程度ならば、役に立つよ。
CライブラリをつかわずWindowsAPIだけを使いたい場合、
atoi()の代用品をCライブラリ非依存で作っておくと、重宝する。

382 :デフォルトの名無しさん:05/03/18 08:08:32
>CライブラリをつかわずWindowsAPIだけを使いたい場合、

なんでこんなバカなことをする必要があるん?

383 :デフォルトの名無しさん:05/03/18 08:09:11
379 に従うと COBOLer のようになるわけだが

384 :デフォルトの名無しさん:05/03/18 08:12:10
>>382
んー、思考停止かな?

「_ATL_MIN_CRT」でぐぐってみて。
君が知らない世界があるから。

385 :デフォルトの名無しさん:05/03/18 08:45:56
>>384
_ATL_MIN_CRTを使うのはバカだ、ということが分かった。

お前バカなん?

386 :デフォルトの名無しさん:05/03/18 09:53:14
C++の多重継承って、同じメソッドがあった場合、どちらがコールされるんだっけか?

387 :デフォルトの名無しさん:05/03/18 10:09:18
コンパイルエラー

388 :デフォルトの名無しさん:05/03/18 10:39:43
え”、それ本当の話(゚Д゚)?

389 :デフォルトの名無しさん:05/03/18 10:51:06
名前も引数も同じならコンパイラはどちらを呼び出せばよいか判断できないのでエラーになる。

390 :デフォルトの名無しさん:05/03/18 10:51:42
>>388
メソッド名が曖昧になるから。
その場合は、foo::hoge()とかbar::hoge()って感じで呼び出す。
ダイヤモンド継承も同じ。

391 :デフォルトの名無しさん:05/03/18 10:57:07
>>384
俺も知らなかったからググって見た。

この間抜けな仕様は何の為に存在するんだろ、と思った。
// なんだよ、C++ の例外が使えないって…

392 :デフォルトの名無しさん:05/03/18 11:48:02
ダイヤモンド継承ってはつみみなんですが、多重継承より凄いヤツでつか?

393 :デフォルトの名無しさん:05/03/18 12:32:32
>>384
25KBのコードサイズとランタイム添付の手間のためにコードが糞になるんですかそうですか

394 :デフォルトの名無しさん:05/03/18 12:50:15
>>392
ttp://www.uri.sakura.ne.jp/~cosmic/yuno/lab/cpp_virtualbase.html
既出だと思うけど、ここ見れ。
継承は、楽しいよ。たのしい。

395 :デフォルトの名無しさん:05/03/18 13:00:21
>>394
継承は知ってるけど、そのページダイヤモンド継承について書いて無くない?
仮想継承=ダイヤモンド継承
なんか?

396 :デフォルトの名無しさん:05/03/18 13:19:21
   A
 /  \
B     C
 \  /
   D
この形のことをダイアモンドっていうんだろ?

397 :デフォルトの名無しさん:05/03/18 13:33:29
多重継承すると、継承先では継承元のクラスは個別に保持される。
だから、>>389-390のように、foo::hoge()とかbar::hoge()って感じに明示的にアクセスしなければならない。

一方、仮想継承の場合は、その共通部分を全部くくってしまうケース。

   A
 /  \
B     C
 \  /
   D

この例だと、クラスAにメンバーhogeがあった場合、クラスDにはA::hoge、B::hoge、C::hogeが出来る。
仮想継承だと、その共通部分であるhogeは一つしか出来ない。

これで間違っていないよね?

398 :397:05/03/18 13:39:37
間違えた。orz
クラスDに出来るのは、B::hogeとC::hogeだ。

399 :デフォルトの名無しさん:05/03/18 14:24:21
C++では記憶域クラス指定子が無いconst型修飾された識別子は
内部結合の識別子として認識するという記述を読んだのですが
namespace {
 const int foo;
 static const int bar;
 class X {
  public: const int baz;
  static const int qux;
 };
}
上のコードでfooとbar、bazとquxは同じ意味になるという理解で
良いのでしょうか?

400 :デフォルトの名無しさん:05/03/18 14:44:28
ここでダライアス継承 >>50

401 :デフォルトの名無しさん:05/03/18 15:17:46
>399
>C++では記憶域クラス指定子が無いconst型修飾された識別子は
「"名前空間スコープにある"記憶域クラス指定子が無いconst型修飾された識別子は」ですね.
無名名前空間とstaticはほとんど同じ効果を持ちますけれど微妙な違いがありますよ.
bazとquxですが,クラスの非静的データメンバに対するconstは
リンケージとは関係ないですし,staticの指定もリンケージとは無関係です.

そもそもクラスの非静的データメンバにはリンケージの概念がないような・・・?

402 :デフォルトの名無しさん:05/03/18 15:29:41
コンストラクタでこんな感じで書いてあるのはどういう意味なのでしょう?

CLASS_A:CLASS_A():Hensu1(0),Hensu2(1)
{
処理
}

CLASS_A:CLASS_A():Hensu1(0),Hensu2(1)
~~~~~~~~~~~~~~~~~~~~<=ここの意味がわからん。
Hensu1とかはprivate変数らしい
以上、暇だったら教えて・・・

403 :デフォルトの名無しさん:05/03/18 15:32:06
★ずれたので再書き込みごめん
コンストラクタでこんな感じで書いてあるのはどういう意味なのでしょう?

CLASS_A:CLASS_A():Hensu1(0),Hensu2(1)
{
処理
}

上記の記述のなかで
Hensu1(0),Hensu2(1)
の意味がわからん。private変数らしいが・・・。

以上、暇だったら教えて・・・

404 :デフォルトの名無しさん:05/03/18 15:45:23
>>403
コンストラクタでの、メンバ変数の初期化

初心者ならば、ttp://pc5.2ch.net/test/read.cgi/tech/1108924728/で質問汁

405 :デフォルトの名無しさん:05/03/18 16:14:24
>>401
なるほど 399が適用されるのは名前空間スコープ上、fooとbarに
対してなんですね。クラススコープ上の場合は異なり、baz は
staticではないので非staticメンバに準ずるということなのですか…。
複雑ですね。(^^;
とても勉強になりました。ご指摘ありがとうございます。

406 :402,403:05/03/18 16:22:37
>>404
ありがとぅ

407 :デフォルトの名無しさん:05/03/18 16:29:58
みなさんD言語、どう思いますか?
ゆくゆくは移行してもいいかとお考えですか?
ここで聞くなと言われるかもしれませんが、C++に熟達した
人の意見も聞いてみたいと思って…。
一部にはC++で挫折した人間がDへ、とも言われてるようですし。


408 :デフォルトの名無しさん:05/03/18 16:36:56
はやってから乗り換えたんでも遅くないし、まあ様子見だな。

409 :デフォルトの名無しさん:05/03/18 16:52:44
void Hage();
class Hoge{
public:
 DWORD(Hoge::*m_pFunc)();
 Hoge(){g_pHoge=this;}
 void Func00(){;}
...};
Hoge *g_pHoge=NULL;
void Hage(){
g_pHoge->m_pFunc=Hoge::Func00}

Hageで設定したHoge::Func00はHogeが複数の場合、
どのHogeを指すことになるのでしょう?
また、クラス外(Hage())からg_pHoge->Func00()を明示的に
m_pFuncに代入する方法を教えてください。

410 :デフォルトの名無しさん:05/03/18 16:54:55
>>409
メンバ関数へのポインタの値は、メンバ関数の「名前」に相当する。
従って、特定のインスタンスを指すものではない。

411 :410:05/03/18 16:57:53
例:
void (Hoge::*pFunc)() = &Hoge::Func00;
Hoge a, b;
a.*pFunc(); // a.Func00(); と同じ。
b.*pFunc(); // b.Func00(); と同じ。

412 :デフォルトの名無しさん:05/03/18 17:01:01
>>410
即レス有難うございます。
インスタンスが複数ある場合、どのインスタンスのメンバ変数を操作することになるのでしょう?
この場合だとg_pHoge->m_pFunc=で入れているのでg_pHogeが使われるということでしょうか。

413 :デフォルトの名無しさん:05/03/18 17:02:53
>>411
有難うございます。納得いたしました。

414 :デフォルトの名無しさん:05/03/18 17:02:59
>>412
よく読め。
使われるときに決定される。

415 :デフォルトの名無しさん:05/03/18 19:38:43
もしスレ違いな質問だったらすみません。

以下のソースプログラムをコンパイルしようとしたところ、下のようなエラーメッセージが出てしまいました。
コンパイラは、lcc-win32 です。

【バージョン情報】
Logiciels/Informatique lcc-win32 version 3.8. Compilation date: Jul 25 2004 22:17:17

【ソース(ファイル名:cout.cpp)】
#include <iostream.h>

int main(int argc, char** argv)
{
cout << "Hello, world!\n";
return 0;
}

【コンパイル時の状況】
C:\Documents and Settings\・・(個人情報があるため省略)・・\lcc\test>\lcc\bin\lcc cout.cpp
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~
↑作業ディレクトリ                                  ↑入力したコマンド

C:\Documents and Settings\・・(個人情報があるため省略)・・\lcc\test>\lcc\bin\lcclnk cout.obj
cout.obj .text: undefined reference to '_cout'
cout.obj .text: undefined reference to '__op_leftshift_piostream_pchar'

C:\Documents and Settings\・・(個人情報があるため省略)・・\lcc\test>
【以上】

lcc-win32 は C:\lcc 以下にインストールされていて、C:\lcc\include の中には iostream.h がちゃんとあるので、
恐らくコンパイラのバグなどが原因だと思うのですが、どうすれば良いのでしょうか?

416 :415:05/03/18 19:43:35
大切なことを忘れていました。
作業環境は、

【本体の商品名】e machines
【OS】Windows XP
【CPU】celeron 2.20GHz
【Memory】128MB
【HDD】40GB

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

417 :デフォルトの名無しさん:05/03/18 19:43:59
いや、コンパイラは悪くないよ。
その前に自分を疑えよ。さすれば汝は救われる。

418 :デフォルトの名無しさん:05/03/18 19:52:18
よくよく考えると、iostream.hが公には使われなくなってからもう10年経つんだね……。

419 :415:05/03/18 19:54:11
>>417
自分を疑えとはどういうことでしょうか?

>>415 のソースプログラムは、g++ だと正常にコンパイル・実行出来ました。
よって、ソースプログラムは(C++として)問題ないと思われます。
もしかして、lcc-win32 はそもそも C++ をコンパイルできないのでしょうか?
iostream.h 等が入っているから C++ にも対応していると思ったのですが・・・・・・

420 :415:05/03/18 19:59:55
>>418
本当ですか?それは初耳です。
C++ を使い始めたのはおよそ8年前ですが、当時の入門書には iostream.h が出て来ました。
それとも、C++ のプログラムで標準入出力を扱う他の新しい方法が出来たのでしょうか?
そうでなければ、stdio.h 等を使うしかないのでしょうか?
尤も、Windows のプログラムでは標準入出力という概念が無いかもしれませんが・・・

421 :デフォルトの名無しさん:05/03/18 20:02:26
そのかわり
<iostream>
は使うんだろ

422 :415:05/03/18 20:12:31
>>421
使う、というか「使いたい」のですが・・・
すみません、421さんのおっしゃることが分からないので、もう少し噛み砕いていただけますか?

423 :デフォルトの名無しさん:05/03/18 20:15:44
<iostream.h>を<iostream>に直す、とか言うのは論外ですよね

424 :デフォルトの名無しさん:05/03/18 20:17:21
iostream.hなんて使ってる位だから
名前空間なんて知らないよね

425 :デフォルトの名無しさん:05/03/18 20:17:25
                |
                |
                |
                |
     /V\        ,J
    /◎;;;,;,,,,ヽ
 _ ム::::(;;゚Д゚)::| ジー
ヽツ.(ノ::::::::::.:::::.:..|)
  ヾソ:::::::::::::::::.:ノ
   ` ー U'"U'

426 :デフォルトの名無しさん:05/03/18 20:22:02
ファイル名をcin.cppにする

427 :デフォルトの名無しさん:05/03/18 20:28:37
> 恐らくコンパイラのバグなどが原因だと思うのですが

> g++ だと正常にコンパイル・実行出来ました。
> よって、ソースプログラムは(C++として)問題ないと思われます。

> iostream.h

……

428 :415:05/03/18 20:35:32
ぷ、おまえらまともな回答でいないのに偉そうだな


429 :デフォルトの名無しさん:05/03/18 20:36:07
lcc-win32ってそもそもC++対応してたっけ?Cコンパイラだったような‥‥

430 :デフォルトの名無しさん:05/03/18 20:36:24
ところで俺が知る限りlcc-win32ってCコンパイラだった気がするんだがいつの間にかC++にも対応したのか?

431 :デフォルトの名無しさん:05/03/18 20:37:53
>>374
おいらハード屋

432 :415:05/03/18 20:41:10
iostream.hがあるからC++でしょ
g++でコンパイルできたのがなによりの証拠

433 :デフォルトの名無しさん:05/03/18 20:42:34
iostream.hでぐぐったらこんなのあったよ。
ttp://homepage1.nifty.com/MADIA/vc/vc_bbs/200403_04030031.html

><iostream>は標準C++ライブラリのヘッダファイルですが,
><iostream.h>は非標準の(古い)ヘッダファイルです。
>理由がない限り,<iostream.h>は使うべきではないです。

これか?

434 :デフォルトの名無しさん:05/03/18 20:50:05
>>432
C++ の規格は ISO/IEC14882
この規格では iostream.h の添付を義務づけていない
よって iostream.h がない処理系も大手を振って C++ を名乗れる

435 :デフォルトの名無しさん:05/03/18 20:51:52
iostream.hは次世代標準!

436 :デフォルトの名無しさん:05/03/18 20:55:08
リンクファイルが古いは、コンパイラによって修飾された関数名が競合するはで、
std空間を使わないバージョンをインクルードするのは鬼のように嫌われる昨今。
Linuxでさえ、そういう状況。

437 :415:05/03/18 21:12:39
>>432さん、>>415は私ですけど・・・・・・書き間違いでしょうか??

ググってみたら、「lcc-win32 は C++ コンパイラではないけど、一部 C++ の機能が付いている」
というようなことが書いてありました。lcc-win32 は Cコンパイラ+α といったところでしょうか。

では、Windows 環境で使える無料の C++ コンパイラってあるのでしょうか?
もしご存知でしたら、是非教えて下さいm(_ _)m

438 :デフォルトの名無しさん:05/03/18 21:17:56
>>437
http://pc5.2ch.net/test/read.cgi/tech/1110099763/3

439 :デフォルトの名無しさん:05/03/18 21:26:18
>>437

Microsoft Visual C++ Toolkit 2003 
ttp://msdn.microsoft.com/visualc/vctoolkit2003/

440 :415:05/03/18 21:33:25
>>438
gcc って、Windows 環境対応のものもあるんですね。早速インストールしているところです。
ありがとう御座いましたm(_ _)m

441 :デフォルトの名無しさん:05/03/18 22:45:26
>>440
今後 lcc を使うことはないだろうけど、参考までに。
http://stingray.campus.luth.se/lcc/AnApplication.htm
あと、Project->Configuration->Linker で iostream.lib を追加する必要があると思う。
スレ違いだけど、未解決のまま放置するのも何なので。

442 :440:05/03/18 23:00:04
>>441
ご親切にどうもありがとうございます。
lcc を使いやすい設定にしてしまっているので、cygwin 向けの環境に切り替えるまでの間は
しばらく lcc を使うことになると思うので、少し助かりました。

443 :デフォルトの名無しさん:05/03/19 23:27:04
>>440
gcc(g++)のwin32環境対応版には
cygwinエミュレーション版とmingw版とがある
文字コードの関係やライセンスの関係から、漏れはmingw版(IDEはDev-C++)を使用している
SubVersionやLaTeXも使うので、競合を恐れたというのもひとつだが
もしcygwinが使いづらいということがあれば、mingwがお勧めだ。

444 :デフォルトの名無しさん:05/03/19 23:42:18
gccでWin32な環境っつーとC++ BuilderX Personalもあるな。ライセンスが微妙でアレだが。

445 :デフォルトの名無しさん:05/03/20 21:40:49
デストラクタってinlineにすると、無駄なコードが生成される可能性が
あったり、デストラクタのアドレス取得の問題とかあるようですが、
コンストラクタってinlineにしても副作用ないですか?
というか普通はinline?

446 :デフォルトの名無しさん:05/03/20 22:58:32
>デストラクタってinlineにすると、無駄なコードが生成される可能性が
>あったり、デストラクタのアドレス取得の問題とかあるようですが、
ここからして初耳なんだが。 詳細キボン。

447 :デフォルトの名無しさん:2005/03/21(月) 14:25:26
>デストラクタのアドレス取得の問題
ここで問題が起きるような糞コンパイラならそもそもinline指定してもインライン化されないから大丈夫

448 :デフォルトの名無しさん:2005/03/21(月) 18:02:58
コンストラクタのinline・非inlineの判断は
普通のメンバ関数と同じ考え方でいいんですか?

449 :デフォルトの名無しさん:2005/03/21(月) 18:16:23
>>448 はい。

450 :デフォルトの名無しさん:2005/03/21(月) 19:33:17
コードコードって、そんなにシビアに問題になるような環境で
開発している人ってたくさんいるんですか?
それとも単に祭り好きな人がたくさんいるってだけですか?


451 :デフォルトの名無しさん:2005/03/21(月) 19:34:02
無駄なコードと冗長なコードを混同している人が若干いらっしゃるね。

452 :デフォルトの名無しさん:2005/03/21(月) 21:26:04
 ストリームに関する質問です。
 basic_ofstreamって、ファイルに対する出力ストリームで、
オープンモードでバイナリを指定すれば、バイナリーで
書き出せるわけですが、メモリーに対するバイナリー出力の
ストリームってないのでしょうか。


453 :デフォルトの名無しさん:2005/03/21(月) 21:30:46
>>452 std::basic_ostringstream

454 :452:2005/03/21(月) 21:43:18
>>453
 あ、ほんとだ。openmodeがありました。
 ありがとうございます。


455 :デフォルトの名無しさん:2005/03/21(月) 21:56:16
C++の前にC言語学んでおいたほうがいいの?

456 :デフォルトの名無しさん:2005/03/21(月) 21:59:43
別にやらんでいいとストラウストラップ先生 (禿) は言っている

俺もそう思う

457 :デフォルトの名無しさん:2005/03/21(月) 22:09:22
そりゃCの上位互換だからねぇ。
Cと同じ書き方もできるから。
問題はプログラミングスタイルだね。
初心者はまずアルゴリズムとデータ構造を勉強せにゃならん(異義は却下)から、
オブジェクト指向の事は後回しでよろしい。

458 :デフォルトの名無しさん:2005/03/21(月) 22:21:27
『Cを理解する事が前提』ではないのに『Cを拡張した形』を取る言語として存在するってのも変な話だね。

俺もCやらずにC++から今勉強してるけど

459 :デフォルトの名無しさん:2005/03/21(月) 22:21:47
先人であるCへの理解抜きには納得できない仕様も多いだろう。
だが先に学ぶ必要は無いな。

460 :デフォルトの名無しさん:2005/03/21(月) 22:23:32
>>458
なに言ってるのか良く解からない。
Cの構文規則が基礎なんだから、C++を理解するのにCが必要なのは当り前だろ??

461 :デフォルトの名無しさん:2005/03/21(月) 22:24:15
>>459
意味不明

462 :デフォルトの名無しさん:2005/03/21(月) 22:30:49
>>458
一度D&Eを読んでみるといい。
その辺に対する禿の見解が書いてある。

463 :デフォルトの名無しさん:2005/03/21(月) 22:32:22
>>454
Fileに保存するとき以外はバイナリモード、テキストモードの区別なんて無いよ。

464 :デフォルトの名無しさん:2005/03/21(月) 22:40:42
C++ の前に C から憶えたほうがいいとかいう奴に限って C++ の前に Simula67 を憶えたわけでもない

465 :デフォルトの名無しさん:2005/03/21(月) 23:21:41
C++のフーリエサンプルが欲しいげど、
どこにあるのかな?

466 :デフォルトの名無しさん:2005/03/21(月) 23:23:28
フーリエはいつも君の心の中にあるよ

467 :デフォルトの名無しさん:2005/03/21(月) 23:27:49
>>466
自分でやれってか?
C言語で書いたのはあるけど、ダルイ。

468 :デフォルトの名無しさん:2005/03/21(月) 23:29:23
C -> C++ のポーティングができないような香具師に何渡しても無駄

469 :デフォルトの名無しさん:2005/03/21(月) 23:35:44
>>468
技術的なことを言ってるの?
それは見当違いだね。
ここは、素人専門かい?

470 :デフォルトの名無しさん:2005/03/21(月) 23:47:15
>>467
「C言語で書いたの」をC++でコンパイルした(できるように調整した)ものでは何が不満なのかね?

471 :デフォルトの名無しさん:2005/03/21(月) 23:56:04
種明かしすると、>>467はCもC++も知らないのでした。


472 :デフォルトの名無しさん:2005/03/21(月) 23:57:12
そもそもフーリエサンプルってなんだよ。
ただ、フーリエって言いたかっただけだろw

473 :デフォルトの名無しさん:2005/03/21(月) 23:58:10
ガウシアンフィルタのことか?>>467

122 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)