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

474 :デフォルトの名無しさん:2005/03/23(水) 03:34:39
C++勉強するのにLINUX入れようかと思ってるんですけど、
microsoft visual stdioとどっちがいい?

475 :デフォルトの名無しさん:2005/03/23(水) 03:42:35
gcc bcc dmcあたりでいいんじゃない?linuxは関係ないと思う。

476 :デフォルトの名無しさん:2005/03/23(水) 03:42:49
>>474
cygwin+gcc

477 :デフォルトの名無しさん:2005/03/23(水) 03:53:42
最近はLinuxでもstd::wstringがコメントアウトされてるような馬鹿な環境はなくなってきたのか?

478 :デフォルトの名無しさん:2005/03/23(水) 11:02:18
もしかしてC++の自作ヘッダの拡張子って
.hppにするのが一般的なのですか?.hしか使ってなかったけど
たまに.hppもみかけるし、ソースも.cppだし・・・。

479 :デフォルトの名無しさん:2005/03/23(水) 11:11:06
C++ FAQ では hpp を推奨してたような希ガス。
でも好きな方使えばいいと思う。

480 :デフォルトの名無しさん:2005/03/23(水) 11:40:38
俺は hh と cc しか使ってない。
でも以前は hpp と cpp 使ってた。
知り合いには仕事以外では h++ c++ を貫いてるやつがいる。

GNU Make がデフォルトで hh と cc を認識するから
それを使ってるだけ。

>>479 よかったら URL 教えて。

481 :デフォルトの名無しさん:2005/03/23(水) 11:43:21
ヘッダー++なんてものは仕様にないんでしょ?
無いならhでいい。あればちょっと考える。

482 :デフォルトの名無しさん:2005/03/23(水) 12:02:22
>>480


483 :478:2005/03/23(水) 12:57:45
そうですか、それほどスタンダードっていうものがあるものでも
ないんですね。仕事ではチームの風潮に合わせるみたいな感じですかね。

484 :デフォルトの名無しさん:2005/03/23(水) 17:39:45
また1つ優秀なデスクトップ開発環境がなくなりました。

ttp://www.metrowerks.co.jp/information/2005/info0323.html

お客様各位
2005年3月23日
メトロワークス株式会社
CodeWarrior Desktop製品販売終了のお知らせ

拝啓 時下ますますご清栄のこととお喜び申し上げます。平素は格別の
ご高配を賜り、厚くお礼申し上げます。このたび弊社では、2005年4月30日
をもちまして下記のDesktop向けCodeWarrior各製品の販売を終了いたし
ます。一部の日本語版製品につきましては在庫終了のため、本日をもって
販売を終了させていただきます。長年にわたり弊社製品にご愛顧を賜り
誠にありがとうございました。今後もGame、Embeddedシステム向けに、
より良いCodeWarrior開発ツールとサポートを提供してまいる所存です
ので、何卒よろしくお願い申し上げます。
(後略)

485 :デフォルトの名無しさん:2005/03/23(水) 18:21:45
>>484
残念…
CodeWarrior1.7からのユーザだったから、ちょっと感慨深い

486 :デフォルトの名無しさん:2005/03/23(水) 19:20:22
void main(void){
Func();
}

void Func(void){
double *d;
d = malloc(沢山);
<中略>
free(d)         ←ここ
}

関数Funcが終わったらポインタdは使えなくなるんですよね?
それでもfree(d)は必要なんですか?

487 :デフォルトの名無しさん:2005/03/23(水) 19:31:43
>>486
例えば、土地を借りて(malloc)住所を紙に書いて(d)
その紙を捨てたとしても(dがスコープから外れる)土地を返したことにはならないよね。

488 :486:2005/03/23(水) 20:02:33
>>487
ありがとうございます。
5レベルくらいレベルアップしました。

489 :デフォルトの名無しさん:2005/03/23(水) 21:25:37
>>484
あれだけ有名な製品でもある日突然消えちゃうんだね。
Borlandも心配。

490 :デフォルトの名無しさん:2005/03/23(水) 21:46:13
次のlonghornとかいうWindowsではVC++がなくなるorネイティブコードはけなく
なるって本当?!

491 :デフォルトの名無しさん:2005/03/23(水) 21:50:22
壮大な勘違い。

492 :デフォルトの名無しさん:2005/03/23(水) 21:55:47
誤解を生む記事は多いけどな

493 :デフォルトの名無しさん:2005/03/23(水) 21:58:23
C#を押してるMicrosoftだけど、さすがにC++なくしたら
開発者に.NETは見向きもされないってことになるかな。

494 :デフォルトの名無しさん:2005/03/23(水) 21:58:46
みんなに.NET Frameworkでプログラム書かせて、
Intelに儲けさせようという壮大な計画です。

495 :デフォルトの名無しさん:2005/03/23(水) 23:53:33
ニャホ・ニャホタマクローが頭から離れないよー

496 :デフォルトの名無しさん:2005/03/23(水) 23:54:01
>>490
ネイティブと.NETの立場が入れ替わるんじゃないの?
.NETがネイティブになって今のネイティブがエミュレーション動作

497 :デフォルトの名無しさん:2005/03/24(木) 00:04:20
vectorの要素は、標準では必ずしもメモリ上に連続配置しなくても
いいとなってるのが、今後、連続配置を標準で保証する動きがあるとか
本で読んだのですが、今どうなってんですかね。

498 :デフォルトの名無しさん:2005/03/24(木) 00:10:38
>>497
今はメモリ上で連続してることが保障されてるはず。

499 :デフォルトの名無しさん:2005/03/24(木) 00:24:38
>>497
保証されている。

500 :デフォルトの名無しさん:2005/03/24(木) 00:25:35
ばかばかしい質問ばかりだ。

501 :デフォルトの名無しさん:2005/03/24(木) 00:27:20
そういうこと気にしないといけないというのは、全てC++のちぐはぐさのせいなんだよね。
もうこの言語、限界なんじゃない?
言語仕様に対して無理しているように見える。

502 :デフォルトの名無しさん:2005/03/24(木) 00:42:59
>>501
随分前からそう言われてるけど、結局生き残ってるわけだ

503 :デフォルトの名無しさん:2005/03/24(木) 00:46:16
別に難しい仕様、使用しなければいいんじゃね?なんちて。

504 :デフォルトの名無しさん:2005/03/24(木) 00:50:17
そのうちシステムズプログラミングもC#やらDやらでやることになるんだろうか

505 :デフォルトの名無しさん:2005/03/24(木) 00:54:25
システムズプログラミングってなんですか

506 :デフォルトの名無しさん:2005/03/24(木) 00:55:15
アレだよ

507 :デフォルトの名無しさん:2005/03/24(木) 01:01:21
もうそろそろアセンブラから卒業する時代が来たんだよ。

508 :デフォルトの名無しさん:2005/03/24(木) 01:02:49
というわけで、OCamlがオススメだよ☆

509 :デフォルトの名無しさん:2005/03/24(木) 03:07:20
マネージコードをネイティブに実行できるCPUが作られれば、あながち
あり得ない話とも言えない。

510 :デフォルトの名無しさん:2005/03/24(木) 03:13:10
ハードウェアでガベージコレクションねぇ…

511 :デフォルトの名無しさん:2005/03/24(木) 03:17:54
>>510
ex. Lispマシン

512 :デフォルトの名無しさん:2005/03/24(木) 03:38:54
そういえば、Javaプロセッサって計画が昔あったよね

513 :デフォルトの名無しさん:2005/03/24(木) 09:55:25
教えてください。
メンバ関数の実体って、オブジェクトごとに確保されるのでしょうか?
staticメンバ関数というのがある以上、普通のメンバ関数はそういう
ことになると思えるのですが。でもどのオブジェクトでも処理としては
同じなのに、複数用意するのも変に思えるのです。せいぜいthisポインタが
指すオブジェクトが違うだけですよね。実際はどういう仕組みなのでしょうか?

514 :デフォルトの名無しさん:2005/03/24(木) 10:01:20
>>513
せいぜいthisポインタが違うだけなので、
一般的な実装ではthisポインタを引数に取る関数がひとつ生成される。
このため、非staticメンバ関数の型は宣言(見た目)どおりの型とは違う。

staticメンバ関数はthisポインタを受け取らないので、
宣言どおりの型を持つ関数が生成される。


515 :デフォルトの名無しさん:2005/03/24(木) 10:02:30
> せいぜいthisポインタが
> 指すオブジェクトが違うだけですよね。

これが大問題だと思うのは気のせいでしょうか?
メンバ変数がひとつもないのであれば、それこそstaticでいい

516 :デフォルトの名無しさん:2005/03/24(木) 10:36:30
thisポインタが違うのが問題ということでしょうか。
なんとなく、thisポインタだけを動的に差し替えてみたいな
感じでいけないのかなぁ・・・と思ったんですよね。
処理としては同じで対象が違うってことなので。
そういうわけにもいかんのですか。

517 :デフォルトの名無しさん:2005/03/24(木) 10:44:45
>>516
読解力ないな。
>514が書いているとおり、一般的にはthisを引き数として受け取る関数のように実装されるのだけどね。
つまり、オブジェクトごとに存在するのは(staticじゃない)メンバ変数と仮想化に必要なポインタのみ。
コンストラクタを含めて関数はオブジェクトごとに生成されるわけではない。

518 :デフォルトの名無しさん:2005/03/24(木) 10:49:43
class A {
public:
int i;
void func() { i = 0; }
};

A a;
a.func();

は、Cではこんな感じかな。

struct A {
int i;
};
void A_func(A* this) { this->i = 0; }

A a;
A_func(&a);

519 :513:2005/03/24(木) 11:12:37
あ、失礼、なぜか514さんのレス読み飛ばしてました。
十分納得できました、どうもです。

520 :517≠514:2005/03/24(木) 11:58:50
実際、旧いC++処理系はCのソースを生成していたから
まさしく>518のようなことをしていたと思われ。
#いや、関数名は型も含んだ長い名前になるけど。

今時のコンパイラはthisはスタックに積まずにレジスタで渡すなどしているから
厳密には違うんだろうけどね。

521 :デフォルトの名無しさん:2005/03/24(木) 12:26:15
メンバ関数でない単純なCの関数でも場合によってはレジスタで引数を渡すような最適化も存在するから大してかわってないとも言える。。

522 :デフォルトの名無しさん:2005/03/24(木) 15:08:13
ファイル分割の設計ってどういう思想でやってますか?
例えばクラスは、ヘッダファイルにインタフェース、実装ファイルに
実装、という様にわかりやすくできると思いますが、main関数の
実装ファイルにおいて、そういったインターフェースをどうやって
取り込むのか、グローバル変数の取り込み方とか、いろいろ悩むところが。
いろんなヘッダをまとめて取り込んだ代表ヘッダみたいなのを使う方法や、
依存関係を極力少なくした取り込み方もあると思いますが、何を基準に
判断していいのか・・・。それによってコンパイル速度とかも変わって
くるんでしょうか?




523 :デフォルトの名無しさん:2005/03/24(木) 15:18:18
>>522
C++で書かれたソースを公開しているフリーソフトウェアがいくらでもあるだろ。
そういうのを読むんだよ。
まずは真似ることからはじめようね。

524 :デフォルトの名無しさん:2005/03/24(木) 15:20:31
あとはオープンソースプロジェクトのコーディングガイドラインを読むのも参考になるかも

525 :522:2005/03/24(木) 15:38:56
そうですか、オープンソースなるもので勉強するのですか。
すみませんが、勉強になるもので何か1つ適当なのを
紹介してもらえませんか?


526 :デフォルトの名無しさん:2005/03/24(木) 15:41:33
>>525
自分で探しな。
http://sourceforge.net/

527 :デフォルトの名無しさん:2005/03/24(木) 16:22:29
STLとかboostとかのソース読んでおもいっきし可読性の低いソースを書くようになる可能性について:

528 :デフォルトの名無しさん:2005/03/24(木) 16:24:51
ガワさえ綺麗なら中身なんて・・・

529 :デフォルトの名無しさん:2005/03/24(木) 16:36:09
>>527
可読性ってなんですか
おいしいですか?

530 :デフォルトの名無しさん:2005/03/24(木) 16:51:37
コンストラクタで例外が発生してがくがくぶるぶる。

531 :デフォルトの名無しさん:2005/03/24(木) 16:57:27
>>530
コンストラクタの気持ち…ちゃんと受け止めてあげましたか?

532 :デフォルトの名無しさん:2005/03/24(木) 16:58:20
>>530
恐がってはダメです。
前向きに、向き合っていかないと…
でないと…

533 :デフォルトの名無しさん:2005/03/24(木) 17:42:56
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[COS1345]             幻のソース   「どろソース」       
  兵庫・神戸  ========ソース(株) 


       ソースタンクの1番下で、どろどろとした、原料の野菜の旨みを吸い込
んだ
   「どろソース」は、一部のグルメにしか知られていなかった幻のソースです。
   
    ”そばめし”には欠かせないソースで、その他カレーの隠し味に、焼きそば・
お好み焼きや、他のソースと
    ブレンドしてトンカツやフライ系に幅広くご利用いただける万能調味料ソース
です。
    ピリリと辛く、その豊かな味わいは癖になります。


     360g ¥400− [0]本[かごに入れる]

534 :デフォルトの名無しさん:2005/03/24(木) 17:44:31
ある時例外の使い方に目覚めてから、コンストラクタで例外が起きても怖くなくなった。

535 :デフォルトの名無しさん:2005/03/24(木) 17:51:52
例外”前提”プログラミングはだめだぞ


536 :デフォルトの名無しさん:2005/03/24(木) 18:01:54
>>535
どういう意味?

537 :デフォルトの名無しさん:2005/03/24(木) 18:11:46
ここでcloseしなくてもこのタイミングで例外が飛んでくるから〜みたいなプログラム

538 :デフォルトの名無しさん:2005/03/24(木) 18:14:44
>>537
よく分からん。簡単なコード例を挙げてくれないか?

539 :デフォルトの名無しさん:2005/03/24(木) 18:20:56
>>535
Breakの変わりに使うことを推奨している言語もあるよ。
一概にそうとは言えない。

540 :デフォルトの名無しさん:2005/03/24(木) 18:22:15
例外という言葉に惑わされてはいけないよね。

541 :デフォルトの名無しさん:2005/03/24(木) 18:37:32
try {
  hoge.open(hage);
} catch(AlreadyOpenException e) {
  hoge.close();
  hoge.open(hage);
}


542 :デフォルトの名無しさん:2005/03/24(木) 18:39:26
>>539
どんな言語?興味アル

543 :デフォルトの名無しさん:2005/03/24(木) 18:40:03
>>541
サンクス。理解した。

544 :デフォルトの名無しさん:2005/03/24(木) 18:48:41
>>542
OCaml!!!!

545 :デフォルトの名無しさん:2005/03/24(木) 18:49:18
×変わり
○代わり
ね。

546 :デフォルトの名無しさん:2005/03/24(木) 20:40:50
オープンソースを見るときに、どのファイルにmain関数があるのかは
検索するしかないのでしょうか。

547 :デフォルトの名無しさん:2005/03/24(木) 20:42:03
検索してもいいし、書いてある場合もあるし、Doxygenファイルがくっついてる場合もある

548 :デフォルトの名無しさん:2005/03/24(木) 20:42:51
grepすりゃ一発でわかるだろ。

549 :デフォルトの名無しさん:2005/03/24(木) 20:46:56
移植性の確保のためにマクロ化されてたりするけどな

550 :デフォルトの名無しさん:2005/03/24(木) 20:57:56
まぁ、普通はファイル名で見当がつくけどな。

551 :デフォルトの名無しさん:2005/03/24(木) 22:40:25
>>550
どんなファイル名ですか?

552 :デフォルトの名無しさん:2005/03/24(木) 22:41:46
>>541
すみません、馬鹿なので理解できません
どの辺がいけないポイントなのでしょうか

553 :デフォルトの名無しさん:2005/03/24(木) 22:45:30
>>552
AlreadyOpenなんてしょっちゅうありえそうな事態だからちっともExceptionではない。

554 :デフォルトの名無しさん:2005/03/24(木) 22:53:09
エントリポイントがmain以外にされていたりするのは
単なる意地悪か何かでしょうかね。

555 :デフォルトの名無しさん:2005/03/24(木) 22:54:14
だから例外前提はダメなんでしょ?

556 :デフォルトの名無しさん:2005/03/24(木) 22:55:40
質問です。よろしくお願いします。

仕様コンパイラ:MinGW(mingw-jp-20040224.zip)
環境:WindowsXP SP2

char型とかは1バイトですよね?
http://www.bohyoh.com/CandCPP/FAQ/FAQ00046.html
ここによると符号付charは-127 〜 127 となっております。

しかし、例えば
char ch;

ch = 1024;
としても最大値を超える値が代入できてしまいます。
出力結果は無茶苦茶になりますが。
10進1024は2進で0111 1111 1111で、
char型が1バイトなら、最大値は2進で1111 1111だと思うのですが、
char型に1024を代入した場合、あふれた0111の部分はどこへ行ってしまうのでしょうか?

質問が少しわかりにくいかと思いますがよろしくお願いします。



557 :デフォルトの名無しさん:2005/03/24(木) 22:57:45
>>554
>>549ではなくて?

558 :デフォルトの名無しさん:2005/03/24(木) 22:59:39
>>556
桁あふれしてる分は消える。それだけ。
式があってれば代入は可能。その式に意味があるかどうかは
コンパイラの判断するところではない。プログラマが決めるとこ。
signed charの「有効な」値の範囲が-127 〜 127てだけ。

559 :デフォルトの名無しさん:2005/03/24(木) 23:03:59
>>556
あふれた部分は捨てられる。

signed charの範囲が-127〜127と言うのは規格が要求している最低限の値。
それ以上の範囲になっている事もありえる。(具体的には2の補数を使って-128〜127としている実装が多い)
自分のはどうなっているのか知りたければSCHAR_MAX/SCHAR_MINを読めばいい。

560 :デフォルトの名無しさん:2005/03/24(木) 23:04:03
>>556
> char ch;
> ch = 1024;
> としても最大値を超える値が代入できてしまいます。
> 出力結果は無茶苦茶になりますが。

それは代入できているとは言わないだろ。
あふれた場合、代入後の値は実装依存。

561 :デフォルトの名無しさん:2005/03/24(木) 23:04:53
>>558
それでは、有効な値を超えた場合、例えば
最大値が127なのに1000を代入した場合、
代入された変数には何が代入されるのですか?

char ch;
ch = 1000;
の場合chには1111 1111が代入されているのですか?

562 :デフォルトの名無しさん:2005/03/24(木) 23:05:49
そんな器用なことせんだろ
下位ビットが入るだけ(実装依存?)

563 :560:2005/03/24(木) 23:06:19
>>558-559
かぶった。

・・・と思ったら、
「桁あふれしてる分は消える。それだけ。」?
「あふれた部分は捨てられる」?
そんなルール決まってんの?「実装依存」じゃなくて?

564 :デフォルトの名無しさん:2005/03/24(木) 23:09:43
実装依存はMinGWの場合の振る舞い等はどの辺を読めば書いてありますか?

565 :デフォルトの名無しさん:2005/03/24(木) 23:11:35
>>564
コード書いて試せばいいじゃん

>>563
char hoge[4];
hoge[1] = 10000;
とかなら捨てられないと困らない?

566 :デフォルトの名無しさん:2005/03/24(木) 23:13:43
定義されてるかどうかと言われれば、されてないだろうなあ。
>>562の言うように、下位ビットが入るだけ。
CPUでの実際の演算がレジスタで行われていることを考えれば、
有効なビット幅をメモりにストアすると考えるのが普通。

567 :デフォルトの名無しさん:2005/03/24(木) 23:14:18
>>561-564
1000(DEC) = 3E8(HEX)
だから
char = 8bit の場合は E8
char = 9bit の場合は 1E8
char = 12bit の場合は 3E8
が入る。


568 :560:2005/03/24(木) 23:16:07
>>565
捨てられようが捨てられまいが、
代入しようとした値と結果の値が同じにならない時点で困る。
そのコードで「捨てられる」のなら困らないってこと?

569 :デフォルトの名無しさん:2005/03/24(木) 23:16:43
その話はつまんないからおしまい

570 :デフォルトの名無しさん:2005/03/24(木) 23:19:35
>>569
君にはむずかしすぎたかな?^^;

571 :デフォルトの名無しさん:2005/03/24(木) 23:19:45
>>568
他の領域まで書き込まれちゃ変数の単位の区切りなんて意味なくなるじゃん
(char)1で代入するなら上位ビットを0で埋めるというより、下位ビットを代入するだけだと思うけど


572 :デフォルトの名無しさん:2005/03/24(木) 23:20:42
JIS X3010:2003
6.5 式
6.5.16 代入式
6.5.16.1 単純代入
(略)
意味規則 単純代入は,右オペランドの値を代入式の型に型変換し,左オペランドで指し示されるオブジェクトに格納されている値をこの値で置き換える。

6.3 型変換
6.3.1 算術オペランド
6.3.1.3 符号付き整数型及び符合無し整数型 整数型の値を_Bool型以外の他の整数型に変換する場合,その値が新しい型で表現可能な場合,値は変化しない。
 新しい型で表現できない場合,新しい型が符合無し整数型であれば(略)
 そうでない場合,すなわち,新しい型が符号付き整数型であって,値がその型で表現できない場合は,結果が処理系定義の値となるか,または処理系定義のシグナルを生成するかのいずれかとする。

573 :デフォルトの名無しさん:2005/03/24(木) 23:20:59
>>570
いや、レベルが低すぎ。
このすれ以前にも益してレベル下がってる。


574 :デフォルトの名無しさん:2005/03/24(木) 23:21:31
>>568
>「代入しようとした値と結果の値が同じにならない時点で困る。」
そもそも桁あふれする値を入れて「結果が違う」なんて言うのは糞プログラマ。
hoge[1] = 10000; で「捨てられ」無かった場合どうなるか。
ヘタするとhoge[0]やhoge[2]が上書きされる。困るだろ。

575 :572:2005/03/24(木) 23:26:56
しまった。ここはC++だった OTL

576 :デフォルトの名無しさん:2005/03/24(木) 23:27:20
ttp://www.kuzbass.ru/docs/isocpp/conv.html#conv.integral
範囲に収まらない整数型への変換では
・変換先が符号無しなら収まらないビットを切り捨て
・変換先が符号有りなら実装定義
ということになるらしい。

char の場合は符号の有る無しが実装定義なので、
char に収まらない値を代入した結果は
実装定義ということになる。

577 :560:2005/03/24(木) 23:34:48
>>574
なんで配列を持ち出してきたんだろうと思ってたら、そういう意味か。
「捨てられない」=「どこかに書き込まれる」なんて思ってなかったから意味がわからなかった。
代入先以外の変数まで触られちゃ困る。当たり前だ。

578 :デフォルトの名無しさん:2005/03/24(木) 23:39:01
検査の結果 >>560 はCPUの仕組みを分かってないことが判明しました。


579 :デフォルトの名無しさん:2005/03/24(木) 23:39:14
intもcharもchar[4]も実際に消費するメモリ量は同じだっけ?(32bitマシンの場合)

580 :デフォルトの名無しさん:2005/03/24(木) 23:40:40
>>579
俺んところはそうなっているみたいだ。

581 :デフォルトの名無しさん:2005/03/24(木) 23:41:31
>>579
struct a {
int b;
char c;
char d;
char e;
char f;
char g[4];
} h;


582 :デフォルトの名無しさん:2005/03/24(木) 23:42:51
>>579
そういう実装が多いね。

583 :デフォルトの名無しさん:2005/03/24(木) 23:44:16
>>581
structならそらちゃうだろな

584 :デフォルトの名無しさん:2005/03/24(木) 23:46:40
>>573
そのわりにはちゃんと理解してる人や、
今再確認にした人が多いみたいだね。

585 :560:2005/03/24(木) 23:46:41
>>578
そんなことは無いぞ。
言語の規格とCPUの仕組みをごっちゃにしないように。

586 :デフォルトの名無しさん:2005/03/24(木) 23:49:11
typedef union tag {
char hoge_c[8000];
int hoge_i[2000];
double hoge[1000];
} MICCHIRI;

無駄がない。鯖で試そうと思ったけど何と無くやめておいたネタ。


587 :デフォルトの名無しさん:2005/03/24(木) 23:50:02
桁溢れが起きると例外を発生するようにしてほしいよね。
そう思わない?
ところで、ボクはCPUとは無関係だと思うなぁ、ハハハ

588 :デフォルトの名無しさん:2005/03/24(木) 23:57:40
言語の規格とCPUの仕組みは完全には分離できないよ。
特にCでは。最適化を考慮して、アセンブラにどう展開
されるかを考えてプログラムするだろ、Cの場合。

589 :デフォルトの名無しさん:2005/03/25(金) 00:02:42
>>588
> 特にCでは。最適化を考慮して、アセンブラにどう展開
> されるかを考えてプログラムするだろ、Cの場合。

しない

590 :デフォルトの名無しさん:2005/03/25(金) 00:06:56
>>588 ごっちゃにしないように。

591 :デフォルトの名無しさん:2005/03/25(金) 00:07:46
>>589
マジっすか。

592 :デフォルトの名無しさん:2005/03/25(金) 00:08:29
>589
しない? 漏れは結構考えるけど。

ところで今は何が争点になっているのやら。

593 :デフォルトの名無しさん:2005/03/25(金) 00:09:31
>特にCでは。最適化を考慮して、アセンブラにどう展開
>されるかを考えてプログラム

しないだろ。そんな事考えなくちゃいけない環境なら最初からアセンブラ使うでしょ

594 :デフォルトの名無しさん:2005/03/25(金) 00:14:31
>593
いやそこまで厳密にどうアセンブラに展開されるかを考えるんじゃなくて(それなら直接アセンブラで書く)、
アルゴリズムとかを考えるとき、どうすればアセンブラに落としたときに
効率のいいコードになるかとか考えたりしない?

CPUの命令の種類とか、メモリのキャッシュとか、C言語から直接は見えないけど
透かして見て考えるくらいならできるでしょ。

595 :デフォルトの名無しさん:2005/03/25(金) 00:15:57
SSEやらを使うときは考えるけど、
あからさまに効率が悪いコードを書かなければ、
最近はコンパイラの最適化の方が優秀な希ガス

596 :デフォルトの名無しさん:2005/03/25(金) 00:32:11
>>595
うむ、だから「最適化を考慮して」と言ったんだ。
最適化がうまくいくようにコードをかく。

597 :デフォルトの名無しさん:2005/03/25(金) 00:38:38
>>596
それはCPU等のハードウェアを透かして見ていると言えるのかな。

598 :デフォルトの名無しさん:2005/03/25(金) 00:44:08
>>596
「最適化がうまくいくように」は言語の規格を意識するべき話だろう。
「アセンブラにどう展開されるか」はCPUの仕組みを意識するべき話だろう。
まぁ、つまりは >>590

599 :デフォルトの名無しさん:2005/03/25(金) 00:46:42
そこまで処理の重さが気になるコードなんてそんなに書く?
書くとしてもインラインアセンブラ使うと思うんだが

600 :デフォルトの名無しさん:2005/03/25(金) 00:47:17
おまいらたまには女性を意識した格好をしてくださいよ。

601 :デフォルトの名無しさん:2005/03/25(金) 00:56:34
速度がいらないならC++という選択肢はないし
そうでなくても普段から速度を意識してしまうのは病気みたいなもんだ

602 :デフォルトの名無しさん:2005/03/25(金) 01:18:52
糞言語使っているなら兎も角、C++で書くときに単純なループを
0との比較は最適化されやすいからという理由でカウントダウンループになんぞしない。

#こういう8bitCPU時代のノウハウを得意げに語る携帯Javaプログラマはうざい。

603 :デフォルトの名無しさん:2005/03/25(金) 01:20:38
時代が変わったんだ!オールドタイプは失せろ!

604 :デフォルトの名無しさん:2005/03/25(金) 01:21:42
ハイハイ、CPUもアセンブラも分からないオコチャマはおねんねしましょうネ

605 :デフォルトの名無しさん:2005/03/25(金) 01:28:32
今でも0との比較って速いの?

606 :デフォルトの名無しさん:2005/03/25(金) 01:31:38
>>605
速いかどうかは兎も角、命令語長が短くなるとKVM使いがほざいてた。

真っ当なコンパイラならもし速くなるのなら最適化でそう言うコードを吐くべきだし、
プログラマはそんなことに頓着する必要はない。

607 :デフォルトの名無しさん:2005/03/25(金) 04:36:10
>556
>10進1024は2進で0111 1111 1111で、

|・ω・`) どうしても誰もコレをつっこまないの?

608 :デフォルトの名無しさん:2005/03/25(金) 05:36:24
>>607
書いた本人です。
0100 0000 0000ですね。
ポカミスです。

609 :デフォルトの名無しさん:2005/03/25(金) 07:06:50
>>607
焦点がそこじゃないから気づかなかった・・・

610 :デフォルトの名無しさん:2005/03/25(金) 07:25:10
自作自演だからじゃないのか?

611 :デフォルトの名無しさん:2005/03/25(金) 08:57:56
本質じゃないから放置した。

612 :デフォルトの名無しさん:2005/03/25(金) 14:07:30
Visual Studio 2005からOpenMP対応でしょ。
コンパイラが並列処理最適化ができるようにforループを書かないならないよ。

613 :デフォルトの名無しさん:2005/03/25(金) 16:24:34
その辺、Intelのコンパイラと統一してくれるとうれしいんだよな
とは言いつつ自分はIntelのコンパイラを使い続けるんだろうけど

614 :デフォルトの名無しさん:2005/03/25(金) 16:28:41
サンデープログラムに高級な最適化なんていらん

615 :デフォルトの名無しさん:2005/03/25(金) 22:16:54
>>605
RISC 系の CPU だとゼロレジスタ持ってるから、多少は速くなると思われ。
0 以外の数字だと、レジスタにその数字をセットする命令が必要になる。

もっとも、そんなところで速度稼いでも大局的には意味はないと思うが。

616 :デフォルトの名無しさん:2005/03/25(金) 22:18:06
C++/CLIの話題はどこですればいいんでしょ

617 :デフォルトの名無しさん:2005/03/25(金) 22:34:12
>>616
微妙。ここか、

managed C++ やろうぜ!!
http://pc8.2ch.net/test/read.cgi/tech/1014486422/

か、

【初心者歓迎】C/C++室 Ver.15【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1111231578/

か…

618 :デフォルトの名無しさん:2005/03/25(金) 22:56:58
managedじゃない?

619 :616:2005/03/25(金) 22:58:24
>>617
>>618
ありがとうです。のぞいてみます

620 :デフォルトの名無しさん:2005/03/25(金) 23:13:28
ManagerがModuleA/B/Cを管理しているとして、
それぞれを別クラスCMgr/CModuleA/B/Cとします。
CMgrはメンバにCModuleA/B/Cのインスタンスを持っています。
普通はCMgrから各モジュールに命令します。
でも、諸事情でModule同士で直接やりとりしたいのですが、
どのようにすればよいのでしょうか?
CModuleAのメンバ変数にCModuleB、CModuleBのメンバ変数にCModuleAを
定義すると当然ながらコンパイルエラーになってしまいます。
どう解決するのでしょうか?
(C++というかモジュール化の問題?)


621 :デフォルトの名無しさん:2005/03/25(金) 23:15:47
>>620
Manager経由で通信するってのはダメなの?

622 :デフォルトの名無しさん:2005/03/25(金) 23:17:41
>>620
ポインタを持てば?前方宣言して

623 :デフォルトの名無しさん:2005/03/25(金) 23:28:40
>>620
相互に参照する必要があるなら、公開するメンバ関数のみをインタフェイスとして

class IModuleA {
public:
virtual int foo() = 0;
};

のように分離して、CModuleA はそれから派生させて実装を追加するという手も定番。

CMgr には IModuleA* GetA() { return &m_moduleA;} みたいなのを追加して、
CModuleB などからはこれで得たインタフェイス経由でCModuleAのインスタンスを
操作する。

624 :620:2005/03/25(金) 23:51:38
>>621
Module固有のIFをMgrに入れるのは避けたいので、、、

>>622
なるほどポインタならOKですね。
すいません、実体しか試してませんでした。
でも、これってModuleAはModuleBのクラス定義を全て
インクルードするんですよね?
publicしかアクセスできないとはいえ気持ち悪いなぁ。。。
C→C++変換をしてるんですが、
Cではモジュール毎に外部公開ヘッダと内部用ヘッダに分けてました。
C++だと両方をクラス定義に押し込んで外部ヘッダはPublicに
内部用はPlivateと考えています。

>>623
これだとIModuleAのヘッダだけのインクルードで済むんで嬉しいんですが、
CMgrにGetAを追加するのが、気になりますねぇ。。。


625 :デフォルトの名無しさん:2005/03/26(土) 15:13:28
A a;
B b;
C c;
D* d = new (a, b, c) D;
このようにnewした場合、対応するdeleteはどのようになるのでしょうか。
d->~D();
D::operator delete(d, a, b, c);
といちいち書く必要があるんですか?

626 :デフォルトの名無しさん:2005/03/26(土) 15:26:07
こうなる
% rm src.cpp

627 :624:2005/03/26(土) 15:51:38
ないということで自己解決しました。

>626
参考になりました。どうもありがとうございます。

628 :625:2005/03/26(土) 15:52:30
>627
すいません。624ではなく625でした。

629 :デフォルトの名無しさん:2005/03/26(土) 16:34:16
>>626
# rm -rf /

630 :デフォルトの名無しさん:2005/03/26(土) 19:16:50
>>625
ここはC++のスレです

631 :デフォルトの名無しさん:2005/03/26(土) 19:39:54
>>625
それ、なんて言語?

632 :デフォルトの名無しさん:2005/03/26(土) 19:57:36
>>630-631
世界バカ発見!

633 :630:2005/03/26(土) 20:12:03
煽ってはみたものの不安になってきた。

D* d = new (a, b, c) D;

こんな構文あったっけ?

634 :デフォルトの名無しさん:2005/03/26(土) 20:35:35
>>633
placement new

635 :デフォルトの名無しさん:2005/03/26(土) 20:43:24
void* operator new(std::size_t, A&, B&, C&);

636 :630:2005/03/26(土) 20:44:53
ご め ん な さ い

637 :デフォルトの名無しさん:2005/03/26(土) 21:18:36
new D(a,b,c)との違いが分からない

638 :デフォルトの名無しさん:2005/03/26(土) 21:24:41
A* a = new (b, c, d) A(e, f, g);
簡単に言うと、これはoperator new(sizeof(A), b, c, d)でメモリを確保し
A(e, f, g)を用いてオブジェクトを作っている

639 :デフォルトの名無しさん:2005/03/26(土) 21:39:46
つまりnewの引数とコンストラクタの引数に分かれてるわけかthx

640 :デフォルトの名無しさん:2005/03/27(日) 01:44:49
STLの本読んでたら
T& map::operator [] (const key_type& key)
この演算は
(*((insert( make_pair(x, T()) )).first)).second
に等しいとあったのですが、これって納得できますか?
まず、mapで[]演算子を使うと、キーが同じものがない場合は
強制的に挿入されるということなので、pair型を作ってinsert
に行きますよね。それはいいのですが、insertが返すのは挿入した
要素の位置(反復子)ですよね。それに対して.firstってできる?
pair型そのものじゃなくて、反復子に対して.firstとやることって
できるんですか?またその.firstで何を得てさらに間接参照して
.secondで何を得るのかいまいちわからんのです(まぁ普通に考えれば
最終的には要素の値(キーではなく)のリファレンスを取得するので
しょうけど・・・)

641 :デフォルトの名無しさん:2005/03/27(日) 01:48:13
その形式のinsertが返すのはpair<iterator, bool>。

642 :デフォルトの名無しさん:2005/03/27(日) 02:00:02
OH!
そうなんですか。
それでガテンがいきますね。
メンバ関数ではないinsertがポイントなんですね。
どうもです。



643 :デフォルトの名無しさん:2005/03/27(日) 02:35:00
>>642
分かってないだろ。

644 :デフォルトの名無しさん:2005/03/27(日) 02:58:24
あ、メンバ関数ですね、map仕様のinsertということですね、しっけい


645 :デフォルトの名無しさん:2005/03/27(日) 03:36:12
>>644
一歩前進

646 :デフォルトの名無しさん:2005/03/27(日) 03:53:13
正常にコンパイル/リンクが通っているソースなのですが
下記の一文を追加するとコンパイルは通りますがリンクエラーがでまくります。
(runtime_errorクラスが使えません)

throw std::runtime_error("TEST");


環境は Vine Linux2.6 gcc-2.95.3-2vl22

メッセージmain.o: In function `main':
main.o(.text+0xd3): undefined reference to `runtime_error::runtime_error(basic_string<char, string_char_traits<char>, __default_alloc_template<true, 0> > const &)'
main.o: In function `__malloc_alloc_template<0>::_S_oom_malloc(unsigned int)':
main.o(.__malloc_alloc_template<0>::gnu.linkonce.t._S_oom_malloc(unsigned int)+0x1a): undefined reference to `endl(ostream &)'
main.o(.__malloc_alloc_template<0>::gnu.linkonce.t._S_oom_malloc(unsigned int)+0x27): undefined reference to `cerr'
main.o(.__malloc_alloc_template<0>::gnu.linkonce.t._S_oom_malloc(unsigned int)+0x2c): undefined reference to `ostream::operator<<(char const *)'
長いので略

リンクオプションは特になにも設定せずデフォルトのままですが
これがまずいのでしょうか。

647 :デフォルトの名無しさん:2005/03/27(日) 04:14:55
つい最近、Unixスレでほぼ同じ理由によるエラーの質問があったな。

ま、ここは環境依存スレじゃないんで。

648 :デフォルトの名無しさん:2005/03/27(日) 06:24:25
>>647 -lstdc++ つけたらうまく行きました。ありがとうございました。

649 :デフォルトの名無しさん:2005/03/27(日) 16:00:57
>>645
incrementedかとおもたよ

650 :デフォルトの名無しさん:2005/03/28(月) 09:14:55
hppはヘッダファイルのc++版でよいの?

651 :デフォルトの名無しさん:2005/03/28(月) 11:30:51
>>650
いい。別に.hでも支障ないけど。

652 :デフォルトの名無しさん:2005/03/28(月) 13:04:43
bool型の配列変数hairetu[5]の中で、どれか1つでもtrueであれば処理を行いたいのですが、

if(hairetu[0,1,2,3,4,5] == true){
処理;
}

というのは不可能でしょうか?やはりfor文で一つ一つチェック?
また、同じくbool型の変数hairetu[5]を一括でfalseにするには、
hairetu[]=false;
hairetu[0,1,2,3,4,5]=false;
といったかき方はダメでしょうか?

初心者のくせに大きめのプログラムを構築しているもので、
コンパイルして実行できないんです。教えていただけません?

653 :デフォルトの名無しさん:2005/03/28(月) 13:09:14
>>652
その書き方は×
STLのfindとfill使えばいいのでは

654 :デフォルトの名無しさん:2005/03/28(月) 13:11:28
>>652
>というのは不可能でしょうか。
不可能

>やはりfor文で一つ一つチェック?
for文でも&&でずらずら並べるでも好きな様に。

>といったかき方はダメでしょうか?
ダメ。

>教えていただけません?
ません。

655 :デフォルトの名無しさん:2005/03/28(月) 13:12:10
>>653
早速のレスありがとうございます。
findを使って構文を書き直しておきました。
一大ミスにつながるところでした^^;

656 :デフォルトの名無しさん:2005/03/28(月) 13:25:52
>>655
仮令大きなプログラムの一部を書いているのでも、小さな単位で確認する習慣をつけるべき。
まさか、机上コーディングしているわけじゃなかろ?

657 :デフォルトの名無しさん:2005/03/28(月) 14:38:12
hairetuでいいかarrayにすべきかここで議論

658 :デフォルトの名無しさん:2005/03/28(月) 15:16:37
while

659 :655:2005/03/28(月) 17:42:58
>>656
はい、これからそうします。

>>657
いやあくまで例ですから・・・´Д`;

660 :デフォルトの名無しさん:2005/03/28(月) 18:36:45
>652
それ以前にC++の基本的な文法を覚えるのが先じゃないのか?
>hairetu[0,1,2,3,4,5]
こんなのあり得ないし

661 :デフォルトの名無しさん:2005/03/28(月) 18:39:28
>>660
別に文法的に間違ってはいないけどな
hairetu[5]と同義になるだけだけど

662 :デフォルトの名無しさん:2005/03/28(月) 18:39:52
危ないから目を合わせてはいけません

663 :デフォルトの名無しさん:2005/03/28(月) 19:00:44
>>662
世界バカ発見!

664 :デフォルトの名無しさん:2005/03/28(月) 19:17:12
struct A{ char data[4]; };
struct B{ char data[4];
virtual B~(){} };
仮想関数がないクラスをnewしても
メモリ確保されてないんだがなぜ?
(最適化されてるからかな?)
new A[1000000];//メモリ消費しない
new B[1000000];//メモリ消費する


665 :デフォルトの名無しさん:2005/03/28(月) 19:18:35
最適化オフで試してみたか?

666 :デフォルトの名無しさん:2005/03/28(月) 19:24:05
バーロー

667 :デフォルトの名無しさん:2005/03/28(月) 19:29:15
>>664
メモリへの書き込みがあるまではメモリが増えない、という
実装になってるんじゃないかと。

668 :デフォルトの名無しさん:2005/03/28(月) 19:49:45
>>661
…コンマ演算子の詳細を忘れていたよ。サンクス

669 :デフォルトの名無しさん:2005/03/28(月) 20:11:02
質問です。
英語ソフトの日本語化でハマっているものです。

・こちらの開発環境はMS社のVC++ Ver6 日本語版。
・英語版のソースは海外の開発元から頂いております。
・私はVCもCもほとんど触ったことがありません。

ボタンやメニュー上の英語は、フォント名の変更と日本語名称の入れ替えでなんとかなりました。
しかし、印刷の日本語が文字化けしてしまい、上手くいきません。この部分が質問です。

フォント名の指定は日本語も通るように「MSゴシック」に変更しました。印刷上でもフォント名の変更が反映されました。
日本語名称の入れ替えた部分は、見事に文字化けになっています。

考えられる問題点を教えて頂きたいのですが。

自分なりに疑いのありそうな部分を並べますと。
・インストーラ形式で作成していないので、コアらしきexeファイルの
 入れ替えのみで日本語化している。(DLL等も入れ替えないとダメ?
・変数の指定が二バイト文字を受け付けない。(そんなことがありえ
 るのか全く知りません..
・1バイト文字しか通過できない何かがまだ隠されている。
・開発環境が間違っている。

何方か、アドバイスいただければ幸いです。
よろしくお願いします。

670 :664:2005/03/28(月) 20:20:27
>>665,667
VC6最適化なしRelease ->増加なし
VC6最適化なしDebug ->増加
667の通りかも、

これだと頻繁アクセスする時だとvirtual使うデメリット大きいなぁ.....
でもどのタイミングで確保されるんだろう?
頻繁に使うときはvirtualの方がいいってケースもありうるかも


671 :670:2005/03/28(月) 20:21:50
× これだと頻繁アクセスする時だとvirtual使うデメリット大きいなぁ.....
○ これだと頻繁アクセスしない時だとvirtual使うデメリット大きいなぁ.....


672 :デフォルトの名無しさん:2005/03/28(月) 20:33:06
>これだと頻繁アクセスしない時だとvirtual使うデメリット大きいなぁ.....
デメリットは無い

>頻繁に使うときはvirtualの方がいいってケースもありうるかも
そんなケースは無い

673 :デフォルトの名無しさん:2005/03/28(月) 21:12:37
>>670
>でもどのタイミングで確保されるんだろう?

メモリにアクセスしたとき。
仮想関数があるBはvtableへのアドレスを設定するため、newするときに各要素にアクセスがある。
デバッグが有効だと未初期化のメモリは0xCDCDCDCDで埋めるコードが生成されるので
どちらもアクセスがある。

newが実際にメモリ確保に使ってるHeapAllocはアドレスだけ予約して、物理メモリをマッピングしてないっぽい。
で実際アクセスがあったときに物理メモリを割り当てる、と。

674 :デフォルトの名無しさん:2005/03/28(月) 21:44:59
>664
newしてメモリが確保されていないってどうやって確認したの?

675 :デフォルトの名無しさん:2005/03/28(月) 21:50:10
>>669
スレ違い。
そもそも説明が冗長で肝腎な情報が抜けている。

676 :デフォルトの名無しさん:2005/03/28(月) 22:25:47
>>669
>何方か、アドバイスいただければ幸いです。
・C/C++未経験者が他言語へのポートをする事がそもそも間違い。
・Windows 自体の知識も怪しい。
・ていうか、スレ違い。
煽ってるわけではなく、マジで。

677 :669:2005/03/28(月) 23:02:33
>>675さん >>676さん
すいません。

GUI環境は、MS社の開発環境はVBをちょっとかじった程度でした。
Web系でCやPerl、PHPを少々触れていたのですが、場違いだったようです。
この件、自分もタッチしたくなかったのが本音ですが、緊急事態で助けを求められたもので..。
明日、自分なりにもう少し頑張ってみます。
ありがとうございます。

678 :669:2005/03/28(月) 23:04:35
うーん..。
> GUI環境は、MS社の開発環境はVBをちょっとかじった程度でした。
GUI環境は、MS社のVBをちょっとかじった程度でした。
駄目だこりゃ。

679 :675:2005/03/28(月) 23:58:38
>>678
スレ違いだからこれ以上は避けるが、最後に一言。
>669を読んで、何を印刷しようとしているのか判る?
こちらはどんなプログラムか、どんなデータを扱うのか、何を印刷するのか何もわからない。
それでアドバイスができると思う?

680 :デフォルトの名無しさん:2005/03/29(火) 00:25:39
リソースの言語を日本語にしてからMSゴチとかの設定にする

681 :デフォルトの名無しさん:2005/03/29(火) 02:34:41
シリアライズで質問があります。

共通の基底クラスを持つ A, B, C などのクラスがあって、ファイルに保存したり
読み込んだりしようと思いました。

そこで、保存する時にクラス名を先頭に書き込んでおいて、読み込むときには
クラス名をキーにして、それぞれのクラスの static な読み込み関数のポインタを
得るマップを作って、それで生成しています。

でも、これだと新しいクラスを追加した時に、先ほどのマップに別の場所で登録
しなければならなくて、なんとなくいやな感じです。

こういうことをもっとスマートにできる方法は、無いのでしょうか?

682 :デフォルトの名無しさん:2005/03/29(火) 02:57:30
boost::serializationでも使ってみてはどうだろうか。

683 :デフォルトの名無しさん:2005/03/29(火) 02:58:32
とりあえずBoost.Serializationでも読んでみる。

684 :681:2005/03/29(火) 03:13:50
>>682-683
ありがとうございます。今から読んでみます。

685 :681:2005/03/29(火) 05:58:27
>>682-683
試してみましたが、すごい便利ですね。
STL のコンテナに対応して、派生クラスの面倒も見てくれるので、
えらくすっきりしそうです。

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

686 :デフォルトの名無しさん:2005/03/29(火) 09:39:24
staticなメンバ関数で、さらにそれを仮想関数にするなどという
テクニックもありですよね?

687 :デフォルトの名無しさん:2005/03/29(火) 09:48:40
なし

688 :デフォルトの名無しさん:2005/03/29(火) 10:21:18
ttp://www.ksky.ne.jp/~seahorse/cpp/staticvirtual.html

689 :デフォルトの名無しさん:2005/03/29(火) 13:16:51
クラスのメンバ変数って、コンストラクタで特に初期化しなかった場合、
例えばメンバにクラスをもっていたら、デフォルトコンストラクタで
初期化されるんでしたよね?でも組み込み型は、未初期化のようなんですが、
デフォルトで初期化されるのはクラス型のメンバだけということでいいので
しょうか?


690 :デフォルトの名無しさん:2005/03/29(火) 14:07:36
コンパイルエラーで、
>dllimport 関数 の定義は許されません。
これが表示されたときにもっとも疑うものはなんですか?

691 :デフォルトの名無しさん:2005/03/29(火) 14:13:37


692 :デフォルトの名無しさん:2005/03/29(火) 14:15:27
>>691
言われると思った。
それで、なんですか?

693 :デフォルトの名無しさん:2005/03/29(火) 14:21:17
>>692
dllimportはDLLからその関数の定義を読み込むって意味だから
自身のソースで関数を定義すると多重定義になるんでは?

694 :デフォルトの名無しさん:2005/03/29(火) 14:48:56
>>690
dllexportとdllimportを切り替えるマクロの不備。

695 :デフォルトの名無しさん:2005/03/29(火) 15:05:59
>689
いいのです

696 :デフォルトの名無しさん:2005/03/29(火) 15:56:31
>>695
スルーされたと思いきや、どうもです

697 :デフォルトの名無しさん:2005/03/29(火) 17:20:56
クラスのアクセス指定子に関して今まで物凄い誤解をしていたかもしれないのですが、
それも某HPに次のような説明があったためです。

public継承
親のpublicメンバ ---> 子のpublicメンバ
親のprotectedメンバ ---> 子のprotectedメンバ
親のprivateメンバ ---> 子のprivateメンバ

protected継承
親のpublicメンバ ---> 子のprotectedメンバ
親のprotectedメンバ ---> 子のprotectedメンバ
親のprivateメンバ ---> 子のprivateメンバ

private継承(デフォルト)
親のpublicメンバ ---> 子のprivateメンバ
親のprotectedメンバ ---> 子のprivateメンバ
親のprivateメンバ ---> 子のprivateメンバ

これをぱっと見て、あぁなるほどね、と最初は思ったのですが、
ものすごい誤解ではないですか?


698 :デフォルトの名無しさん:2005/03/29(火) 18:38:52
>697
親のprivateメンバ → 子からアクセスできない

699 :デフォルトの名無しさん:2005/03/29(火) 19:53:35 ID:
やはりそうですよねぇ

700 :669:2005/03/29(火) 20:56:01
>>680さん
ありがとうございます。
お陰さまで、印刷上でも日本語化できました。

キャラクターセットのシフトJISが鍵だったようです。
十数年ぶりのc++、開発環境に慣れるまでが面倒でした。
あとは力作業のみ。

701 :デフォルトの名無しさん:2005/03/30(水) 01:51:25
ある可変引数のグローバルC関数があります。
ラッパークラスのメソッドを経由してこのグローバルC関数を呼び出したいのですが、
このさい、ラッパークラス側のメソッドは、呼び出される側と同じインタフェースの可変引数にした
いと思っています。ソース公開されているので、呼び出される側のグローバルC関数の方を弄っ
て(vfprintfのように)va_list引数にすれば実現可能なのはわかっているのですが、呼び出される
側に一切手を加えずに、このようなことを実現はできますか。
オーバロード関数を死ぬほど用意するとか、そういうのは無しで。
スタックフレームに依存したコードで、ポータビリティはなくなってもかまいません。(redhat linux)

702 :デフォルトの名無しさん:2005/03/30(水) 02:00:44
何回か同じ意図の質問は見たことがある
定番のやりとりが嫌だから、俺は回答を書かないけど

703 :デフォルトの名無しさん:2005/03/30(水) 03:15:31
>>701
自分の環境でのvfprintfの実装を参考にしてください。
環境非依存の方法はありません。

704 :デフォルトの名無しさん:2005/03/30(水) 03:22:36
それでも一応書いとくか。
Cスレの過去ログ倉庫で、最近の方から順番に検索すれば
概ね実現可能な方法が見つかると思うよ。
もちろん、そのまま渡せる引数の最大個数等は
コンパイル時に決定されちゃうけどね。

705 :デフォルトの名無しさん:2005/03/30(水) 05:57:59
インラインアセンブラ使ってごにょごにょとか

706 :デフォルトの名無しさん:2005/03/30(水) 08:56:14
>703,704
サンクス。
かなり面倒くさそうですが、
勉強のため調べてみます。

707 :デフォルトの名無しさん:2005/03/30(水) 10:09:46
VC++でクラス内のメンバ関数呼び出すと、スタックフレーム上の戻りアドレスの
前に4バイト分オブジェクトインスタンスだかなんだかのポインタが入るけど、
ここら辺の資料どっかない?構造体が知りたいんだけど。

708 :デフォルトの名無しさん:2005/03/30(水) 11:21:33
構造体?

709 :デフォルトの名無しさん:2005/03/30(水) 11:33:11
クラスメソッドならthisポインタ入ってるの当たり前じゃないか?

710 :デフォルトの名無しさん:2005/03/30(水) 12:54:11
分からない事があるので、質問です。

if(m_Heap.find(Text)!=m_Heap.end()){
return(true);
}
else{
return(false);
}

VC++.NETのSTLのMapを用いて上記のソースを記述したのですが、
trueが返る筈の場所でfalseが帰ってしまいます。
で、トレース実行してみたところ

if(m_Heap.find(Text)!=m_Heap.end()){
(1)return(true);
}
else{
(2)return(false);
}

と、何故か実行されるステートメントの矢印が移動します。
こんな事は、普通ありえないと思うのですが何か原因があるのでしょうか?

711 :デフォルトの名無しさん:2005/03/30(水) 13:05:34
>>710
ステップデバッグの正常な動き。
自分で似たコードを書いて、returnしたときにどこに矢印がいくか調べてみれば?

712 :デフォルトの名無しさん:2005/03/30(水) 13:16:23
ところで、その動作だったら
return m_Heap.count(Text);
のほうが良いと思う。

713 :デフォルトの名無しさん:2005/03/30(水) 15:09:53
>>710
矢印の動きが腑に落ちないなら、最適化が切られていることを確認した上でリビルドしてみ。
あと、スレ違い。

714 :デフォルトの名無しさん:2005/03/30(水) 21:22:06
>>705
リンカ使って、static メンバ関数のシンボルを C 関数の別名扱いに
するとか。思い切り処理系依存だが。

715 :デフォルトの名無しさん:2005/03/31(木) 00:32:43
>>707
ATLのソースでも見てみよ。とエスパーしてみる。

716 :デフォルトの名無しさん:2005/03/31(木) 01:39:42
>>715
>>709に答えが出てるわけだが

717 :デフォルトの名無しさん:2005/03/31(木) 01:45:41
>>715
ATLなんて糞みてーなライブラリのソースなんて見ても何の価値もなし


718 :デフォルトの名無しさん:2005/03/31(木) 02:10:45
文字列初期化の時、どれが正しいのでしょうか

char *a="hoge";
char a[]="hoge";
char a[]={'h','o','g','e','\0'};

719 :デフォルトの名無しさん:2005/03/31(木) 02:14:07
配列とポインタについて勉強しろ。
せめてC FAQは読め。

720 :デフォルトの名無しさん:2005/03/31(木) 02:14:11
>>718
・一番目はポインタであり、それ以外は配列である。
・2番目と3番目は同じ。

721 :デフォルトの名無しさん:2005/03/31(木) 02:15:03
2番目と3番目は同義
初期化だけならどれでも問題ない
どう使うかによる

722 :デフォルトの名無しさん:2005/03/31(木) 02:17:02
つまらない質問に答えてくれて
ありがとうございました

723 :デフォルトの名無しさん:2005/03/31(木) 02:52:58
CStringArrayに入っている文字列を"\n"で連結して一つの文字列にしたいのですが、
どうやればいいのでしょうか?


724 :デフォルトの名無しさん:2005/03/31(木) 03:03:55
あの〜すれちがいですけど...

725 :デフォルトの名無しさん:2005/03/31(木) 03:09:29
はぁ?

726 :デフォルトの名無しさん:2005/03/31(木) 04:10:45
つまらない質問なんですけど、
一度も呼び出される事のない関数をコンパイラの判断で
省いてくれる(実行形式ファイルにコードとして含まれない)
ような事ってあるんですか。

構造体のメンバ変数を呼び出すのと、メンバごとに分割した
変数を使用するのとでは、できあがるファイルは同じになりますか。
(例えば、pos.x;pos.yをpos_x pos_yのように分割する。)

int length = str.length;のようにメンバ変数を直接、読み出すのと、
int length = str.getlength();のように、単に単一の変数をメンバ関数か
らreturn length;
のように値を返すのは同じバイナリを吐き出しますか。

727 :デフォルトの名無しさん:2005/03/31(木) 04:26:48
>>726
インラインでない限りcall命令は省かれることないと思うけど
今のコンパイラはまだそこまで頭良くないと思う

728 :デフォルトの名無しさん:2005/03/31(木) 04:33:58
>>726
最後のお題は関数に inline を付けるか
コンパイルオプションで設定すれば
おそらく同じバイナリだな

あと真ん中の例は分かりにくいからもう少し詳しく

729 :デフォルトの名無しさん:2005/03/31(木) 04:36:40
早くしないとネムネム...

730 :デフォルトの名無しさん:2005/03/31(木) 04:42:12
どこからも参照されていない関数をリンクしない機能というのは少なくともVC++のリンカにはある。
ttp://www.microsoft.com/japan/developer/library/vccore/_core_.2f.opt.htm

731 :デフォルトの名無しさん:2005/03/31(木) 05:00:34
>>730
俺知らんかったよ
背のビーして人にアバドイスするもんじゃないね
反省、反省


732 :デフォルトの名無しさん:2005/03/31(木) 08:46:08
>>726です。

みなさんお答え頂きまして有難う御座います。

真ん中のは、構造体内の変数にアクセスする時に、わざわざ
オフセットを加えたりしないのかという事です。

staticやautoの構造体の場合は、その手間は必要ないのでは
ないかということです。
(ポインタの場合でも同様なのか良く分かりません)

。。つまらないとこ拘ってすいません。。

あと、struct pos[500000];/*int x;int yがメンバ*/
とかした場合には、int pos_x[500000]int pos_y[500000]
とかするよりCPUのメモリのキャッシュヒットが良いかもしれないと
かどうとか、どこかに書かれていた記憶があります。

なんか混乱してきた

733 :デフォルトの名無しさん:2005/03/31(木) 09:03:41
>>732
構造体に纏めるか纏めないか、ということかな?
具体例を書いてくれると判りやすいのだが。
struct Pos {int x; int y;};として、
Pos pos;

int pos_x; int pos_y;

Pos.x = 0; Pos.y = 0;

pos_x = 0; pos_y = 0;
のように使うなら全くといっていいほど同じコードになる筈。

Pos pos[10000];

int pos_x[10000]; int pos_y[10000];
の場合、ループ内でx, y を同時に使用するなら確かにキャッシュヒット的には構造体の方が有利。

つーか、C++の場合、構造体化することによって様様なコンストラクタを用意したり、
ちょっとしたハンドリング用のメンバ関数を用意するなどの便利さを重視するべきかも。

734 :デフォルトの名無しさん:2005/03/31(木) 09:14:41
>>732
そういうレベルが気になるならこんなとこで質問してないでアセンブラの読み方覚えてコンパイラが吐いたコード眺めたほうがはやい。
どのみち状況とコンパイラ次第なんだから。

735 :デフォルトの名無しさん:2005/03/31(木) 09:17:46
>>733さん有難う御座います。
言いたかったのはそういうことです。

やはり同じコードになってくれるんですね。
(なってくれなかったりしたら嫌だなと思いまして書かせていただ
きました。)

利便性とか隠蔽とか(環境によってはコード補完とかも?)も考えた
ら素直にメンバ関数使うべきみたいですね。

736 :デフォルトの名無しさん:皇紀2665/04/01(金) 00:45:46
>718が普通にスルーされてるが、まずいんじゃないのか?
(一応720とかに書いてあるけどさ)

ポインタと配列なのでsizeofの結果が違うことと、ポインタの方はconstな
文字列を指してるんで変更できない。

int main(int argc,char** argv){
 char *a="hogehoge";
 char b[]="hogehoge";
 
 //a[1]='a'; //これをやると環境にもよるがSegmentation fault
 b[1]='a';
 
 printf("a - %d %s\n",sizeof(a),a);
 printf("b - %d %s\n",sizeof(b),b);
}

> ./a.exe
a - 4 hogehoge
b - 9 hagehoge


737 :デフォルトの名無しさん:皇紀2665/04/01(金) 00:57:03
ってか、春休みでなきゃ「初心者スレに逝け」で済まされる質問だし。

738 :デフォルトの名無しさん:皇紀2665/04/01(金) 01:27:26
『プログラミング言語C++』を絶版にするらしいね。

739 :デフォルトの名無しさん:皇紀2665/04/01(金) 01:35:23
っていうか、ひとりのレスだけを鵜呑みにして信じちゃって良いのか?
いや、ケチつけんじゃなくてマジでさ。

740 :デフォルトの名無しさん:皇紀2665/04/01(金) 12:24:19
皇紀じゃつまんないな。
他の板はいろいろバリエーションあるのに。

741 :デフォルトの名無しさん:皇紀2665/04/01(金) 12:37:30
>>740
ム板なだけに、エポック秒で表示しろってか?

742 :デフォルトの名無しさん:皇紀2665/04/01(金) 14:52:26
>>741
それいいね、酸性
管理人にリクエストすれば良かった

743 :デフォルトの名無しさん:皇紀2665/04/01(金) 16:41:07
16進表記がいいんじゃないか?

744 :デフォルトの名無しさん:皇紀2665/04/01(金) 16:46:52
皇記2665/04/01(金)16:45:02
皇記A69/04/01(金)10:2D:02
皇記101001101001/100/01(金)10000:101101:10


745 :デフォルトの名無しさん:皇紀2665/04/01(金) 18:04:31
read.cgiの負荷を考えなければ、datにエポック秒で持っていれば
2ch用ブラウザとかで好き放題表示変更できるのにな。


746 :デフォルトの名無しさん:int 2ch =05/04/01(金) 21:40:59
なぜ割り込み

747 :デフォルトの名無しさん:int 2ch =05/04/01(金) 21:59:23
>int 2ch =05/04/01(金) 21:40:59

int
まず有り得ない。char使うとしても""が足りない。

2ch
変数名の先頭に数字は使えない。


全角。超有り得ない。なでしこでも使ってろピザ

748 :デフォルトの名無しさん:int 2ch =05/04/01(金) 22:06:07
せめてtime_tの方がふいんき(なぜかryが出るだろうに。

749 :デフォルトの名無しさん:int 2ch =05/04/01(金) 22:18:14
もまえらDOSのシステムコールしらなすぎ。

750 :デフォルトの名無しさん:int 2ch =05/04/01(金) 22:19:28
>>749
int 21h 最強!

751 :デフォルトの名無しさん:int 2ch =05/04/01(金) 23:03:02
main関数で何もreturnしなかった場合は、自動で0がリターンされる
ことになるのはC++独自の仕様?C言語は違うよな?

752 :デフォルトの名無しさん:int 2ch =05/04/01(金) 23:05:35
>>751
Cでも同じ
ISO/IEC 9899:1999 5.1.2.2.3 Program termination -1
If the return type of the main function is a type compatible with int,
... reaching the } that terminates the main function returns a value of 0.

753 :デフォルトの名無しさん:int 2ch =05/04/01(金) 23:21:34
あれ、そうなのか。なんかCの書籍だときっちりreturn 0書いてて
C++の書籍だと省略してるのが多い気がしたのは、単なる気のせいか。
それともC言語は昔は自動でリターンしてなくて、そのころの書籍を
見てたのかな。

754 :デフォルトの名無しさん:int 2ch =05/04/01(金) 23:27:02
>>753
752のはいわゆるC99
C89では省略すると未定義
http://www.bohyoh.com/CandCPP/FAQ/FAQ00016.html

755 :デフォルトの名無しさん:int 2ch =05/04/01(金) 23:27:42
それは 0 をどんな実行環境に対して返しているつもりなのか明確に定義している本か?

756 :デフォルトの名無しさん:int 2ch =05/04/01(金) 23:28:56
処理系非依存のつもりで自己陶酔してるヴァカ著者のデムパ本

757 :デフォルトの名無しさん:int 2ch =05/04/01(金) 23:33:13
VC++を使っています。
MFCを使わずにコントロールを作ろうとしています。

継承なしの class CHogeCtrl を定義し、
Create メソッドで CreateWindow を呼んでウインドウを生成していてます。
ところが RegisterClassEx に渡す WindowProc をインスタンスメソッドにできないため、
WindowProc の中で呼び出し元のインスタンスにアクセスする方法が思いつきません。

コントロールのメッセージ処理はどうやって実装するのでしょうか。

知恵をお貸し下さい。お願いします。

758 :デフォルトの名無しさん:int 2ch =05/04/01(金) 23:38:10
>>757
SetWindowLong, GetWindowLong, GWL_USERDATA, reinterpret_cast, ...

これ以上必要ならここで聞け
http://pc8.2ch.net/test/read.cgi/tech/1112345886/l50

759 :デフォルトの名無しさん:int 2ch =05/04/01(金) 23:41:37
>>758
おお、感謝です!

毎回コールするしかなさそうなのが辛いところですが・・・

760 :デフォルトの名無しさん:int 2ch =05/04/01(金) 23:42:00
>>757
SetProp()やWNDCLASSEX::cbWndExtraとSetWindowLongPtrを使う方法や、std::map<HWND, CHogeCtrl *>を使ったり
ATL/WTLみたいにウィンドウ毎にWndProcのHWNDをCHogeCtrlに書き替えてメンバ関数のWndProcを呼び出したり色々手段はある。

761 :デフォルトの名無しさん:int 2ch =05/04/01(金) 23:48:25
>>760
ありがとうございます。

色々手段があるのですね。
とても勉強になりました。

762 :デフォルトの名無しさん:int 2ch =05/04/02(土) 00:29:26
C++からC関数はEXTERN "C"を使って呼び出せるようなんですが、
この時にコールバック関数を渡して、C++からC関数を
コールバック呼出しすることってできるのでしょうか?
関数呼出し時のスタック内容が違うみたいなんでダメっぽいですが。。。


763 :デフォルトの名無しさん:int 2ch =05/04/02(土) 00:41:55
C++関数とC関数はどう違うのですか?

int hoge(){}

はどっち?

764 :デフォルトの名無しさん:int 2ch =05/04/02(土) 00:42:25
>>763
言語が違う。

765 :デフォルトの名無しさん:int 2ch =05/04/02(土) 00:42:55
>>763
でも、おそらくコンパイルすれば同じ結果になる。

766 :デフォルトの名無しさん:int 2ch =05/04/02(土) 00:47:29
>>760
バカヤロウ、スレ違いのネタ引っ張るんじゃねえ。

767 :デフォルトの名無しさん:int 2ch =05/04/02(土) 00:49:40
Cおっぱい
{
float m_radius;
float m_height;
int m_segmentU;
int m_segmentV;
float m_milk;
public:
void SetRadius( float m_radius ){ this->m_radius = m_radius; }
float GetRadius( void ){ return m_radius; }

void もみもみ(void);
void つまむ(void);
void わしづかみ(void);
int しぼり( int force ){ return m_milk; }
}

void main(void)
{
Cおっぱい m_cCup;
m_cCup.SetRadius( 20.0f );

}
オブジェクト指向ってこんなかんじ?

768 :デフォルトの名無しさん:int 2ch =05/04/02(土) 01:22:47
__cdeclとかってどうなのよ?>エロイ人

769 :デフォルトの名無しさん:int 2ch =05/04/02(土) 01:23:26
>>768
どうなのよって何が?

770 :デフォルトの名無しさん:int 2ch =05/04/02(土) 01:24:57
壮絶な誤爆をしたようで。

771 :デフォルトの名無しさん:int 2ch =05/04/02(土) 01:25:33
orz

772 :デフォルトの名無しさん:int 2ch =05/04/02(土) 01:31:59
>>767
駄目だ駄目だ駄目だ!
そんなんじゃオブジェクト指向は程遠いぞ!
乳輪のメンバ変数と、個人的に舐めるメソッドを追加しないと!

773 :デフォルトの名無しさん:int 2ch =05/04/02(土) 01:45:52

ばか?

774 :デフォルトの名無しさん:int 2ch =05/04/02(土) 02:04:23
とりあえず名前の付け方がキモ過ぎる

775 :デフォルトの名無しさん:int 2ch =05/04/02(土) 02:06:43
変数名やら関数名でm_で始まるのってなんか意味あるんですか?

776 :デフォルトの名無しさん:int 2ch =05/04/02(土) 02:08:02
>>775
メンバ変数だということを体現している。

777 :デフォルトの名無しさん:int 2ch =05/04/02(土) 02:09:22
そうなんですかありがとうございます。
てっきりmyを略した物だと思ってました

778 :デフォルトの名無しさん:int 2ch =05/04/02(土) 02:11:13
>>777
マイクロソフトが昔好きだった記法だよ

779 :デフォルトの名無しさん:int 2ch =05/04/02(土) 02:17:22 ?##
/**
  Cカップおっぱいクラス(おっぱいクラスの派生クラス)
  ほかはおっぱいクラスで宣言されているのでいらない
*/
class Cおっぱい : public おっぱい
{
public:
  Cおっぱい(radius = 20.0) : おっぱい(radius) {}
  virtual ~Cおっぱい();
public:
  virtual void Doもみもみ();
  virtual void Doつまむ();
  virtual void Doわしづかみ();
  virtual double Doしぼり();
}

int main()
{
  Cおっぱい cCup;
  cCup.Doもみもみ();
  return 0;
}

780 :デフォルトの名無しさん:int 2ch =05/04/02(土) 02:24:53 ?###
あとすいません、変数名の先頭に~が付いてるのもありますが、
何か特殊な意味があるのでしょうか?

781 :デフォルトの名無しさん:int 2ch =05/04/02(土) 02:26:33
>>780
デストラクタだよ。C++知らないの?

782 :デフォルトの名無しさん:int 2ch =05/04/02(土) 02:40:08
…変数?

783 :デフォルトの名無しさん:int 2ch =05/04/02(土) 02:45:29
変数と関数は区別できない λ式ってどうして導入されないんだろう。

784 :デフォルトの名無しさん:int 2ch =05/04/02(土) 02:55:33
>>781
すみませんCしか知りません

785 :デフォルトの名無しさん:int 2ch =05/04/02(土) 03:45:53
>>783
そんな貴方も、明日からboost::lambdaで変態に!

786 :デフォルトの名無しさん:int 2ch =05/04/02(土) 07:17:13
C++の参考書として、独習C++の購入を考えてました。
が、テンプレに載ってない事で不安になって(;´Д`)

ボンビーなんで・・・コレを買えば間違いないという名著を教えてエロい人!
ちなみに、Cは入門書程度ならイケます


787 :デフォルトの名無しさん:int 2ch =05/04/02(土) 10:51:26
>ちなみに、Cは入門書程度ならイケます
程度ならC++は100年早い

788 :デフォルトの名無しさん:int 2ch =05/04/02(土) 11:12:33
>>786
禿本。(>>4を見よ)
誰だって始めは初心者だ。モノになる人材に必要なのは手加減より必要事項が書いてあること。
俺が「初心者」だった頃は、これとコンパイラのマニュアルしかなかった。(初版だったが)
今だって、新しい仕事のたびに何かの初心者で大抵は英語版のマニュアルで必死に憶えている。

789 :デフォルトの名無しさん:int 2ch =05/04/02(土) 11:28:13
>>785
それは本当のλ式じゃないじゃん。Cの関数ってカリー化もできないんじゃん。

790 :デフォルトの名無しさん:int 2ch =05/04/02(土) 11:58:18
本当のλ式はCで実装されています

791 :デフォルトの名無しさん:int 2ch =05/04/02(土) 12:00:02
C/C++ に何かが「ない」って騒ぐやつ
結局一番肝心なことがわかってねえなw

792 :デフォルトの名無しさん:int 2ch =05/04/02(土) 12:02:48
>>791
肝心な事はなんだ

793 :デフォルトの名無しさん:int 2ch =05/04/02(土) 12:22:20
class の「参照を返すメンバ関数」についての質問です。

整式の加減乗除のプログラムを(趣味で)作っているのですが、

class poly
{
private:
int max_dim;
double* coefficients;
public:
/* 中略 */
poly& operator=(const poly& x);
/* 以下略 */
};
/* 中略 */
poly& poly::operator=(const poly& x)
{
/* 代入処理 */
return (*this);
}

とすると、

poly.cc: In member function `poly& poly::operator=(const poly&)':
poly.cc:59: error: passing `const poly' as `this' argument of `int
poly::getdim()' discards qualifiers

というエラーメッセージが出てしまうのですが、どう解決したらよいか分かりません。
よろしくお願い致しますm(_ _)m

794 :デフォルトの名無しさん:int 2ch =05/04/02(土) 12:27:48
>>793
メッセージの中に書いてあるint poly::getdim()が怪しいと思わないのか?

795 :793:int 2ch =05/04/02(土) 12:31:49
>>794
そうでした!!
こんなヴァカな質問に答えてくださってありがとうございますm(_ _)m

自分のヴァカさが嫌になったので吊ってきます。

796 :デフォルトの名無しさん:int 2ch =05/04/02(土) 12:46:16
>>784
「変数」とか言っちゃう時点で、Cすら怪(ry

797 :デフォルトの名無しさん:int 2ch =05/04/02(土) 12:47:28
>>791
いや、だから、Cの仕様は数学的におかしいとこだらけなんだって。

798 :デフォルトの名無しさん:int 2ch =05/04/02(土) 12:49:03 ?##
>>797
数学的な正しさよりも、システムズプログラミングと
アプリケーションプログラミングの両方を
扱えることのほうが重要だから。

799 :デフォルトの名無しさん:int 2ch =05/04/02(土) 12:51:31
まぁ、それはある意味正しいよね。
そして目も当てられないようなバグに悩まされるんだよね。
苦労が絶えないねぇ。

800 :デフォルトの名無しさん:int 2ch =05/04/02(土) 12:54:00
ごめん、なんだかスレ間違ってたよ。
ずっとバグの出にくい言語仕様スレだと思って書いてた。

801 :デフォルトの名無しさん:int 2ch =05/04/02(土) 12:55:04 ?##
>>799
それはCの話?C++の話?

C++を知らずにCのことを前提として
C++も似たようなものだと思って
いっしょくたに批判してない?

>>797ではCのことを書いてるようだからそう思ったわけだが。

802 :デフォルトの名無しさん:int 2ch =05/04/02(土) 12:56:15 ?##
なんじゃそりゃーー

803 :デフォルトの名無しさん:int 2ch =05/04/02(土) 12:58:54
>>801
もちろんC++も知っているよ。

804 :デフォルトの名無しさん:int 2ch =05/04/02(土) 12:59:28
>>801
基本的なところは何も変わってないと思う。

805 :デフォルトの名無しさん:int 2ch =05/04/02(土) 13:00:24
STLも歪にしか見えない。

806 :デフォルトの名無しさん:int 2ch =05/04/02(土) 13:19:06 ?##
その「基本的なところ」ってなに?
ポインタとか?ガーベッジコレクションがないとか?

807 :デフォルトの名無しさん:int 2ch =05/04/02(土) 13:23:55
>>806
一言で言うなら、「型」ですね。

808 :デフォルトの名無しさん:int 2ch =05/04/02(土) 13:38:24 ?##
>>807
よくわかんねーー

809 :デフォルトの名無しさん:int 2ch =05/04/02(土) 13:54:07
というわけで、とりあえず雲に巻いていいですか?
スレ違いっぽいので。

810 :デフォルトの名無しさん:int 2ch =05/04/02(土) 13:55:56
それを言うなら「煙(けむ)に撒く」でしょう。

811 :デフォルトの名無しさん:int 2ch =05/04/02(土) 13:57:38
>>810
そうだ、それが正しい

812 :デフォルトの名無しさん:int 2ch =5,2005/04/02(土) 14:39:29
アホが「何か知ってるふり」をし続けてるのを見るのって
ちょっと辛いものがあるね。

813 :デフォルトの名無しさん:int 2ch =5,2005/04/02(土) 14:41:41
>>812
僕は自分が解からないことならなんでも批判したがる人を見るとちょっと辛くなる

814 :デフォルトの名無しさん:int 2ch =5,2005/04/02(土) 14:57:44 ?##
>>812>>813の意見は
別に背反する意見じゃなくてどちらも正しいと思う。

それはどうでもいいから
CとC++において基本的なところである「型」のせいで
「目も当てられないようなバグに悩まされる」具体的な例を
示していただければ幸いです。

815 :デフォルトの名無しさん:int 2ch =5年,2005/04/02(土) 15:19:24
struct Hoge {
 int a;
 double b;
}

main()
{
 return 0;
}

コンパイルデキネー

816 :デフォルトの名無しさん:int 2ch =5年,2005/04/02(土) 15:27:41
>>815

struct Hoge {
    int a;
    double b;
};

int main()
{
    return 0;
}

817 :デフォルトの名無しさん:int 2ch =5年,2005/04/02(土) 16:56:50
typedef std::codecvt<wchar_t, char, std::mbstate_t> codecvt_type;

std::locale system_locale("");
std::locale::global(system_locale);

char from_buf[BUFSIZ];
std::cin >> from_buf;

char const * from = static_cast<char const *>(from_buf);
std::size_t from_size = strlen(from);
char const * from_end = from + from_size;
char const * from_next = 0;

boost::shared_array<wchar_t> to_sp(new wchar_t[from_size]);
wchar_t * to = to_sp.get();
wchar_t * to_end = to + from_size;
wchar_t * to_next = 0;

std::memset(to, 0, sizeof(wchar_t) * (from_size));

codecvt_type::state_type state;
std::memset(&state, 0, sizeof(codecvt_type::state_type));

codecvt_type const & cvt = std::use_facet<codecvt_type>(system_locale);
if (cvt.in(state, from, from_end, from_next, to, to_end, to_next) == codecvt_type::error) {
std::wcout << std::strerror(errno) << std::endl;
std::exit(1);
}

std::codecvt を使って char * から wchar_t * を作るコードを書いたんだけど、
std::locale::global(system_locale); しないと動かないのは、こういうものなの?

818 :マイク ◆yrBrqfF1Ew :2005/04/02(土) 18:38:07
std::cinからどれだけ読まれるのか不明だな(▽

819 :デフォルトの名無しさん:2005/04/02(土) 23:18:51
Effective C++ 43項で、多重継承する際の多義性について、回避策を
あげていますが、これってどういう原理なんですかね。クラスの継承で
1クッション置いてるようですが・・・。
それにVC++.netじゃコンパイルでこの例のdarw()の多義性解決できなかったし。
あんまり使えるもんじゃないのかな。

820 :デフォルトの名無しさん:2005/04/02(土) 23:50:13
>819
解らないなら解るまで読め。
>それにVC++.netじゃ〜
理解してもいないのに使いこなせないのをコンパイラのせいにするな。

821 :819:2005/04/03(日) 00:07:31
というか書いてない部分でわからないんですが、
なんで片方のdraw()を限定して呼び出せるのかというところです。
あと、使いこなす以前に、エラーになるという意味ですよ。

822 :デフォルトの名無しさん:2005/04/03(日) 00:11:18
Effective C++持ってない俺にはさっぱりだ

823 :デフォルトの名無しさん:2005/04/03(日) 00:31:27
持ってるがまだ43項までいってない

824 :デフォルトの名無しさん:2005/04/03(日) 00:58:12
>821
>なんで片方のdraw()を限定して呼び出せるのか
それぞれlotteryDraw()とgraphicalObjectDraw()とに、呼び出す名前を変えたから。

825 :819:2005/04/03(日) 01:42:38
ん?呼び出す名前変えたっていっても
最初に呼び出してるのはdraw()ですよね、その例だと。
そしてどちらかのdraw()を呼び出すことが決まった結果、
そのdraw関数内の実装により、lotteryDraw()かgraphicalObjectDraw()が
呼び出されますよね。
ポインタの型がLottery*型だとなぜAuxLotteryの方のdarw()と決まるのか。

826 :デフォルトの名無しさん:2005/04/03(日) 02:57:15
>825
>最初に呼び出してるのは
最初ってなんやねん

>ポインタの型がLottery*型だとなぜAuxLotteryの方のdarw()と決まるのか。
AuxLotteryを継承したクラス(LotterySimulation)でdraw()をオーバーライドしてないから。

827 :デフォルトの名無しさん:2005/04/03(日) 05:42:42
cinってなんて読むの?「ちん」って言ったら笑われたのだが

828 :デフォルトの名無しさん:2005/04/03(日) 05:52:18
シーイン

829 :デフォルトの名無しさん:2005/04/03(日) 06:07:52
じゃあcoutは「ちょうと」か

830 :デフォルトの名無しさん:2005/04/03(日) 06:27:41
シーアウト

831 :デフォルトの名無しさん:2005/04/03(日) 06:51:54
じゃあendlは「えんでる」か

832 :デフォルトの名無しさん:2005/04/03(日) 07:32:34
エンドライン

833 :デフォルトの名無しさん:2005/04/03(日) 09:00:49
オンドゥル

834 :デフォルトの名無しさん:2005/04/03(日) 09:33:58
>>826
>AuxLotteryを継承したクラス(LotterySimulation)でdraw()をオーバーライドしてないから。
でも、AuxGraficalObjectも同じ条件ではないのですか?
こちらにもdraw()があってそれを継承したときにオーバーライドしてませんよね。

835 :デフォルトの名無しさん:2005/04/03(日) 11:27:49
【keybd_eventリピート入力】
keybd_eventを使って別のアプリに方向キー押下を伝える処理でつまずいています。
手動でキーを長押しすると、WndMessageにキーイベントが連続して入力されますよね。
例えば、
keybd_event(VK_DOWN,0x50,KEYEVENTF_EXTENDEDKEY,0);
で下キーダウンさせれば、
keybd_event(VK_DOWN,0xd0,KEYEVENTF_EXTENDEDKEY|KEYEVENTF_KEYUP,0);
でキーアップするまでの間は、キーがリピートされても良い様な気がするのですが、
如何なものでしょうか?

スキャンコードは、ここから拾ってきました。
http://www.microsoft.com/whdc/device/input/Scancode.mspx

836 :デフォルトの名無しさん:2005/04/03(日) 11:29:31
すいません。 C言語について
初心者なので教えていただきたいのですが、

@『ある計算を1万回計算して、その結果をすべて出力する
 プログラム。』

A『ある計算を1万回計算して、その結果は出さずに、
 その1万回計算した結果の平均だけを出力するプログラム』

 この@とAのプログラムはどうやって書いたらいいんですか?
 簡単に書けるプログラムですか?

かなり初心者なので、すいませんが教えていただきたいです。

837 :デフォルトの名無しさん:2005/04/03(日) 11:31:14
簡単に書けます

838 :デフォルトの名無しさん:2005/04/03(日) 11:39:39
>>836
ここは C++ スレなんで、C の話は他でやれ。
宿題は宿題スレへ池。以上。

839 :836:2005/04/03(日) 11:42:10
>>838
C++でもいいです。教えてください

840 :デフォルトの名無しさん:2005/04/03(日) 11:53:08
>836はマルチにつき放置推奨で。
>>839
本人なら謝れ。成り済ましならそれくらいにしとけ。

841 :デフォルトの名無しさん:2005/04/03(日) 11:53:38
>>839
出来るところまで自分で書いてから来なさい。

書こうにも全く書けないなら宿題スレが初心者スレへ行け。

842 :デフォルトの名無しさん:2005/04/03(日) 11:54:27
>>836
while(1){
 printf(1+1);
}

843 :デフォルトの名無しさん:2005/04/03(日) 12:40:58
2バイト値を4バイトのポインタにCキャストした時、
上位2バイトは0で埋められるというのは、
C++の仕様で定義されていますか?
それと、C++スタイルで書きたい場合こういうキャストはreinterpret_castでいいのですか?

844 :デフォルトの名無しさん:2005/04/03(日) 14:11:46
>>843
定義されてない。ポインタ型と同サイズの整数型に関しては、reinterpret_cast で
可逆変換が可能だと規定されてるが、そのマッピング方法は処理系依存。

ただ、一般的なアーキテクチャの CPU を前提とするとビットパターンを保って
変換するのが妥当なので、それで期待通りの動作をすると思うよ。いずれに
せよ処理系依存なので、詳しくは処理系のマニュアルを読むか、処理系を
晒してくれ。

845 :デフォルトの名無しさん:2005/04/03(日) 15:59:11
>834
なんでそこでAuxGraficalObjectが出てくる?
Lotteryと継承関係はないだろ。

AuxLotteryでLotteryのdraw()をオーバーライドしてlotteryDraw()を呼んでるから、
それ以降の継承でdraw()をオーバーライドしない限りAuxLotteryのdraw()が継承されてlotteryDraw()が呼ばれる。

あー、らちがあかん。
おまえのいう
>VC++.netじゃコンパイルでこの例のdarw()の多義性解決できなかった
このソースをあげろ。

846 :デフォルトの名無しさん:2005/04/03(日) 17:23:02
std::ofstream fout("test.txt");
は、コンパイルを通り、
std::ofstream fout = std::ofstream("test.txt");
は、コンパイルを通りませんでした。
何が間違っているのか教えてください。
c++初めて2日目なのであまりよくわかりません。

847 :デフォルトの名無しさん:2005/04/03(日) 17:27:41
>>846
コピーコンストラクタが protected だから
最適化で呼ばれなくなったコピーコンストラクタも
アクセス制限のチェックは回避されないことになっている

848 :デフォルトの名無しさん:2005/04/03(日) 17:35:13
VC++6.0でPanelコントロールってあります?

849 :デフォルトの名無しさん:2005/04/03(日) 17:39:31
スレ違い

850 :846:2005/04/03(日) 18:01:46
>847
今の自分には理解不可能なようです。
ありがとうございました。

851 :!847:2005/04/03(日) 18:48:41
>>850
おいおい、簡単に投げ出しすぎだぞ。

前者は、std::ofstream型の実体を一つだけ(fout)作成している。
後者は、std::ofstream型の実体を一時的に作成してからそれを使ってもう一つ(fout)作成しようとしている。
このとき、コピーコンストラクタを使用するわけだが、それがprotectedなのでエラーになるわけだ。

852 :デフォルトの名無しさん:2005/04/03(日) 18:51:43
通りすがりの者なんですが、>>846の書き方は、どんな違いがあるのですか?処理で。
どちらもインスタンスを初期化するんですよね?
やさしいc++には
class名 インスタンス名(引数)

class名 インスタンス名 = class名(引数)
と書くことができる。と記述されているんですが、>>847によると違うんですよね?

853 :852:2005/04/03(日) 19:00:24
あれー。投稿文書いてる最中に答えが投稿されたよ。
>>851
そうなのですか。全く同じ処理で書き方が違うのかと思ってました、今まで。
参考になりました。有り難うございました。

854 :デフォルトの名無しさん:2005/04/03(日) 19:02:55 ?##
>>852を読む限りでは「やさしいC++」ってクソっぽいな。。

855 :デフォルトの名無しさん:2005/04/03(日) 19:28:22
先生質問!

コンストラクタを書かないとデフォルトコンストラクタが用意されるんですよね?
そう本に書いてありました。
てことは引数ありとかなしとかのコンストラクタを書けば、デフォルトコンストラクタは用意されないんですよね?

引数ありのコンストラクタ、デフォルト引数付き、を一つだけ書いたプログラムがあるんですが、
クラス名 変数名();と書いたら、デフォルト引数が代入されたコンストラクタが呼ばれると思ったら、そのコンストラクタが呼ばれないようなんです。
てかまるでデフォルトコンストラクタが呼ばれているようなんです。

もしかして、デフォルトコンストラクタが定義されるのは、
「コンストラクタを定義しなかったとき」ではなくて
「引数無しのコンストラクタを定義しなかったとき」なんですか?

私は何を勘違いしてますか?先生助けて!

856 :デフォルトの名無しさん:2005/04/03(日) 19:29:53
>クラス名 変数名();と書いたら、

関数宣言になるだけだな

857 :855:2005/04/03(日) 19:50:33
>>856
マジっスか!?
main()の中に書いてるんですけど、定義も書いてないんですけど。
関数を宣言して、どうやって使うんでしょうか?
興味が湧いてきたんですが資料がないです。ネットにイイところないですかね。

858 :デフォルトの名無しさん:2005/04/03(日) 19:55:45
禿本にはっきり書いてあるよ
へたに手加減した入門書に頼るからわからない・・・

859 :デフォルトの名無しさん:2005/04/03(日) 20:16:28
陸、海、空オンライン、ただ今鋭意!開発中!
http://www112.sakura.ne.jp/~kaientai-project/creategame2.htm


860 :デフォルトの名無しさん:2005/04/03(日) 20:18:15 ?##
>>859
プログラマが決まってねーじゃんwwwwうんこwww

861 :デフォルトの名無しさん:2005/04/03(日) 20:22:45
俺がやってやろうか、OCamlで良ければ。

862 :デフォルトの名無しさん:2005/04/03(日) 20:23:35
あ、サーバ用意しないといけないのか。だったらダメだ。金払ってまでやりたくねー。

863 :デフォルトの名無しさん:2005/04/03(日) 20:25:57 ?##
>(言語はC#限定)開発環境、サーバーを用意できるプログラマを緊急募集!

C#っていうのはまぁいいとして、なんでsourceforgeとかじゃいけないのかがわからん。

864 :デフォルトの名無しさん:2005/04/03(日) 20:35:05
>>859
「乳揺れの実装」って…ワロース

865 :デフォルトの名無しさん:2005/04/03(日) 20:42:30
C#限定って低脳丸出しやん

866 :デフォルトの名無しさん:2005/04/03(日) 20:51:31
>>857
関数を宣言したらあとは呼ぶなりなんなりご自由に。
宣言なんだからコンパイラはどこか別のファイルにでも関数の定義があってリンカが解決してくれるだろうと思っている。

867 :デフォルトの名無しさん:2005/04/03(日) 21:00:07
>>852
コンストラクタの引数が1つだけのとき、次の2つは同じ扱いなのは知っているだろ。
class名 インスタンス名(引数);とclass名 インスタンス名 = 引数;

class名(引数)は一時オブジェクトの作成を意味する。
そして普通、クラスは自分自身のクラスを引数に1つ取るコンストラクタ(コピーコンストラクタ)を持っている。
つまりclass名 インスタンス名 = class名(引数)ってやると、
そのインスタンスは一時オブジェクトが実引数のコピーコンストラクタで初期化されていると言うことになる。

868 :デフォルトの名無しさん:2005/04/03(日) 21:26:57
散髪屋:500回に一回散髪失敗する。(失敗髪型を用意、NPCコメント「変な髪形になりましたねw」)
髪型は、リアルで、2ヶ月は変更不可。

869 :855=857:2005/04/03(日) 21:38:47
>>866
関数宣言だけで、定義が何処にもなくてもコンパイルが通って実行ファイルが出来てしまうんですが、どういうことでしょう?
定義がないと実行ファイルまでたどり着かないんでないんですか?

870 :デフォルトの名無しさん:2005/04/03(日) 21:44:15
>>869
その関数を実際に使おうとしない限り、定義がなくても問題ない

871 :デフォルトの名無しさん:2005/04/03(日) 21:54:02
>>833
渤海国のかたですか?

872 :817:2005/04/04(月) 13:11:55
誰も真面目に答えてくれてない…(´・ω・`)ショボーン

873 :デフォルトの名無しさん:2005/04/04(月) 14:11:57
>>872
【C++】STL(Standard Template Library)相談室
http://pc5.2ch.net/test/read.cgi/tech/1095583235/139-


874 :817:2005/04/04(月) 15:56:57
>>373
STL の質問じゃなくて、C++ のロケール周りについての質問ですが?

875 :デフォルトの名無しさん:2005/04/04(月) 17:06:31
>>373
>>874だってさ、今ごろレス付けられて大変だな。

>>874
139から順に見てくとヒントがあると思うが、それでは足りんのか?

876 :デフォルトの名無しさん:2005/04/04(月) 17:23:13
STLport の codecvt の実装見て、唖然とした記憶がある。
ただ単純に 1文字づつキャストしてコピーしてただけだった。

877 :817:2005/04/04(月) 17:33:21
>>876
> std::codecvt を使って char * から wchar_t * を作るコードを書いたんだけど、
> std::locale::global(system_locale); しないと動かないのは、こういうものなの?
そのスレではこの質問の答えが見付からない。

878 :デフォルトの名無しさん:2005/04/04(月) 18:19:25
>>876
お呼びだよ。がんばってね〜

879 :876ぢゃないけど:2005/04/04(月) 18:30:17
>>817
そういうものらしい。
http://www.scl.kyoto-u.ac.jp/scl/appli/appli_manual/SUNWspro/WS6U2/ja/manuals/stdlib/user_guide/loc_io/3_3.htm#332
>アメリカ英語 ASCII ロケールに対応した、標準 C++ ライブラリの定義済みの
>ロケールオブジェクトである locale::classic() を
    :
>大域ロケールは、最初は、前述のクラシックロケールになっています。
    :
>入出力ストリームのような国際化構成要素では、デフォルトで大域ロケールを使用します。

880 :817:2005/04/04(月) 19:18:02
>>879
サンクスコ。
マルチロケールの場合は std::codecvt を使ってても、
適宜 std::locale::global() を毎回呼び出さにゃならんのか。

自前で std::codecvt 使って変換するより、stream に imbue した方が良さげやね。

881 :デフォルトの名無しさん:2005/04/04(月) 20:29:14
人に物聞く態度じゃねぇなぁ。

882 :デフォルトの名無しさん:2005/04/04(月) 22:36:00
【C++】int (integer) 相談室

こんくらい馬鹿げた分類だ
俗に STL と呼ばれるライブラリは ISO/IEC14882 で定義されている C++ そのものの一部にすぎない

883 :デフォルトの名無しさん:2005/04/04(月) 22:47:57
動的配列扱うテンプレートクラスをstd::vector使わずに自作してる漏れはアフォですか?

884 :デフォルトの名無しさん:2005/04/04(月) 22:58:52
>>883
自作するのは悪くない
できの悪い自作を使っていればあふぉ

885 :デフォルトの名無しさん:2005/04/04(月) 23:23:36
>>882
つか、もう STL って呼称は不要じゃないかとおもゆ。

886 :デフォルトの名無しさん:2005/04/05(火) 02:28:11
クラスをmemset()で0埋めするのって、論外だと思うんだけどどうよ。

887 :デフォルトの名無しさん:2005/04/05(火) 03:57:26
>>886
POD-type以外ならば論外

888 :STL:2005/04/05(火) 04:53:41
>>885
なんだと

889 :デフォルトの名無しさん:2005/04/05(火) 07:35:20
>>887
>817がcodecvt::state_typeに対してやってるな。<ZeroFill

890 :デフォルトの名無しさん:2005/04/05(火) 07:44:37
>>886
・全てのデータメンバが public(メンバ内メンバについても再帰的に適用)
・vtbl を持たない
つまり、memset を書く側が全ての責任を掌握しているならOK。

891 :デフォルトの名無しさん:2005/04/05(火) 08:24:42
>>887
PODでも、ポインタや浮動小数点数に対する memset が
意味を成さない事を考えると、やっぱり論外だろ。

892 :886:2005/04/05(火) 09:54:31
つまり、オーソドックスなCの構造体でもない限りやるべきでないと。
つーか、クラス設計側からmemset()せよと言ってこない限りやるなって感じか。
それだったら寧ろ、クラス側で初期化関数でも用意して欲しいもんだ。

893 :デフォルトの名無しさん:2005/04/05(火) 10:39:58
構造体でも厳密にはやっちゃいけないって話じゃなかったっけ

894 :817:2005/04/05(火) 12:48:54
>>889
codecvt_type::state_type == std::mbstate_t です。
これは C の構造体なので、memset() しました。

895 :デフォルトの名無しさん:2005/04/05(火) 14:32:48
でもなんかキモイ。

896 :デフォルトの名無しさん:2005/04/05(火) 17:22:20
>>894
構造体の初期化なら、こっちの方がわかりやすいのでは。

codecvt_type::state_type state = {0};

897 :デフォルトの名無しさん:2005/04/05(火) 20:54:40
>>891
アーキテクチャに依存して良いこと確定なら、そういうコードを
書いても構わんと思う。ぶっちゃけ Win32 API 使ったプログラム
書いてるなら、そこだけ気をつかっても移植性ないわけで。

898 :デフォルトの名無しさん:2005/04/06(水) 01:20:55
>>897
> アーキテクチャに依存して良いこと確定なら

memset や ZeroMemory で埋めること自体にたいしたメリットが無いのに、
そんな曖昧な条件付で認める意味がわからない。

既に書かれたコードを修正してまわる必要は無い、ということなら話はわかるが。


899 :デフォルトの名無しさん:2005/04/06(水) 09:03:43
fstreamとワイド文字の関係について聞きたいのですが
wofstream a;
a << L"ABCDEFG";
のようにやればワイド文字も出力できるらしいことを知ったのですが
同じように日本語を出力すると
a << L"あいうえお";
ファイルを見ても出力されてません。
日本語は無理なんでしょうか。
よろしくお願いします。

900 :デフォルトの名無しさん:2005/04/06(水) 09:07:56
>>899
#include <locale>
int main()
{
    std::locale::global(std::locale("japanese"));


901 :899:2005/04/06(水) 09:55:42
>>900
Winアプリのログ出力用に使おうと思って
早速やってみたんですがうまくいかず、
コンソールでやってみたら、うまくいきました。
Win32だとできないんでしょうか・・・。
質問ばかりですみません。

902 :デフォルトの名無しさん:2005/04/06(水) 10:02:56
>>901
WindowsアプリならWinMainとかへ移せよ。
main()じゃなくてもとにかくワイド文字を使ったストリームを使うより前にstd::locale::global(std::locale("japanese"));があれば出来るはず。

903 :899:2005/04/06(水) 10:13:04
>>902
いろいろテストしてみて分かったのは
std::locale::global(std::locale("japanese"));
する前にwofstreamが宣言されているとダメ。
=グローバル変数だとダメ。

とりあえずポインタをグローバルにして
std::locale::global(std::locale("japanese"));
のあとにnewでやってみたいと思います。
ありがとうございました。

904 :デフォルトの名無しさん:2005/04/06(水) 10:19:24
ポインタだとかグローバル変数だとか……

905 :デフォルトの名無しさん:2005/04/06(水) 12:18:33
>>903
それならこうするとどう?
wofstream ofs("hoge"); //グローバル
ofs.imbue(std::locale("japanese")); //WinMainかどこか

906 :デフォルトの名無しさん:2005/04/06(水) 14:42:26
素直にCのロケール関数を使うというのはこのスレでは禁忌かね?

setlocale( LC_ALL,"" );

907 :デフォルトの名無しさん:2005/04/07(木) 00:04:36
>>898
> memset や ZeroMemory で埋めること自体にたいしたメリットが無いのに、
構造体のサイズが変わっても大丈夫。いや、そのためのコンストラクタなんだが、
C/C++ ハイブリッドでプログラミングせにゃならん場合もまだあるんで。

ついでに構造体の要素に構造体サイズを書き込むようにしておくと、関数
呼び出しインターフェースの後方互換性を保ちつつ拡張しやすい。

908 :デフォルトの名無しさん:2005/04/07(木) 00:11:54
移植性の話は無視して、そもそもゼロ埋めの利点って何?
単にバグ発見を遅らせるだけのような気がするのだが

909 :デフォルトの名無しさん:2005/04/07(木) 00:16:07
ゼロ埋めが許される条件って??
sockaddr_inとかレガシーな構造体をmemsetしてるの結構
みかけるんだけど

910 :デフォルトの名無しさん:2005/04/07(木) 00:27:41
>>908
逆だろ。ポインタが含まれてればアクセスしたとたん落ちる。

911 :デフォルトの名無しさん:2005/04/07(木) 00:50:25
>>908
メンバをひとつひとつ 0 クリア (整数・実数) または NULL クリア (ポインタ)
するのが面倒っちいとき、memset() なら一行で、かつメンバ変数の増減が
あっても気にしなくていい、とか。
個人的には気持ち悪さが先にたつけどね。

912 :デフォルトの名無しさん:2005/04/07(木) 01:14:00
HOGE hage = {0};
ってやればmemsetすらいらないんだけどな。

913 :デフォルトの名無しさん:2005/04/07(木) 02:02:05
C++厨はこれだから困る、COBOLでもやっとけ

914 :デフォルトの名無しさん:2005/04/07(木) 02:11:23
>>912
HOGE *hage
hage = malloc(sizeof(HOGE));
*hage = {0};

こうできなきゃ実質意味無い

915 :デフォルトの名無しさん:2005/04/07(木) 02:51:29
だからコンs

916 :デフォルトの名無しさん:2005/04/07(木) 10:31:52
>>914
HOGE const zero_initialized_HOGE = {0};
*hage = zero_initialized_HOGE;

こっちのほうがマシ。

917 :デフォルトの名無しさん:2005/04/07(木) 10:33:50
>>914
calloc使えばええやん

918 :デフォルトの名無しさん:2005/04/07(木) 11:02:45
PODならnew hoge()って括弧付ければ0クリアしてくれるだろ

919 :916:2005/04/07(木) 11:07:34
>>918
あ、それじゃぁ
*hage = HOGE();
でいいのか。

zero_initialized_〜 はCで使ってた方法だったようだ。

920 :デフォルトの名無しさん:2005/04/07(木) 20:00:56
>>918
でたらめこくでねぇ

>>919
よいわけねぇべ

921 :デフォルトの名無しさん:2005/04/07(木) 20:02:09
>>920
違うの?
詳細キボン

922 :デフォルトの名無しさん:2005/04/07(木) 21:02:33
>>916
それじゃ、スタックに乗っちゃうじゃん

923 :デフォルトの名無しさん:2005/04/07(木) 21:58:39
>>921
実際やってみれ

924 :デフォルトの名無しさん:2005/04/08(金) 00:06:50
>>922
static つけるか、 namespace スコープに定義を移すか、 どっちかすればいいだろ。

925 :デフォルトの名無しさん:2005/04/08(金) 00:26:02
>>920,923
ttp://www.kuzbass.ru/docs/isocpp/expr.html#expr.new
ttp://www.kuzbass.ru/docs/isocpp/expr.html#expr.type.conv
ttp://www.kuzbass.ru/docs/isocpp/decl.html#dcl.init

規格の 5.3.4.15 と 5.2.3.2 により、 T がPOD型であれば
new T() および T() の値はデフォルト初期化されることになっている。
8.5.5 により、POD型に対するデフォルト初期化はゼロ初期化になる。
ゼロ初期化は T x = {0} と同様の初期化である。

>>921
規格への準拠度に不安のあるコンパイラ使ってるんじゃなければ、安心していい。

926 :デフォルトの名無しさん:2005/04/08(金) 01:05:55
HOGE hage();

927 :デフォルトの名無しさん:2005/04/08(金) 01:27:46
>>926
はいはい関数宣言ね。

928 :デフォルトの名無しさん:2005/04/08(金) 06:05:04
>>920=>>923って>>926が言いたかっただけ?

929 :デフォルトの名無しさん:2005/04/08(金) 08:49:28
俺のVC7ゼロ初期化しねーよ!タココンパイラだな

930 :デフォルトの名無しさん:2005/04/08(金) 09:58:23
POD型のみのメンバで構成された構造体はPOD型なの?

931 :デフォルトの名無しさん:2005/04/08(金) 09:58:57
>>930 はいそうです。

932 :925:2005/04/08(金) 10:13:30
忘れてたけど、神経質な人はこちらも参照するように。
ttp://www.open-std.org/jtc1/sc22/WG21/docs/cwg_defects.html#178

struct T { int i; std::string s }; のような(PODとは言えない)型についての初期化動作が
新しい値初期化(value initialize)という言葉によって規定されることになっている。

933 :デフォルトの名無しさん:2005/04/08(金) 12:14:47
何?そしたら>>920はトンデモの人ですか?逝っていいよ>>920

934 :デフォルトの名無しさん:2005/04/10(日) 15:32:22
>>920はpodかどうかを標準では判定できないことを体現したのです

935 :デフォルトの名無しさん:2005/04/11(月) 01:19:36
もしかしてfstream等のストリームは例外をthrowしないんですか?
newをわざと例外をthrowするようにしてstringstreamにoperator<<で書き込んでみたけど
例外は飛んで来ませんでした。

936 :デフォルトの名無しさん:2005/04/11(月) 01:25:21
>>935
自分でいじったnewがoperator<<で呼ばれなかっただけじゃない?

937 :935:2005/04/11(月) 01:42:37
>>936
いえ、自分のoperator newが呼ばれていることは
std::coutへの出力とデバッガで追っかけるので確認しました。

938 :デフォルトの名無しさん:2005/04/11(月) 01:55:19
>>937
ストリームは例外をthrowする。
原因を知りたければソース晒せ。

939 :デフォルトの名無しさん:2005/04/11(月) 02:21:51
>>935
streamは古いC++との互換性を重視し、デフォルトでは例外を飛ばさない
ようにしてあるが、意図的に飛ばす事もできる。

それがメンバ関数 exceptions()。但し飛ばせる例外はstd::ios_base::failure
クラスに含まれるフラグに限られる。具体的にはstd::ios::eofbit、std::ios::failbit、
std::ios::badbit等。

940 :デフォルトの名無しさん:2005/04/11(月) 02:23:44
おっと。送出される例外は、std::ios_base::failureオブジェクト、でした。

941 :デフォルトの名無しさん:2005/04/11(月) 02:34:00
>>939
ユーザーがテンプレートを介して例外を飛ばす処理を混ぜた場合は
ストリームの例外マスクは関係ないだろ。

942 :デフォルトの名無しさん:2005/04/11(月) 03:08:04
こんな簡単な例でもちゃんと例外は飛んでくるな。ふむふむ。

#include <iostream>
#include <sstream>

class Except {
};

std::ostream& operator<<(std::ostream& os, const Except& ex) throw(int)
{
 throw 1;
}

int main()
{
 std::ostringstream ostr;
 Except ex;

 try {
  ostr << ex;
 }
 catch (const int&) {
  std::cout << "int thrown from ostringstream\n";
 }
}

943 :デフォルトの名無しさん:2005/04/11(月) 11:26:05
>>942
は?

944 :935:2005/04/11(月) 12:28:43
exceptionsを呼ぶことで例外が飛んでくるようになりました。
exceptions周辺のソースを見たところ
ストリームバッファやnew等が例外を投げた場合はその例外がそのまま飛んできて
例外が投げられなくてもストリームバッファの処理がエラーで返った等の場合はfailureがthrowされるようですね。

945 :デフォルトの名無しさん:2005/04/11(月) 23:35:36
class A
{
class C;
class B
{
public:
class B(C& r) { int i = r.i; }
};
class C
{
public:
int i;
};
};

A::BのコンストラクタはCの完全な宣言が必要なはずなのにコンパイルが通ってしまいます。(VC++6)
このB, CをAの外に出すとCが認識できない型とエラーになります。
この振る舞いは言語規格として正しいのでしょうか?

946 :デフォルトの名無しさん:2005/04/12(火) 00:52:40
>>945
g++ (GCC) 3.4.1 (cygming special)
:7: error: expected `)' before '&' token

947 :デフォルトの名無しさん:2005/04/12(火) 02:11:53
VC7.1はそのままコピペで通っちまったぜぃ

948 :デフォルトの名無しさん:2005/04/12(火) 05:33:00
sign(x) = { 1(x>=0), -1(x<0) }
となるような、引数の符号を返してくれる関数って標準にありませんか?

949 :デフォルトの名無しさん:2005/04/12(火) 05:52:58
(x>0)-(x<0)

950 :デフォルトの名無しさん:2005/04/12(火) 09:30:24
>>949
なるほど、こんなもんかな。
template<class T> int sign(const T& a){return (a > 0) - (a < 0);}

951 :デフォルトの名無しさん:2005/04/12(火) 09:33:27
< と > のオーバーロードを要求する時点で終わってる

952 :デフォルトの名無しさん:2005/04/12(火) 09:57:02
>>950
「符号」が意味を成すような型に、大小比較を要求して何が悪いの?

953 :952:2005/04/12(火) 09:58:02
アンカーミスった。 ×950 → ○951

954 :デフォルトの名無しさん:2005/04/12(火) 09:59:30
<だけで十分事足りるって事

955 :デフォルトの名無しさん:2005/04/12(火) 10:03:03
じゃ、
template<class T> int sign(const T& a){return (0 < a) - (a < 0);}
で。std::min()/max()にあわせて < のみ必要ということで。

956 :デフォルトの名無しさん:2005/04/12(火) 10:04:58
>>955
それなら漏れも全然文句なし

957 :デフォルトの名無しさん:2005/04/12(火) 10:35:01
950がダメで955が良い理由を教えてプリーズ

958 :デフォルトの名無しさん:2005/04/12(火) 10:37:27
>957
∩∩
(x0 )

959 :デフォルトの名無しさん:2005/04/12(火) 11:08:47
符号有りなしを比較するのに < しかオーバーロードしないケース
ってあるのか?


960 :950=955:2005/04/12(火) 11:17:07
>>959
そう言う横着する香具師もいるかも知らん。
少なくとも、敢えて両方使う必要がないと納得した。
#実際、自分でもそう言うクラス作ってるし。
##まぁ、符号判断はしてないが。

961 :デフォルトの名無しさん:2005/04/12(火) 11:33:55
Effective C++ の第3版って、Sutterの C++ Coding Standards と内容かぶってない?

962 :デフォルトの名無しさん:2005/04/12(火) 12:32:25
end()で得られるイテレータに対しインクリメントをした場合の動作は
どう定義されているのでしょうか?
自分で作ったクラスにvectorやlistのiteratorと同じものを実装しようとしてます。

963 :デフォルトの名無しさん:2005/04/12(火) 12:51:50
>>960
そこでboost::operatorsですよ

964 :960:2005/04/12(火) 14:03:07
>>963
仕事ではboostを使いにくい事情があるし、個人ではSTLを一通り理解してからと思ってるので
boost::operatorsは知らなかった。よければ簡単に解説してくれないかな。

965 :945:2005/04/12(火) 15:05:48
>>946-947
VCコンパイラの余計なお世話ってことで、言語的にはNGなんですかね。

966 :デフォルトの名無しさん:2005/04/12(火) 15:38:41
>>965
問題はそこではなくて、
単純なシンタックスの方。
>class B(C& r) { int i = r.i; }
これがおかしいと>946は指摘している。

967 :945:2005/04/12(火) 15:51:35
>>966
ああ、直す前のコードを貼ってしまった様で・・・
そこのclassは取ってください・・・

968 :デフォルトの名無しさん:2005/04/12(火) 17:36:17
>>964
let's boostをそのまま引用

「特別な理由がなければ、a > b と b < a は同じ意味にすることが多いと思います。
要するに、operator< を定義してしまえば即 operator> の定義も決まると言うこと。
operator== と operator!=、あるいはこれらと operator<=、operator>= の関係も同じですね。
こういうのを、最低限の演算子だけは定義してから残りを boost::operators に任せることで、
自動的に生成することができます。」

operator>を定義すれば勝手にoperator<も定義してくれる…とかそういう話
operator+=からoperator+ なども。

969 :デフォルトの名無しさん:2005/04/12(火) 19:04:38
template<class T> int sign(const T& a){return (T(0) < a) - (a < T(0));}
の方がいいんでねぇかなぁ。

970 :964:2005/04/12(火) 19:06:13
>>968
THX!
やはりboostも勉強しておいた方がいいなぁ……

971 :デフォルトの名無しさん:2005/04/12(火) 21:37:20
どんなものがあるかぐらいは知っておくといいかもしれないです

972 :デフォルトの名無しさん:2005/04/12(火) 23:04:44
>>955>>969も結局"0"に関するコンセプトが必要になりますよね.

>>961
>Effective C++ の第3版
第2版と第3版の差分って何ですか?

>>962
end()で得られるイテレータはそもそもインクリメントの事前条件を
満たさないので結果は未定義です.

973 :961:2005/04/13(水) 01:04:27
>>972
差分というか構成が全然違う。
ttp://www.codecomments.com/showthread.php?s=3bf5b9d9a7292a490bd71acc7abdc171&threadid=408863&perpage=10&pagenumber=2

974 :デフォルトの名無しさん:2005/04/13(水) 01:08:13
>>972
さらに汎用的にするなら、比較の基準となる値を特性クラスで渡すとか。

// 必要なら特殊化する
template <typename T> struct traits { static T const base = T(0); };

// ここも必要なら U に適当なクラスを渡す
template<class T, class U = traits<T> > int sign(const T& a)
{ return (U::base < a) - (a < U::base); }

975 :デフォルトの名無しさん:2005/04/13(水) 01:33:20
>>945,965
いや。gccでも(>967の修正が済んだ状態で)通る。
VCもgccも、メンバ関数内ではネストされたクラスはすでに完全な型になっているようだった。
しかし規格(FDIS)中にOK/NGを明確に決定するような記述は見つからなかった。

ただ、 9.2.2 に
"the class is regarded as complete within function bodies"
とような記述は有る。
一応関係はしていると思うけど、これで
ネストされたクラスについても同様とは言えないはず。

976 :972:2005/04/13(水) 01:48:12
>973
うっひょー!買い即決ですっ!今春遅くですね.
http://www.amazon.co.jp/exec/obidos/ASIN/0321334876/

>974
あぁ,そうか.特殊化できるのを忘れてました.
ちなみに,関数テンプレートのテンプレート引数にはデフォルト指定できないですよ.

977 :デフォルトの名無しさん:2005/04/13(水) 05:07:19
Effective C++の第3版が日本語化されるのはいつ頃だろか?

978 :962:2005/04/13(水) 10:29:02
>>972
鼻から悪魔が出るコードでいいってことですね。ありがとう。

979 :デフォルトの名無しさん:2005/04/13(水) 11:48:31
>>977
ゴシップ雑誌と大して変わらない価値しかない。

980 :デフォルトの名無しさん:2005/04/13(水) 20:52:55
>>979
そんなことは聞いていない

981 :デフォルトの名無しさん:2005/04/13(水) 20:54:18
>>980
聞かれなくても意見は言う。

982 :デフォルトの名無しさん:2005/04/13(水) 22:11:02
>>981
お前のレスはゴシップ雑誌と大して変わらない価値しかない。

983 :デフォルトの名無しさん:2005/04/13(水) 22:14:01
>>982
ほう、俺の意見はそんなに価値があるのか。

984 :デフォルトの名無しさん:2005/04/13(水) 22:17:11
>>983
お前、常時このスレ監視してんのか!?

985 :デフォルトの名無しさん:2005/04/13(水) 22:22:39
>>984
仕事中でもレスが付けばすぐに分かる。


986 :デフォルトの名無しさん:2005/04/13(水) 23:03:16
>>985
お前まだ仕事してんのか!?2chなんか見てる暇あるんなら、さっさと仕事片付けろよ!

987 :デフォルトの名無しさん:2005/04/13(水) 23:52:41
元の話題でやり込められたから仕事に論点をずらしたんですね ;-)

988 :デフォルトの名無しさん:2005/04/14(木) 00:37:40
元の話題って何だろ。

というか、コレでやり込めたつもりだったんだ。
はは、すげー脳内回路してんな。

989 :デフォルトの名無しさん:2005/04/14(木) 00:43:58
>>988
元の話題は>>977だろ。

というか、コレでやり込めたつもりだったんだ。
はは、すげー脳内回路してんな。

990 :デフォルトの名無しさん:2005/04/14(木) 00:58:14
うぜぇよおまえら

991 :デフォルトの名無しさん:2005/04/14(木) 01:01:44
>>989
>>977の話題で、やり込めたと思えるお前は一体なんだ。

そして、俺は「やり込めた」とか言ってないからさ。
頭悪い鸚鵡返しはダメでしょ。お前の脳内回路はやっぱアレやね。

992 :デフォルトの名無しさん:2005/04/14(木) 01:03:42
ソロソロ次スレ立てないと

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

前スレ C++相談室 part39
http://pc8.2ch.net/test/read.cgi/tech/1106527792/

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

994 :デフォルトの名無しさん:2005/04/14(木) 01:06:36
STLつかうと一気に実行ファイルサイズが10倍に?!

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

996 :デフォルトの名無しさん:2005/04/14(木) 01:08:47
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。

997 :デフォルトの名無しさん:2005/04/14(木) 01:09:42
997

998 :デフォルトの名無しさん:2005/04/14(木) 01:11:06
ここはSTLも含むようにするんだっけか

C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
テンプレートライブラリ(STL含む)に関する質問もこのスレにお願いします
IDE(VC++など)などの使い方の質問もその開発環境のスレに
お願いします。

前スレ C++相談室 part39
http://pc8.2ch.net/test/read.cgi/tech/1106527792/

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

999 :デフォルトの名無しさん:2005/04/14(木) 01:11:22
とりあえず次スレ立ててくる

1000 :デフォルトの名無しさん:2005/04/14(木) 01:11:44
999

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

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

read.cgi ver 05.04.02 2018/11/22 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)