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


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

C++相談室 part10
1 名前:デフォルトの名無しさん :02/08/14 18:01
文法が汚くてもいいから、懐の広い言語を望むあなた。そんな
あなたにぴったりの言語、C++。
(´∀`).。o(関連URLは>>2-5の辺り)

2 名前:森の妖精 :02/08/14 18:01
v(^・^)v < 2!!

3 名前:デフォルトの名無しさん :02/08/14 18:02
C++ Final Draft International Standard
http://www.kuzbass.ru/docs/isocpp/

Boost
http://www.boost.org/
STLport
http://www.stlport.org/
Loki
http://www.moderncppdesign.com/

4 名前:デフォルトの名無しさん :02/08/14 18:02
過去ログ
Part1
http://piza.2ch.net/tech/kako/980/980175292.html
Part2
http://pc.2ch.net/tech/kako/996/996640937.html
Part3
http://pc.2ch.net/tech/kako/1003/10038/1003832761.html
Part4
http://pc.2ch.net/tech/kako/1009/10090/1009071535.html
Part5
http://pc.2ch.net/tech/kako/1014/10142/1014217496.html
Part6
http://pc.2ch.net/tech/kako/1018/10184/1018454705.html
Part7
http://pc.2ch.net/test/read.cgi/tech/1021787032/
Part8
http://pc3.2ch.net/test/read.cgi/tech/1025010364/
Part9
http://pc3.2ch.net/test/read.cgi/tech/1027347982/

5 名前:デフォルトの名無しさん :02/08/14 18:04
ISO/IEC 14882 International Standard
http://www.kuzbass.ru/docs/ansi_iso_iec_14882_1998.pdf

■関連スレ■

VisualC++相談室 3
http://piza2.2ch.net/tech/kako/993/993186053.html
VisualC++相談室 4
http://pc.2ch.net/tech/kako/1002/10021/1002165477.html
VisualC++相談室 5
http://pc.2ch.net/tech/kako/1006/10068/1006834463.html
VisualC++相談室 6
http://pc.2ch.net/tech/kako/1011/10116/1011615035.html
VisualC++相談室 【7】
http://pc.2ch.net/tech/kako/1017/10178/1017843192.html
VisualC相談室 【8】
http://pc.2ch.net/test/read.cgi/tech/1022499000/

C++Builder相談室
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=969458279
新C++Builder相談室(C++Builder相談室 Part2)
http://pc.2ch.net/test/read.cgi/tech/997074601/
C Builder相談室 Part3
http://pc3.2ch.net/test/read.cgi/tech/1016065855/

6 名前:デフォルトの名無しさん :02/08/14 18:07
>>1
お疲れ様です

7 名前:デフォルトの名無しさん :02/08/14 18:08
>>5のpdfって書いていいの?

8 名前:デフォルトの名無しさん :02/08/14 18:09
Loki for VC7(LokiPort)
http://www.geocities.com/rani_sharoni/LokiPort.html

9 名前:デフォルトの名無しさん :02/08/14 19:07
すみません。アクセス制御でわからなくなりました。
クラスBとクラスCで、using宣言を行っていますが、これは一見protected属性
の関数print()をpublicなアクセス属性に変換しているように見えるのですが、
そのように考えてよいのでしょうか。

#include <iostream>
using namespace std;

class A {
int i;
protected:
void print() const { cout << i << endl; }
public:
A() { i = 111; }
};

class B : protected A {
public:
using A::print; // void print() const { A::print(); }
};

class C : protected B {
public:
using B::print; // void print() const { A::print(); }
};

int main()
{
B b;
C c;

b.print();
c.print();
}

10 名前:デフォルトの名無しさん :02/08/14 21:15
アクセス属性の変化って許されたっけ?

11 名前:デフォルトの名無しさん :02/08/14 22:23
>>9
変換という言葉は適当ではないかな。

関数などのデフォルト引数のように、継承先で何もされて無いんだったら、
継承元のアクセス制御が適用されるだけという話だと思う。

説明が下手でスマソ。

12 名前:デフォルトの名無しさん :02/08/14 23:00
>>10>>11
レスありがとうございます。

privateやprotected継承を行っても、using宣言によりメンバをpublic
なスコープに引き出すことにより、継承の本来の意味を変えられる
だけでなく、元々のアクセス属性まで変化させられるので、注意して
使う必要がありそうですね。

13 名前:デフォルトの名無しさん :02/08/14 23:03
>>12
もともと基底でpublicやprotectedなのだから
特に注意はいらないと思うのだが…

14 名前:デフォルトの名無しさん :02/08/14 23:36
>>13
そういう風に考える手もありますね。要するにより細かくアクセス制御
したい時に使うと。

15 名前:デフォルトの名無しさん :02/08/15 11:07
http://www.utilitycode.com/str/default.aspx

この文字列クラスを使ってる人がいましたら、使い勝手などを
教えてくださいー。

16 名前:デフォルトの名無しさん :02/08/15 11:08
>>15
使ったらええやんけ。

17 名前:デフォルトの名無しさん :02/08/15 14:13
operator=ってclass外じゃ定義できないの?

18 名前:デフォルトの名無しさん :02/08/15 14:19
class外とは?

19 名前:デフォルトの名無しさん :02/08/15 14:20
できなかったのか?

20 名前:デフォルトの名無しさん :02/08/15 14:27
'operator =' は <Unknown> のメンバでなければなりません。
ってエラーがでる。

21 名前:デフォルトの名無しさん :02/08/15 14:28
そりゃあたりまえだ...

22 名前:デフォルトの名無しさん :02/08/15 14:32
そうか、できないのか・・・
ちなみにこんなの
class AAA{};
AAA operator=(AAA a){return a;}
/**************************************************************/
void main(void)
{
}

23 名前:デフォルトの名無しさん :02/08/15 14:34
> ほとんどの C++ 演算子はクラスのメンバー関数にも,
> 通常のクラスのメンバーではない関数にもなりますが,
> 以下の演算子は必ずクラスのメンバーでなければなりません。
>
> = 演算子
> -> 演算子
> ( ) 演算子
> 型変換

だと。

24 名前:デフォルトの名無しさん :02/08/15 14:37
>>23
さんくすデス。出直してきます

25 名前:デフォルトの名無しさん :02/08/15 14:49
>>22
定義と宣言を分けたいって話なら、そりゃ可能だが。

26 名前:モナ吉 :02/08/15 15:48
(;・∀・)ノ スレさん乙変えr〜

27 名前:デフォルトの名無しさん :02/08/15 18:14
>>22
どうでもいいが、例が面白すぎる。

28 名前:デフォルトの名無しさん :02/08/15 23:13
静的オブジェクトと動的オブジェクトの使い分けってどうされてます?

29 名前:デフォルトの名無しさん :02/08/15 23:14
>>28
静的オブジェクトと動的オブジェクトを混同できるの?

30 名前:デフォルトの名無しさん :02/08/16 00:26
CHoge hoge;と

CHoga hoga=new CHoga("hogehoge");

の違いの事なのですが。

31 名前:デフォルトの名無しさん :02/08/16 00:29
そら、 Hoga と Hoge は違おうもん


32 名前:デフォルトの名無しさん :02/08/16 00:35
どういう実装をしているのかわからないけど
CHoga hoga=new CHoga("hogehoge");
じゃなくて
CHoga* hoga=new CHoga("hogehoge");
じゃないの。



33 名前:デフォルトの名無しさん :02/08/16 00:41
あ、すまいせんそうです。ついjava的な書き方になりますた。

34 名前:デフォルトの名無しさん :02/08/16 00:43
>>33
そうそう、最近全然C++のコードを書かないでJavaの本ばっか
読みまくってたら、オブジェクト生成の書き方がわからなくなってて
焦ったよ^^;


35 名前:デフォルトの名無しさん :02/08/16 04:05
>>30
前者を「静的オブジェクト」とは呼ばんと思うが。

多態前提の OO 設計で出てきたオブジェクトは必然的に後者。値指向の
オブジェクト(複素数やら何やら)だけ例外的に前者。

36 名前:デフォルトの名無しさん :02/08/16 04:09
失礼、質問の仕方が悪かったです。Javaでは静的オブジェクトはなく、全て
newしますがC++の場合は静的、動的両方生成される。この場合動的オブジェクトは
どんな場合に利用されるのでしょうか?例えばオブジェクトをリストに連結して
実行時に変化があるような場合にのみ利用されるのですか?それとも全てのクラス
のインスタンスはnewするのですか?
動的なオブジェクトと静的なオブジェクトのクラスの設計の違いはどのような
特徴なのでしょうか?特に区別はしないのでしょうか?

37 名前:デフォルトの名無しさん :02/08/16 05:15
>>36
だからその意味不明な動的/静的って言葉使うのやめれ。

「Class class;」という形で確保されるオブジェクトには2通りありうる。
1.グローバル、スタティック変数、クラスの静的メンバ。
この場合、オブジェクトの実体は静的なメモリ領域に確保される。

これは普通やらない。理由はコンストラクタ/デストラクタのタイミング。

2.関数内でスタック上に確保される場合。
この場合、「Class class;」とかかれた場所に処理が到達した時点でコンストラクタが実行され、
そこを含むスコープを処理が抜ける瞬間にデストラクタが実行される。

スマートポインタの類は必然的にこの形式で使用される(newで確保すると意味がない)し、
同期オブジェクトなんかのラッパクラスもこういった形で使うものがある。
こういったクラスはスコープを抜ける瞬間に確実に破棄されるという性質を利用してるわけだ。

余りでかいオブジェクトをスタック上に確保しようとするとスタックが足りなくなるのと、
スコープの終わりで破棄される以上一時的なオブジェクトしか作れない点に留意すれば
あとは好きにやればいいと思うが。

38 名前:デフォルトの名無しさん :02/08/16 05:15
設計上の問題は基本的に35以上のことはないと思うのだが、
確かに参照を使えば自動変数でも多態できないこともないが…

39 名前:デフォルトの名無しさん :02/08/16 11:10

VS.netのC++でDLLとMFCでのGUI開発を行っています。
1.2MBほどの2つ項目があるタブ区切りテキスト

yoshida<TAB>吉田<TAB> 12
yoshimura<TAB>吉村<TAB> 20
.
.

をクラス
class WordFromDic{
string Roma;
vector<string> Kana;
vector<int> Freq;
};
に読み込む処理を行っています

読み込む関数は以下のとおりです


MYDLL_API void ReadWordDictionary(char *dic){
::ifstream WordDic(dic);
char buf[256];
while(WordDic.getline(buf,sizeof(buf))){
char *p1 = strtok(buf,"\t");
char *p2 = strtok(NULL,"\t");
char *p3 = strtok(NULL,"\t");
if (!HashDic[p1]){
WordFromDic *temp = new WordFromDic(p1,p2,p3);
HashDic[p1] = temp;
}
else {
HashDic[p1]->AddWord(p1,p2,p3);
}
}
}

ところがこれが偉く時間がかかってしまうのです。だいたい軌道までに30秒くらいを要する感じです
clock()でこの処理の時間をはかってみたところ95600という数値が出ました。
これをもっと早くする方法はないでしょうか?
MFCでSTLを使うのはあまりよくないのかなーとも思ったのですが。

さらにメモリの開放時にもやたら時間がかかってしまいます(10秒くらい)

MYDLL_API void DeleteWordDictionary(){
for(map<string, class WordFromDic*,less<string> >::iterator i=HashDic.begin();
i!=HashDic.end();i++)
{
delete i->second;
}
}

この問題についてどなたかアドバイスをいただければと思います

40 名前:デフォルトの名無しさん :02/08/16 11:28
>MFCでSTLを使うのはあまりよくないのかな

iostreamは使ってあるが、どこにSTL使ってあるよ?

41 名前:39 :02/08/16 12:56
>40
ええとstringクラスとvectorクラスを使ってます
string Roma;
vector<string> Kana;
vector<int> Freq;

42 名前:39じゃない人 :02/08/16 13:03
>>40
vectorやらmapやら使ってるでしょ??

43 名前:デフォルトの名無しさん :02/08/16 13:16
>>39
まずはプロファイルを採って、どこで時間を食ってるのか調べてみれば?

44 名前:デフォルトの名無しさん :02/08/16 16:15
初歩的な質問で申し訳ないですが、
intの配列型の返り値を持たせるには、
関数はどのような型にすればいいでしょうか。

45 名前:デフォルトの名無しさん :02/08/16 16:23
>>44
void func(std::vector<int>&);

返値を使わずに、引数に参照を渡して、そこに書き込む。

46 名前:コギャルとHな出会い :02/08/16 16:23
http://kado7.ug.to/net/


朝までから騒ぎ!!
   小中高生
 コギャル〜熟女まで
   メル友
  i/j/PC/対応

女性の子もたくさん来てね
  小中高生大歓迎です                 
全国デ−トスポット情報も有ります。
全国エステ&ネイル情報あります。

  激安携帯情報あります。

47 名前:デフォルトの名無しさん :02/08/16 16:24
int* func() はだめ?

48 名前:デフォルトの名無しさん :02/08/16 16:25
void func(int & n, int * p)

49 名前:47 :02/08/16 16:26
ローカルな配列だとだめですけど。

50 名前:デフォルトの名無しさん :02/08/16 16:26
void func(int & n, int ** p)

51 名前:デフォルトの名無しさん :02/08/16 16:36
std::vector<int> って戻り値にできなかったっけ?

52 名前:デフォルトの名無しさん :02/08/16 16:39
>>51
できるけど、コピー処理が重いから避けたいところだ。

53 名前:デフォルトの名無しさん :02/08/16 16:56
あるクラスの派生クラスを作ったとします。
こんな関数を追加します。

xxx& operator << ( xxx )
{
   // 引数に何かの処理を加える

   // ここで基本クラスの他のストリーム演算子を呼び出すにはどうすればいいでしょうか?
}

this << xxxx
こんな風にすればいいと思ったんですが無理でした。

54 名前:デフォルトの名無しさん :02/08/16 16:57
基本クラス::operator<<(xxxx)
はどうか

55 名前:デフォルトの名無しさん :02/08/16 17:05
だれか GetPrivateProfileString 教えて頂けませんか?

56 名前:デフォルトの名無しさん :02/08/16 17:06
>>55
多分スレ違い

57 名前:デフォルトの名無しさん :02/08/16 17:08
>>54
ありがとうございます。コンパイル通りました。

58 名前:デフォルトの名無しさん :02/08/16 17:09
>>51
vectorのコピーコンストラクタが例外を投げたら、処理自体が
成功してるのに返り値が失われるから、auto_ptrかboost::shared_ptr
に入れてから返すのが正解。

59 名前:デフォルトの名無しさん :02/08/16 19:03
http://pc3.2ch.net/test/read.cgi/tech/1029349925/78

すみません、この書き込みの意味が分からないんですが、
修行不足でしょうか?

60 名前:デフォルトの名無しさん :02/08/16 19:12
copy-on-writeですか?

61 名前:デフォルトの名無しさん :02/08/16 19:39
vector::vector(....) と vector::vector(....) throw()
の両方定義することができて、return のときはコピー先
オブジェクトの vector::vector() throw() が自動的に
呼び出されて欲しいっていうことなのかな。

62 名前:39 :02/08/16 19:59
>43
すみませんプロファイルとはどういう概念のものなのでしょうか?
ひととおり調べたらVC6.0でプロファイルを取得する方法が出ておりましたが
.NETの場合は良くわかりませんでした。

63 名前:デフォルトの名無しさん :02/08/16 20:06
>>62
> すみませんプロファイルとはどういう概念のものなのでしょうか?
実際にプログラムを走らせて、関数や行単位で、実行時間・メモリ消費量などを
計測する。

問題の箇所を特定して、それから原因を潰そうってアプローチを採る場合に
有効な道具。

64 名前:デフォルトの名無しさん :02/08/16 23:34
ごめん、出遅れた・・・・(TT)

65 名前:59を書いた本人 :02/08/17 12:42
>>61
いや、単に例外を投げないだけじゃなく、あたかもコピー元のデストラクタ
が呼ばれたかのように振舞う、ということ。auto_ptrと同じ発想。
実体をコピーするのはオブジェクト本体だけで、オブジェクトが参照して
いるポインタの向こうは、丸ごとコピーしないで、ポインタだけコピーする。
そうすれば、自然にthrow()にできるし、逆にコピー元は無効になってしまう
から、throw()でないと困る。

66 名前:デフォルトの名無しさん :02/08/17 15:49
vector(vector &src, move_t) throw()
: _M_start(src._M_start), _M_finish(src._M_finish),
_M_end_of_strage(src._M_end_of_strage) {}

で、これがコピーコンストラクタ部分でしょうか
厨な質問で悪いんですが…

67 名前:デフォルトの名無しさん :02/08/17 16:14
>>66
そのつもり。変数名はSGI STLのマネ。

68 名前:デフォルトの名無しさん :02/08/17 16:46
>>65
全てのクラスにmemcpy相当のコピーとゼロクリアを行う
フレンド関数を作っておけば良いんじゃない?
んで、stlの代わりも自分で書く。

つーかそうゆうの遊びで書いてみたことあるけど
確かにstlより相当はやくなるよ。


69 名前:デフォルトの名無しさん :02/08/17 17:36
今のstringやコンテナの実装って大抵
copy-on-writeになっているだろ。
実体のコピーは使ってないよ。

70 名前:デフォルトの名無しさん :02/08/17 21:17
>>69
string は copy-on-write が多いが vector で copy-on-write は珍しい気が。
っつか、あるのか?

71 名前:デフォルトの名無しさん :02/08/18 02:49
Javaで言うClassクラスみたいなのってC++では無いのでしょうか…
検索エンジンでは探せませんでした。

72 名前:デフォルトの名無しさん :02/08/18 02:51
ない

73 名前:デフォルトの名無しさん :02/08/18 03:16
ぐは
やっぱり無理ですか…
どうもありがとうございます。

74 名前:名無しさん@Emacs :02/08/18 14:21
>>73
何に必要なのか分からんが、typeid()じゃダメかい?

#include <iostream>

// for typeid()
#include <typeinfo>

using namespace std;

int main(int argc, char **argv) {
Hoge tmp;

cout << typeid(tmp).name() << endl;

return 0; // EXIT_SUCCESS
}

ってやると、Hogeって表示されると思う。型名知るだけならこれで可能。

75 名前:デフォルトの名無しさん :02/08/18 14:37
名前を知るくらいしかできないけどな

76 名前:名無しさん@Emacs :02/08/18 14:40
・゜・(ノД`)・゜・ウワアァアァアァァァン

77 名前:デフォルトの名無しさん :02/08/18 14:41
リフレクション的な物は求めるべきではないだろう・・・。

78 名前:Hikky! :02/08/19 00:21
for_each(-_-);

79 名前:デフォルトの名無しさん :02/08/19 00:56
そのうち大学でもC++で宿題が出るようになるんだろうな。
それまで力がついているかな(((( ;゚Д゚))))ガクガクブルブル

80 名前:デフォルトの名無しさん :02/08/19 01:02
海外じゃ当たり前っぽいけど。

81 名前:デフォルトの名無しさん :02/08/19 01:03
>>79
うちjava〜。継承とかろくに教えず終了。いいのかそれで。。。

82 名前:デフォルトの名無しさん :02/08/19 01:26
教養課程だったらそんなもんでしょ

83 名前:デフォルトの名無しさん :02/08/19 01:32
>>82
専門です。情報科学部です。本当に良いのかそれで・・・。

84 名前:デフォルトの名無しさん :02/08/19 01:42
>>83
javaなんかどうせ使うかわかりゃしないんだからやっても無駄。
必要になってからでも全然遅くないよ。つーかもっと理論を勉強なされ。

85 名前:デフォルトの名無しさん :02/08/19 08:54
SDKとMFCどちらを勉強すればいいの?

86 名前:デフォルトの名無しさん :02/08/19 09:01
その中からどちらか一方に絞りたいなら、SDKのほうだな。
最近は、もっといい選択肢があるだろうに・・・。

87 名前:デフォルトの名無しさん :02/08/19 09:04
>>86
なんですか?

88 名前:86 :02/08/19 09:23
>>85
お前の要求も知らずに答えたところで、「じつはそうじゃなくて」とか言われるくらいだ。
何がしたいのか、要求を明らかにしつつ、こちらへどうぞ↓
http://pc3.2ch.net/test/read.cgi/tech/1029377510/l50

89 名前:デフォルトの名無しさん :02/08/19 21:53
C++使いの先輩にお聞きします。

Q1 C++の悪いところって何ですか?
Q2 C++の弱点って何ですか?
Q3 それでもC++は最強ですか?その理由は?

90 名前:デフォルトの名無しさん :02/08/19 22:02
>>89
Q1 度重なる改造手術で非常に不細工な言語仕様に
Q2 クラス多用するとサイズ増加、実行速度低下などを招く。まぁ、ほかのOOPLにも言えること。
Q3 デファクトスタンダード恐るべし。


91 名前:デフォルトの名無しさん :02/08/19 22:19
>>90
クラス多用って一体……

非仮想関数であれば呼び出しは一般の (C 言語の) 関数と同等のペナルティだし、
仮想継承を使わなければメンバ変数へのアクセスも構造体に触るのと変わらん
よな。

92 名前:デフォルトの名無しさん :02/08/19 22:31
>>91
いいよ, 自分で試した事ない奴はほっとけ. 非難するだけなら誰でもできる.

93 名前:デフォルトの名無しさん :02/08/19 23:18
すみません、超初歩の質問だと思うのですが
あるファイルの関数外でグローバルに宣言されているクラスを
別のファイルでも使えるようにするにはどうすれば良いでしょうか?


変数の場合、グローバル変数を別のファイルでexternと宣言すれば
できると思うのですが、クラスの場合はどうすればよいのかわかりません。
良かったら教えてください。

94 名前:デフォルトの名無しさん :02/08/19 23:35
>>93
クラスの宣言を Classname.h に、実装をClassname.cpp に書いて、
そのクラスを利用するファイルでは Classname.h を#includeする
っていうのが一般的だと思うが。

要は、クラス宣言が書かれていればよい。

宣言っていうのは
class Classname
{
public:
Classname();
...
};

って奴のことね。
.

95 名前:93 :02/08/19 23:43
すみません、どうも聞き方が悪かったようです。

言いたかったのは、あるファイルの中で使われているクラスの実体?を
そのまま別のクラスで使う方法は無いかって言うことなんです。
ファイル間グローバル変数のように、あるファイルの中で変更された
メンバ変数を別のファイルで参照できないかと思いまして。

96 名前:デフォルトの名無しさん :02/08/19 23:53
C++使いの先輩にお聞きします。

Q1 C++の悪いところって何ですか?
文法に不自然な点が多い。
delegate がない。

Q2 C++の弱点って何ですか?
コンパイルに時間が掛かる。
クラス定義が変わると、
全てのモデュールを再コンパイルする必要がある場合がある。

Q3 それでもC++は最強ですか?その理由は?
プログラムの動作を厳密に制御できる。
実行時のオーバーヘッドが殆ど無い。



97 名前:デフォルトの名無しさん :02/08/20 00:00
>>95
んーっと。

>そのまま別のクラスで使う方法は
>別のファイルで

別の(クラス|ファイル)どっち?


98 名前:96 :02/08/20 00:02
>>93
ああ、読み直してみるとなんとなくわかったかも。
グローバルなオブジェクトを使いたいってことですか?
それだったら普通の変数と同じく、どこか1カ所で変数宣言しといて
他のモジュールからは extern すればよい。

ただし、グローバルなオブジェクトはコンストラクタがいつ実行されるか
不透明なのであまりお薦めできない。


99 名前:デフォルトの名無しさん :02/08/20 00:03
>>98
名前欄は96→97の間違い。スマソ。


100 名前:デフォルトの名無しさん :02/08/20 00:05
>>95
それオブジェクト指向(のカプセル化)の概念、完全に無視してるような…
とりあえず構造体にすれば…?

101 名前:93 :02/08/20 00:15
えっと、externで宣言しても
「そのオブジェクトは既に定義されています見たいなエラーが出て、
変数とは違うのかなって思ったんですが
リビルドしたらできました(汗
>>97さん本当にありがとうございました。

102 名前:デフォルトの名無しさん :02/08/20 01:08
>>100
そうか?

103 名前:デフォルトの名無しさん :02/08/20 01:13
こ の ス レ は C + + を 分 か っ た つ も り の >>102 を 励 ま す ス レ に な り ま す た

104 名前:デフォルトの名無しさん :02/08/20 05:12
はぁ〜。
そりゃあよかったねぇ。>>102

105 名前:デフォルトの名無しさん :02/08/20 07:31
あと使ったこと無いけどfriendとかもあるな
goto並みにタブーなイメージだけど

106 名前:デフォルトの名無しさん :02/08/20 10:06
まあ、goto程度にはタブーかも知れない。良くも悪くも。

107 名前:デフォルトの名無しさん :02/08/20 15:46
標準ライブラリのendlとかhexみたいなものを自分で作るにはどうすればいいですか?
詳しく説明してるサイトとかないですか?探したんですけど見つからなくて・・・

108 名前:デフォルトの名無しさん :02/08/20 15:52
>>107
単なる定数じゃないの、あれ?

と思ったら違ったわ。
VC7のファイルを検索

grep endl *.*

ostream.h:inline _CRTIMP ostream& __cdecl endl(ostream& _outs) { return _outs << '\n' << flush; }


109 名前:デフォルトの名無しさん :02/08/20 16:04
>>108
うーん・・・なんかうまくいかないです。
もしかして、endlとかって何かのクラスのメンバ関数じゃないんですか?

110 名前:デフォルトの名無しさん :02/08/20 16:06
>>108
本当に改行してるだけだったか・・・。

111 名前:デフォルトの名無しさん :02/08/20 16:09
エラーが出てコンパイルできませんでした。

112 名前:デフォルトの名無しさん :02/08/20 16:12
未確認だけど
ostream& ostream::operator<<(ostream& (*pfn)(ostream&))
 { (*pfn)(*this); return *this; }
こんな感じのメンバがあるんじゃないのかな。

113 名前:デフォルトの名無しさん :02/08/20 16:15
ありました。
ありがとうございます。今からやってみます。

114 名前:booooooooooooooooooooooooost :02/08/20 16:17
漏れは標準ライブラリ関係はここ見てるよ。
http://www-scc.tokyo.jst.go.jp/riyou/users/users_guide/ucoma/FJcompiler/C++/stdlib/stdref/classref.htm
既出かも知れないけど。

115 名前:デフォルトの名無しさん :02/08/20 17:41
>110
<<flushの方は?

116 名前:デフォルトの名無しさん :02/08/20 20:20
>>115
バッファに貯めとかないですぐに書き出せってことでしょ。


117 名前:デフォルトの名無しさん :02/08/20 20:37
115は、「改行してるだけ」ではない、と言いたいのでは?

118 名前:デフォルトの名無しさん :02/08/20 20:43
>>117
なるほど。勘違いスマソ。


119 名前:デフォルトの名無しさん :02/08/20 23:34
>>115はflashの定義はどうなってんの?ってことでは?

120 名前:デフォルトの名無しさん :02/08/21 00:05
おい喪前ら人に聞く前に自分でgrepしる!
と思ったがそういうこと書いてる間に自分でgrep。

…ostream.h中にはなかったのでランタイムライブラリのソースコードを
引っ張り出してみた。VC7でつ。

ostream& ostream::flush()
{
lock();
lockbuf();
if (bp->sync()==EOF)
state |= ios::failbit;
unlockbuf();
unlock();
return(*this);
}


121 名前:デフォルトの名無しさん :02/08/21 00:18
>>108
Σ(´Д`;)
grepって正規表現でファイル指定できたのか・・・・
知らなかった師のう(-_-)

122 名前:デフォルトの名無しさん :02/08/21 00:29
正規表現じゃないが

123 名前:デフォルトの名無しさん :02/08/21 00:33
>>121
grep : global REGULAR EXPRESSION print

使えなきゃおかしいんだけどね。
でも、正規表現対応grepはegrepだったり。
謎。

124 名前:デフォルトの名無しさん :02/08/21 00:37
>>120
今手元にC++環境無かったんだ。ごめんよ!

125 名前:デフォルトの名無しさん :02/08/21 00:39
>>123
egrep は拡張正規表現対応ってことで。

126 名前:デフォルトの名無しさん :02/08/21 00:41
Borland BCC55

basic_ostream<charT, traits>::flush() {
if(this->rdbuf()) {
#ifdef _RWSTD_MULTI_THREAD
_RWSTDGuard guard(this->rdbuf()->buffer_mutex_);
#endif
if(this->rdbuf()->pubsync() == -1)
this->setstate(ios_base::badbit);
}
return *this;
}

127 名前:デフォルトの名無しさん :02/08/21 00:46
調べてみた。
FreeBSD4.4,gcc2.95.3

ostream& ostream::flush()
{
if (_strbuf->sync())
set(ios::badbit);
return *this;
}

128 名前:デフォルトの名無しさん :02/08/21 00:52
>>127
一番簡単で(・∀・)イイ!! (w

129 名前:デフォルトの名無しさん :02/08/21 00:52
えぴすてーめーのチンコは大きいのですか?

130 名前:デフォルトの名無しさん :02/08/21 00:55
>>129
あの人の名前が出てくるあたりがC++スレだな(w


131 名前:デフォルトの名無しさん :02/08/21 01:28
>>127
簡単すぎて逆に不安になる(w

132 名前:デフォルトの名無しさん :02/08/21 02:15
>>131
うむ。BCCのが複雑になってるのはマルチスレッド時の排他制御を考慮
してるからだしな。それにしてもBCCのは見にくいが。


133 名前:デフォルトの名無しさん :02/08/21 08:59
>>131
syncの中は排他制御でマクロだらけという罠

134 名前:デフォルトの名無しさん :02/08/21 09:31
template で固定化された "" と L"" を使い分ける実験をしてるのですが、
下の使い方はあってますでしょうか?

#include<string>

template <typename T> void aa(const T *a)
{
std::basic_string<T> s = a;
}

class Data
{
char *m_ts;
wchar_t *m_tsw;
public:
Data(){}
Data(char* c,wchar_t* w)
{
m_ts = c;
m_tsw= w;
}
~Data(){}
inline operator char* () const
{
return m_ts;
}
inline operator wchar_t* () const
{
return m_tsw;
}
};

int main()
{
Data data("1234567890",L"1234567890");

aa<wchar_t>((wchar_t*)data);
aa<char>((char*)data);
}

135 名前:デフォルトの名無しさん :02/08/21 09:52
なにか問題があるのか?

136 名前:デフォルトの名無しさん :02/08/21 10:04
>>134

aa<wchar_t>(data);
aa<char>(data);

の方が好ましいかと。

137 名前:134 :02/08/21 10:07
{
Data data("1234567890",L"1234567890");
aa<wchar_t>((wchar_t*)data);
aa<char>((char*)data);
}
同じブロックスコープ内で
上記の文字列"1234567890"のポインタを参照した場合、
その実体がまだ存在していることは保証されているのでしょうか?


138 名前:デフォルトの名無しさん :02/08/21 10:12
はい?

139 名前:補足 :02/08/21 10:16
{
char ts[] = "1234567890";
wchar_t tsw[] = L"1234567890";
Data data(ts,tsw);
aa<wchar_t>(data);
aa<char>(data);
}
137のようでなく、このように書くべきなのでしょうか。

140 名前:デフォルトの名無しさん :02/08/21 10:38
>>139
貴様、もしかしてそれは、要するに、
const char* aa() { return "1234567890"; }
const char* bb() { char ts[] = "1234567890"; return ts; }
での戻り値は有効か、とかいう話ではないですか?
template も C++ も関係ないような・・・。

文字配列のインスタンスはスコープで死ぬが、文字列リテラルはstatic。
↑の bb がダメで aa は大丈夫。

141 名前:134 :02/08/21 11:17
>>135-140
ありがとうございました。
勉強して出直してきます。


142 名前:デフォルトの名無しさん :02/08/22 01:41
Borland C++ Compiler で Windows プログラミングを
はじめたいのですが、解説してあるサイトがなかなか見つかりません。
よいサイトがありましたら教えてください。

143 名前:デフォルトの名無しさん :02/08/22 03:30
>>142
無いので教えられません。

144 名前:デフォルトの名無しさん :02/08/22 03:47
>>142
猫でもわかるプログラミング

145 名前:デフォルトの名無しさん :02/08/22 08:01
>>142
つぅか本買え。

146 名前:デフォルトの名無しさん :02/08/22 08:46
>>142
Ruby

147 名前:デフォルトの名無しさん :02/08/22 11:01
>>144
猫でも分かるは VC++ を使っているようなのですが
もしかしたらコンパイルできるのかもしれないと思って

bcc32 -tW sample01.cpp

としたのですが

Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
win1.cpp:
エラー E2034 win1.cpp 22: 'void *' 型は 'HBRUSH__ *' 型に変換できない(関数 __stdcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int) )
警告 W8057 win1.cpp 46: パラメータ 'lpszCmdLine' は一度も使用されない(関数 __stdcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int) )
*** 1 errors in Compile ***

というエラーがでてコンパイルできませんでした。
22 行目をコメントアウトしたらコンパイル実行できましたけど、これから学習するに当たって
これは無視していい程度のことなんですか。
OS が Win98SE だからこんなエラーが出るんでしょうか。( 2000とかだと出ない?)

148 名前:デフォルトの名無しさん :02/08/22 11:02
>>147
もうちょっと低いレベルで学習すべきではないかと。

149 名前:デフォルトの名無しさん :02/08/22 11:23
>>147
(HBRUSH) GetStockObject(〜);
もしくは
reinterpret_cast<HBRUSH>(GetStockObject(〜));


150 名前:デフォルトの名無しさん :02/08/22 11:28
または、sample01.cでコンパイル

151 名前:デフォルトの名無しさん :02/08/22 12:21
すいません。CかC++かVCのクラスの解説があるページで一見すると
ttp://java.sun.com/products/jdk/1.2/ja/docs/ja/api/index.html
によく似たページのアドレスを忘れてしまったので、知っている方いましたら教えてください。
Microsoftかどっか(個人のページではなく)だったと思うのですが、探したけれど見つからないので・・・。

152 名前:デフォルトの名無しさん :02/08/22 12:25
>>151



153 名前:デフォルトの名無しさん :02/08/22 12:33
>>149
キャストすればよかったんですね。
というわけで「猫でも分かる」でも勉強できそうなので、
ここでしばらく頑張ってみようと思います。ありがとうございました。

154 名前:151 :02/08/22 12:41
わかりにくかったですかね(- -;
それっぽいところを発見したのですが、なぜか表示がバグっててみれません・・・
サイトがハッキングされたのか、それとも自分のIEの設定が悪いのか・・・
ttp://www.microsoft.com/japan/msdn/library/

155 名前:デフォルトの名無しさん :02/08/22 12:41
>>154
>サイトがハッキングされたのか

これ以上しゃべんなよ。頼むから。

156 名前:151 :02/08/22 12:53
いやでも実際バグってるんですが。

157 名前:デフォルトの名無しさん :02/08/22 12:55
>実際バグってるんですが。

/・ 。・\ <まぁ、いいんだけどね。)


158 名前:デフォルトの名無しさん :02/08/22 16:04
>>156
Mozillaだとだめぽ。IEでもダメなの?

つーかMozilla使ってそうには思えないがナー(w


159 名前:デフォルトの名無しさん :02/08/22 16:04
>>149
なぜreinterpret?
static_castじゃいけない理由を教えてください^^;


160 名前:(・∀・) :02/08/22 17:48
このスレッドは終了しました。
次スレは
http://pc3.2ch.net/test/read.cgi/tech/1029922472/
です。

161 名前:デフォルトの名無しさん :02/08/22 18:39
>>160
えぇ!?
もう終了したのかYO!

162 名前:149 :02/08/22 20:36
>>159
static_cast にすべきですよね。失礼しました。
いつも reinterpret_cast<HBRUSH>(COLOR_WINDOW+1);
とやってたのでその勢いで書いてしまった・・。

163 名前:デフォルトの名無しさん :02/08/22 21:07
>>162
> static_cast にすべきですよね。
この場合は、別に reinterpret_cast でも良いと思うが。

164 名前:デフォルトの名無しさん :02/08/22 22:40
ifの実装ってどのファイルに書いてあるんですか?

165 名前:デフォルトの名無しさん :02/08/22 22:44
>>164
...? ifが関数だと思ってる?

166 名前:デフォルトの名無しさん :02/08/22 22:44
>>164
gcc なら gcc/c-parse.y かなぁ?

167 名前:デフォルトの名無しさん :02/08/22 22:50
VCなら?

168 名前:デフォルトの名無しさん :02/08/22 23:01
>>167
マイクロソフトに聞け!

# 「聞け!」を2ch語にできないかなあ「する」→「しる」みたく。

マイクロソフトに聞き!  …うーん

169 名前:デフォルトの名無しさん :02/08/22 23:10
マイクロソフトに菊!

170 名前:デフォルトの名無しさん :02/08/22 23:10
マイクロソフトに菊座!

171 名前:デフォルトの名無しさん :02/08/22 23:28
>>168
しる!は形が似てるから間違えたんでしょ、ってことで

聞は!

はどうですか?


172 名前:デフォルトの名無しさん :02/08/22 23:33
reinterpret_castは整数型とポインタ型との相互変換に使う、とあるよ。
最も低レベルだから気軽に使うなと…((((゚д゚))))ガクガクブルブル

int n = 12345;
int *p = &n;
int n_addr = reinterpret_cast<int>(p); // n_addrにはpのアドレスが整数値として入る

173 名前:デフォルトの名無しさん :02/08/23 00:11
マイクロソフトに効く!

174 名前:デフォルトの名無しさん :02/08/23 00:16
マイクロソフトに奇形

175 名前:デフォルトの名無しさん :02/08/23 00:20
>>168
っていうか
×「する」→「しる」
○「しろ」→「しる」

2典でも読んでくだちいってことで。


176 名前:デフォルトの名無しさん :02/08/23 00:53
マイクロソフトに悶け!

177 名前:デフォルトの名無しさん :02/08/23 01:12
>>172
ポインタ同士の変換もreinterpret_castでしょ

178 名前:デフォルトの名無しさん :02/08/23 01:54
>>177
ポインタによる

179 名前:デフォルトの名無しさん :02/08/23 02:09
マルチスレッドでの例外処理なんですが。
サブスレッドで発生した例外を、メインスレッドに上手く伝播させる方法ってありますか?

180 名前:デフォルトの名無しさん :02/08/23 02:12
なんでC++ってキャストの仕方がたくさんあるんだよ。
無理な拡張ばっかりしてるからそんなことになるんだよ。

181 名前:デフォルトの名無しさん :02/08/23 02:14
>>180
・・・分かってないね。

182 名前:デフォルトの名無しさん :02/08/23 02:17
>>180
GCがなくてポインタが使えてデフォルトで無効なキャストが出来てしまうせい。

183 名前:デフォルトの名無しさん :02/08/23 02:24
>>181
ネタは無視しる。

184 名前:デフォルトの名無しさん :02/08/23 04:17
>>183
おい。勝手にネタにすんなよ。
C++だけだろこんなにキャストの仕方があって
いちいちプログラマが使い分けなきゃならんの。

185 名前:デフォルトの名無しさん :02/08/23 04:31
 こ の ス レ は C++ を 使 い こ な せ て い な い >>184 を 暖 か く 叩 く ス レ に な り ま す た

186 名前:デフォルトの名無しさん :02/08/23 04:34
>>185
煽りはいいからちゃんと説明しろよ。

187 名前:デフォルトの名無しさん :02/08/23 04:44
C++にいろんなキャストがあるってのは
( Hoge ) hoge;
Hoge ( hoge );
reinterpret_cast< Hoge >( hoge );
という形式の話なのか、それともC++スタイルの4種のキャストの話なのか。
それとも全部ひっくるめての話なのか。

boostあたりの偽キャストtemlateあたりになるとさすがにどうかとは思うが。
紛らわしい。

188 名前:デフォルトの名無しさん :02/08/23 04:46
嫌ならCスタイルのキャスト使えば?
それかreinterpretだけ使ってればいいじゃん。


189 名前:デフォルトの名無しさん :02/08/23 04:48
static_castだの何だのの話しは前スレで既出じゃなかったか?

190 名前:デフォルトの名無しさん :02/08/23 05:11
>>187
全部の話だ。ある型から他の型に変えるときそこで使用されるキャストすべてだ。
だいたいキャストごときでテンプレート使っているのが気に食わん。

>>188
自分一人で勝手に作れるのならそうする。
もっとも勝手にやれるならキャストを使い分ける方を選ぶがな。

191 名前:デフォルトの名無しさん :02/08/23 05:15
>>186
前にも解説したような覚えがあるんだが。とりあえず前スレ読んでみ?

192 名前:デフォルトの名無しさん :02/08/23 05:29
>>191
キャストの違いなら一応わかっているつもり。
俺が知りたいのは何故こんなにキャストの仕方があるかという理由だ。

193 名前:デフォルトの名無しさん :02/08/23 05:48
C++形式のキャストにはそれぞれ明確な用途がある。
C形式のキャストが残ってるのは単なる過去の負の遺産。

194 名前:デフォルトの名無しさん :02/08/23 09:38
確かにCのキャストなんか使ってないね。

195 名前:デフォルトの名無しさん :02/08/23 09:46
C style castは人間が間違えたときに悲惨だから
意図を明示した複数の長いキャスト指令に分割することで
意図以外のキャストをしてしまうミスを減らすものでんな。
また、C style castは危険なのだがソース中で埋もれてしまうので、
reinterpret_castという同等の固有指令を作って危険な文を発見しやすくしたって感じ?
どうせなら移行促進のためにC style castに警告ぐらい出してくれればいいのにな。

196 名前:デフォルトの名無しさん :02/08/23 12:47
C++キャスト厨が湧いてるようだな

197 名前:デフォルトの名無しさん :02/08/23 12:56
 _________
/∴∵∴ヽ
|∵∴∞ヽ|  _______________
|∴/= ♀=| <dynamic_cast以外使ったことねー!
\|   ▽/   ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
   ̄ ̄


198 名前:デフォルトの名無しさん :02/08/23 13:30
C爺はCスレ池。voke

199 名前:デフォルトの名無しさん :02/08/23 13:52
>>192
違いが分かっていれば、理由は明白なはずだが……。実は「分かってるつもり」
なだけ?

とりあえず C スタイルキャストと static_cast, dynamic_cast, reinterpret_cast の
違いについて書いてみ。

>>197
お前は Win32 プログラミングをやったことがないのかと…。lParam, wParam を
キャストするときに dynamic_cast はあり得んだろ。

200 名前:デフォルトの名無しさん :02/08/23 14:01
>>199
たぶん新しい(新しくもないが)形のキャストの話でしょ

201 名前:デフォルトの名無しさん :02/08/23 14:23
>>192
199の設問だと意図が掴みにくいだろうから、もっと端的に。
「ポインタ同士の変換でstatic_castとreinterpret_castがどう異なるか説明せよ。」

202 名前:デフォルトの名無しさん :02/08/23 16:01
だいたいお前ら!危険だの危険でないのと騒いでいるが
キャストがバグの原因だったことあるか?俺はない

203 名前:デフォルトの名無しさん :02/08/23 18:05
取りあえず放置で。

204 名前:デフォルトの名無しさん :02/08/23 18:24
>>202
よかったな。論破できたぞ。

205 名前:デフォルトの名無しさん :02/08/23 19:09
Cを使っていたときは暗黙のキャストでたまにバグったが
それもC++になって型変換が厳しくなってからはそれもない。
(その代わりにコンパイラがエラーをげろげろはく)
明示的キャストではCでもバグったことはない。
C++でキャストが沢山あるのは主にその機能の必要性からであって
(バグ対策の)開発支援のためではないだろう。
そしてそれぞれの機能のキャストを選択的に使えなければならない。
これがC形式のキャストでは出来ないことだ。もう一度言おう、
危険かどうかが問題なのではない。機能の違いが問題なのだ。
私は主に(ポインタではない)値のキャストにC形式を用い、
(これは式の記述の簡便さにもよるし曖昧さがないことにもよる)
OOに関するものにC++の長ったらしいキャストを用いている。
その必要があるからだ。
(static_castとreinterpret_castでさえ保証されている内容は全く違う。
Cタイプのキャストではどちらが適用されるか一見して分かるわけではない)

ご静聴ありがとう

206 名前:デフォルトの名無しさん :02/08/23 21:17
多重継承やら仮想関数のあるクラスポインターをキャストする時に問題になる話しだな。
virtualキーワード使わなければさほど意識する必要はないでしょ。
int を enum へ キャストする時 static_cast は重宝した。


207 名前:デフォルトの名無しさん :02/08/24 00:24
Cスタイルキャストって、文脈によって static_cast か
reinterpret_cast かに切り換わるの?

208 名前:デフォルトの名無しさん :02/08/24 00:55
>>207
規格では
const_cast
static_cast
const_cast+static_cast
reinterpret_cast
const_cast+reinterpret_cast
のどれかが適用されることになっている

209 名前:デフォルトの名無しさん :02/08/24 00:59
おお、そんな風になっていましたか。
ありがとうございました。>>208

210 名前:デフォルトの名無しさん :02/08/24 01:25
だれか >>201 の言っている
>「ポインタ同士の変換でstatic_castとreinterpret_castがどう異なるか説明せよ。」
について説明してくれ・・・・dynamic_castとCスタイルのキャスト以外知らないので気になる・・・・

211 名前:デフォルトの名無しさん :02/08/24 01:36
>>210
激しく同意。
解説しる!……いや、してください…。


212 名前:デフォルトの名無しさん :02/08/24 01:46
キャストの話って度々でるな

213 名前:デフォルトの名無しさん :02/08/24 01:55
>>210
多重継承してるときに、オフセットの調整するかどうかじゃないの?

class B1 { int b1; };
class B2 { int b2; };
class D : public B1, public B2 {};

D* pd = new D;
B2* pb = bd;

こうすると pd と pb は、それぞれ「D オブジェクトの先頭 (= B1 オブジェクトの先頭)」
「D オブジェクト中にある B2 オブジェクトの先頭」を指すよね。

  pd-> +------------
      | int b1;
  pb-> +------------
      | int b2;
      +------------

当然、アドレス値としては pd != pb になる。このときに

1. static_cast<D*>(pb) するとオフセット分だけ差し引いて pd と同じアドレスが返ってくる
2. reinterpret_cast<D*>(pb) すると pb のアドレスが、そのまま返ってくる
  (規格上は実装依存だけど、たいていの処理系だとこうなる)

と、結果が違ってくる。

214 名前:デフォルトの名無しさん :02/08/24 02:00
>>210
reinterpret_cast がビットパターンを変化させずに型変換するのに対して
static_cast はそのポインタ型にとって適切なビットパターンに変換してくれる
ということではないのかな。

215 名前:210 :02/08/24 02:35
>>213
>>214
なるほど.なんとなくだけど理解できた.
解説さんきゅです.

216 名前:210 :02/08/24 02:37
>>213
あれ?ってことは
>reinterpret_cast<D*>(pb)
って危険なんじゃ?
D*の型として取り出せるけど,じつは正しくアクセスできない?

217 名前:デフォルトの名無しさん :02/08/24 02:45
>>216
派生型への変換を目的としているならそれは正しくない使い方
static_castを使う。ちょっと違う部分(ほとんど全て)を適当に訳してみた

reinterpret_cast
・他の型への変換における値の互換性は実装依存。
・ポインタ型は十分なサイズの整数型に変換できる。
・整数型と列挙形はポインタ型に変換でき、ポインタ型から変換された整数は
同じポインタ型への変換によって正しくもとのポインタに戻る。
・関数ポインタを他の型の関数ポインタに変換できる。
それを使った呼び出し結果は未定義。ある型への変換の後もとの型への変換によって
正しくもとの値に戻る。それ以外の動作は不定。
・オブジェクトへのポインタを他の型のオブジェクトへのポインタに変換できる。
その動作は上と同様。
・メンバオブジェクト、メンバ関数それぞれのポインタを
他のオブジェクトの他の型のメンバポインタに変換できる。動作は上と同様
・ある型のポインタから他の型のポインタへのreinterpret_castを適用できるときに限り、
その型の左辺値を他の型の参照に変換できる。一切の一時オブジェクトの生成、コピーの生成
コンストラクタや変換関数の呼び出しは行われない。

static_cast
・ある値を他の型の変換コンストラクタが適用できるときに限りその値に変換できる。
・任意の値をvoid型に変換できる。その結果、式は値を放棄する。
・派生型のポインタから基底型のポインタに変換する標準変換があるときに限り、
基底型の左辺値を派生型の参照に変換できる。基底は仮想基底であってはならない。
値が派生型の部分値(要はアップキャスト)でないときに動作は未定義。
・各種標準変換の逆変換ができる
・整数型を列挙型に変換できる
・標準変換が存在するときに限り基底型のポインタを派生型のポインタに変換できる。
基底型は仮想基底であってはならない。動作は参照のときと同様。
・基底型にあるメンバがあり、基底型のメンバポインタから派生型のメンバポインタへの
標準変換があるときに限り、派生型のメンバポインタを基底型のメンバポインタに変換できる。
・オブジェクト型のポインタとvoid型のポインタの相互変換ができる。
もとのオブジェクト型への変換により正しくもとの値に戻る

218 名前:デフォルトの名無しさん :02/08/24 06:20
あと、C形式のキャストでは
const_cast
static_cast
const_cast+static_cast
reinterpret_cast
const_cast+reinterpret_cast
が順に適用されるのに加えて、
公開されていない基底に正しくキャストすることができる。
これはreinterpret_castにもない機能
(static_castではそもそも不可能)

219 名前:218 :02/08/24 06:40
(続き)もちろん派生側にもキャストできる。

reinterpret_castはポインタをほかの型に変換してもどす以外には
役立たずで不必要に見えるが、ほかの型に変換した結果が
不定(未定義ではない!!)というのがみそでwindowsの例だけども
BITMAPINFO bmpi ;
reinterpret_cast<BITMAPINFOHEADER*>(&bmpi) ;
のような記述を許容している。互換性のためには必要なわけだ。
static_castを二回(一回void*にする)使えばできるかもしれないが
規格に全く書かれていないstatic_castの使い方になってしまう。

220 名前:デフォルトの名無しさん :02/08/24 08:40
                 ∩
                 | |
                 | |
        ∧_∧   | |  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
       ( ´Д`)//  < 先生!わざわざ訳してくれてありがとうございmす!
      /       /    \
     / /|    /        ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  __| | .|    |
  \   ̄ ̄ ̄ ̄ ̄ ̄ ̄\
  ||\             \
  ||\|| ̄ ̄ ̄ ̄ ̄ ̄ ̄|| ̄
  ||  || ̄ ̄ ̄ ̄ ̄ ̄ ̄||
     .||              ||

221 名前:210 :02/08/24 13:33
>>217
>>218
詳しい説明さんきゅです.
おかげで理解できました.

222 名前:デフォルトの名無しさん :02/08/24 17:06
stringstreamで文字列に戻したときに
floatの文字列になっているみたいなのですが、
doubleの文字列にするにはどうしたらいいのでしょうか?

#include <iostream>
#include <sstream>
#include <string>
using namespace std;

int main()
{
stringstream oss;
string mystr;
double d = 1234.567890;
oss << d;
mystr=oss.str();
cout << mystr; //1234.57

return 0;
}

223 名前:デフォルトの名無しさん :02/08/24 17:09
setprecision

224 名前:222 :02/08/24 17:24
>>223
thanks
<< double するときは setprecisionが必要なのか...。

#include <iostream>
#include <sstream>
#include <string>
#include <iomanip>
using namespace std;

int main()
{
stringstream oss;
string mystr;
double d = 1234.567890123456,d2;
oss << setprecision(16) << d;
mystr=oss.str();
cout << mystr << endl;
oss << mystr.c_str();
oss >> d2;
cout << setprecision(16) << d2 << endl;
return 0;
}

225 名前:デフォルトの名無しさん :02/08/24 17:30
浮動小数点のデフォルトの出力精度が6桁までなので。

226 名前:デフォルトの名無しさん :02/08/25 00:10
質問です。
あまり C++ とは、関係のない話題なので申し訳ないのですが、
bcc5.5.1 で Windows DLL の作成・利用の仕方についての質問です。
以下のソースで試しているのですがどうにもうまくいきません。
DLL の作成には成功するのですが、DLL から関数のポインタを取得
するのに失敗してします。
宜しければ、間違いがどこにあるかご指摘いただけないでしょうか?
または、参考になる URL でも構いません。

bcc32 -O2 -WD testdll.cpp // DLL 作成時のコンパイラオプション
bcc32 -O2 test.cpp // EXE 作成時のコンパイラオプション

-- testdll.h --
int __declspec(dllexport) __stdcall MyFunction(int);

-- testdll.cpp --
#include "testdll.h"

int __stdcall MyFunction(int x)
{
  return x+100;
}

-- test.cpp --
#include <windows.h>
#include <cstdio>

using namespace std;

typedef int (*TFUNC)(int);

int main() {
 HINSTANCE  hInstDLL;
 TFUNC DllFunction;

 if((hInstDLL=LoadLibrary("testdll.dll"))==NULL) { std::printf("オープン失敗"); exit(1); }

 if (DllFunction=(TFUNC)GetProcAddress(hInstDLL,"MyFunction")) std::printf("%d\n\n",DllFunction(1));
 else std::printf("しっぱい\n");

 if(!FreeLibrary(hInstDLL)) { std::printf("クローズ失敗"); exit(1); }
 return 0;
}

-- 実行結果 --
C:\SLLTEST>test
しっぱい

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

227 名前:デフォルトの名無しさん :02/08/25 00:18
> あまり C++ とは、関係のない話題なので申し訳ないのですが、
それを知っててなんでこのスレに書くんだよ。extern "C"



228 名前:デフォルトの名無しさん :02/08/25 00:24
#defineについて質問です。

class Aに Allocate(a,b)という関数があり
class Bには Allocate(a) という関数があります。

class AのAllocate(a,b)を置換したくて
#define Allocate(a,b) AllocateEx(a,b,__FILE__,__LINE__)
とすると、class Bの Allocate(a)まで対象となってしまい
しかも引数の数が合わないとコンパイラに怒られます。

なんとかclass AのAllocateだけを置換対象とする事はできないでしょうか?
それとも別の解があれば、教えてください。

229 名前:デフォルトの名無しさん :02/08/25 00:28
>>228
エディタで置換してくれ。

230 名前:デフォルトの名無しさん :02/08/25 00:32
>>229
同意。マクロなんて、どこで影響出るか分からんから使うな。

いちおう回避策はあって、たとえ Allocate という引数付きマクロが定義されて
いたとしても (Allocate) と書くとマクロ展開を抑制できる。

231 名前:デフォルトの名無しさん :02/08/25 00:47
>>228
inline使え、って言ってもらいたいんだろ?

232 名前:226 :02/08/25 00:50
>227
失礼致しました。
もう少し勉強してきます。

233 名前:デフォルトの名無しさん :02/08/25 00:52
>>231
inline使うと、どうなるんですか?
置換対象のソースが膨大で、できればマクロで済ませたいのです。


234 名前:デフォルトの名無しさん :02/08/25 00:58
>>233
意味が分からん

235 名前:デフォルトの名無しさん :02/08/25 01:17
>>233
Allocateは関数なんだろ?
だったらその内部でAllocateExを呼べばイーんじゃねーの?

236 名前:デフォルトの名無しさん :02/08/25 01:26
>>235
__FILE__ とか __LINE__ とか書いてあるところから察するに、デバッグビルド用に
切り分けたいんじゃないかと。

237 名前:デフォルトの名無しさん :02/08/25 01:30
>>236
マクロに不都合があるなら、関数内部でデバッグルーチン組んでもいいかと思う。

238 名前:デフォルトの名無しさん :02/08/25 01:39
Bの前で#undef

239 名前:デフォルトの名無しさん :02/08/25 01:42
B(愛撫)の前はA(キス)。
ちゃんと覚えとけ。

240 名前:デフォルトの名無しさん :02/08/25 03:55
>>239
なんでBが愛撫でAがキスなんですか? Cはセックスですか?

241 名前:デフォルトの名無しさん :02/08/25 06:26
無名クラスにコンストラクタを定義する方法ない?

242 名前:デフォルトの名無しさん :02/08/25 07:56
>>241
this

243 名前:デフォルトの名無しさん :02/08/25 08:13
みんなキャストに夢中で>>180に答えてくれない。デョボーン(|||ω・`)

244 名前:デフォルトの名無しさん :02/08/25 08:13
違った>>179だった。デョボーン(|||ω・`)

245 名前:デフォルトの名無しさん :02/08/25 08:14
>>244
二度とバカなこと言わんようにな。と言うところ。

246 名前:デフォルトの名無しさん :02/08/25 08:28
>>245 意味不明

247 名前:デフォルトの名無しさん :02/08/25 09:04
つーか、まっとうな方法なら、サブからメインにメッセージ
渡すしかねーだろ。ウインドウメッセージとかさ、メインスレッドが
サブスレッドの例外状況をポーリングするとかさ。

248 名前:デフォルトの名無しさん :02/08/25 09:24
今、たった今、VC++でハロワルできました。
記念すべき最初のプログラムでした。
これからよろしくお願いします。

249 名前:デフォルトの名無しさん :02/08/25 09:25
>>248
>ハロワルできました。

通ぶるなら来るなよ。

250 名前:248 :02/08/25 09:28
>>249さんごめんなさい。
また来させてください。


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