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


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

C++相談室 part44
751 名前:デフォルトの名無しさん :2005/11/09(水) 19:47:43
( ゚д゚)マローク

752 名前:デフォルトの名無しさん :2005/11/09(水) 20:29:08
いや743はなんでポインタは全部スマートポインタじゃないんだって言いたいんだろ

753 名前:デフォルトの名無しさん :2005/11/09(水) 20:34:28
('A`)カローク

754 名前:デフォルトの名無しさん :2005/11/09(水) 21:00:31
(゚Д゚;)リアローク

755 名前:デフォルトの名無しさん :2005/11/09(水) 21:00:44
(・∀・)ラグナローク オンライン

756 名前:デフォルトの名無しさん :2005/11/09(水) 22:07:56
<`д'>アロカ

757 名前:デフォルトの名無しさん :2005/11/09(水) 22:08:52
>>756
環境依存は出て行け

758 名前:デフォルトの名無しさん :2005/11/09(水) 22:35:26
現在、C++で構造化記述されたコードをオブジェクト指向記述でリファクタリングしています。
が、どのようにクラス設計すればいいのか、見当がつきません。

例えば、以下のようなコードがあります。(細かい文法ミスは勘弁してください。)
GUIのグリッドコントロールからデータを取得する処理、入力範囲をチェックする処理、
構造体の各メンバに突っ込む処理です。
3コのメソッドで似たような条件分岐があり、これを取り除こうと思うのですが、
どのようにしてよいかわかりません。

最初は各メンバをクラスにしようかと思ったのですが、
そうすると30コくらいの小さいクラスができてしまいます。
また、各メンバの型も異なります。

新規メンバが追加されたりしても、修正個所が少なくてすむような
クラス設計するにはどうしたらよいのでしょうか?

ご教授いただけませんでしょうか。


759 名前:その2 :2005/11/09(水) 22:36:16

//グリッドからデータを取得(GUIクラスに記述)
void GetData( int nField, CString& Val )
{
switch( nField )
{
case 1://
Val = m_Grid.GetText( ROW_1, COL_DATA );
break;
case 2:
Val = m_Grid.GetText( ROW_2, COL_DATA );
break;
case 3:
Val = m_Grid.GetText( ROW_3, COL_DATA );
break;

// 以下略 30コくらい
}

760 名前:その3 :2005/11/09(水) 22:37:04
//入力範囲をチェック(GUIクラスに記述)
int CheckData( int nField, CString Val )
{
switch( nField )
{
case 1:
if( ( -10 > atol( Val ) || ( 10 < atol( Val ) ){
return -1;
}else{
return 0;
}
break;
case 2:
if( ( 0 != strcmp( "A", Val ) ) && ( 0 != strcmp( "B", Val ) ) ){
return -1;
}else{
return 0;
}
break;

case 3:
if( ( 0 > atoi( Val ) || ( 5 < atoi( Val ) ){
return -1;
}else{
return 0;
}
break;
// 以下略 30コくらい
}

761 名前:その4 :2005/11/09(水) 22:37:27
//取得したデータを構造体に設定(GUIクラスに記述)
void SetVal( int nField, CString Val )
{
switch( nField )
{
case 1://
stData.Field1 = atol( Val );// long型
break;
case 2:
stData.Field2 = Val;// 文字列型
break;
case 3:
stData.Field3 = atoi( Val );// int型
break;
// 以下略 30コくらい
}

762 名前:デフォルトの名無しさん :2005/11/09(水) 23:02:22
caseの値に対応する内容をTraitsクラスにして、
GetData(), CheckData()とSetVal()があるクラスを
クラステンプレート(Traitsクラスを引数に取る)にしてしまうのをまず思いついた。

763 名前:758 :2005/11/09(水) 23:38:53
お世話になります。

>>762
即レスありがとうございます。
すいません。
私の力量不足の為、いまいち理解できておりません。
もしよろしければ、参考書籍、参考URL等を教えていただけませんでしょうか?

764 名前:デフォルトの名無しさん :2005/11/09(水) 23:50:30
DDXみたいなのを実装すればそれで終わり?

765 名前:デフォルトの名無しさん :2005/11/10(木) 00:19:09
stDataは何処から出てくるの?
それから、何故にこれだけ
stData.Field1, stData.Field2, stData.Field3
みたくなってるの?

766 名前:デフォルトの名無しさん :2005/11/10(木) 00:25:18
>758
http://www.amazon.co.jp/exec/obidos/ASIN/4894712288/250-1993348-1930636

767 名前:デフォルトの名無しさん :2005/11/10(木) 00:26:16
>>761
stData の構成自体から考え直した方が良い気もする

768 名前:758 :2005/11/10(木) 00:37:22
>>766
ありがとうございます。
早速、購入してみます。

>>767
この構造体は多数のタスクが参照しており、
構成を変更することは無理なのです。

769 名前:デフォルトの名無しさん :2005/11/10(木) 01:35:19
>>737 new T[n]()

770 名前:デフォルトの名無しさん :2005/11/10(木) 01:36:06
オブジェクト指向に書き直さなきゃならないけどクラス設計が皆目わからないってんなら、デザインパターンの本でも読んでみてはどうだろう

771 名前:766 :2005/11/10(木) 01:44:46
>770
いや、多態も使えてない様だから、もう少し基礎的な所から始めた方がいいと思う……

そういや、デザインパターン本で基礎的な所をカバーしたやつって見たことないなぁ


772 名前:766 :2005/11/10(木) 01:56:50
>768
>この構造体は多数のタスクが参照しており

データの管理がうまくいっていないような気がする……
まずは >767の通り、stDataの抽象化からかなあ。
さっきの本の「フィールドのカプセル化」を行って、「メソッドの移動」「クラスの抽出」
あたりを検討する……かな?

『今のコードはプロトタイプ』と割り切って再設計する手もあるけど。


773 名前:デフォルトの名無しさん :2005/11/10(木) 05:15:08
プリプロセッサはCとC++ではまったく同じ仕様?
違うとしたらどこが違うの?

774 名前:デフォルトの名無しさん :2005/11/10(木) 05:43:41
>>773
コメント記号 // の扱いが違うだろ。

775 名前:デフォルトの名無しさん :2005/11/10(木) 13:05:26
>>743
遅レスだが、newを使う効用には「大きなオブジェクト」の確保ってのもあると思う。
関数内で大きなオブジェクトに対して自動変数を使うとオーバーフローしてしまうことがあるから。
ところで、関数用のスタックの大きさってどうやって調整すんだろう?>>誰か

776 名前:デフォルトの名無しさん :2005/11/10(木) 13:09:02
>>758-761
せっかく書き直してるんだから、その恥ずかしいcase文を
ダラダラ書いてるところから見直そう

777 名前:デフォルトの名無しさん :2005/11/10(木) 13:09:37
>>775
コンパイラスイッチ以外はシラネ。

778 名前:デフォルトの名無しさん :2005/11/10(木) 13:10:57
関数用のスタックって何よ?

779 名前:デフォルトの名無しさん :2005/11/10(木) 13:45:55
>>778はスで聞いているのか、>>775の言い方が気に入らないのか。

780 名前:デフォルトの名無しさん :2005/11/10(木) 13:50:17
匿名掲示板で変な勘ぐりすんなよ

781 名前:デフォルトの名無しさん :2005/11/10(木) 13:52:30
関数の仮引数やローカル変数用に用意されるメモリ領域のことだと思われ

782 名前:デフォルトの名無しさん :2005/11/10(木) 13:58:19
関数用のスタックという言い方が成立するなら"関数用*でない*"スタックが存在することになるな。

783 名前:デフォルトの名無しさん :2005/11/10(木) 14:03:21
std::stackとか

784 名前:779 :2005/11/10(木) 16:38:26
>>780
>>781のように親切に答えても>>782のようなレスがあるからだよ。
スタックって一般用語だって知らなかった>>782は痛い。痛すぎるが。

785 名前:デフォルトの名無しさん :2005/11/10(木) 17:47:44
すみません、g++でCソースコードを
ジェネレートすることってできるんですか?

昔のC++コンパイラはCのソースコードを
吐き出していたと聞きます。

今でもそれができるかどうかを教えてもらえませんか?

786 名前:デフォルトの名無しさん :2005/11/10(木) 17:51:45
>>785
出来ません

787 名前:デフォルトの名無しさん :2005/11/10(木) 17:53:02
>>785
昔のって、禿のcfrontのことか
comeauなら今でもそんな感じ(バイナリコード生成をするコンパイラを別途用意しなければならない)

788 名前:デフォルトの名無しさん :2005/11/10(木) 18:39:06
>>787
ありがとうございます。
調べてみます。
しかしcomeauって発音がよくわからないな・・

789 名前:デフォルトの名無しさん :2005/11/10(木) 18:46:40
コミュー?

790 名前:デフォルトの名無しさん :2005/11/10(木) 19:19:39
カミーユ

791 名前:デフォルトの名無しさん :2005/11/10(木) 21:45:26
void foo(const char* i){
std::cout << i << std::endl;
}
int main(){
boost::bind(&foo, _1)("3");
return 0;
}

↑は正しくコンパイルされて動くんだけど、
↓(引数がint)はコンパイルエラーになるのはなぜですか?

void foo(int i){
   std::cout << i << std::endl;
}
int main(){
   boost::bind(&foo, _1)(3);
   return 0;
}

gcc3.4.4 boost1.33.0です

792 名前:デフォルトの名無しさん :2005/11/10(木) 21:50:09
なんだ、男か。

793 名前:デフォルトの名無しさん :2005/11/10(木) 21:55:19
>>791
http://www.boost.org/doc/html/lambda/le_in_details.html#lambda.rvalues_as_actual_arguments

794 名前:デフォルトの名無しさん :2005/11/10(木) 22:01:03
>>793
ありがとう! constじゃないといけないんですね
boost::lambda::make_constを使ってうまくいきました

795 名前:616 :2005/11/10(木) 23:11:17
("3")チュイ

796 名前:デフォルトの名無しさん :2005/11/11(金) 01:33:07
C++ Coding Standards p157に、
「std::string の実装は、時代遅れの最適化手法である書き込み時コピーを放棄しつつある」
ってあったんですが、COWって時代遅れなんですか?もっといい方法があるんですか?

797 名前:デフォルトの名無しさん :2005/11/11(金) 01:48:02
>>796
なんかCOW(というかリファレンスカウント?)はマルチスレッドで都合が悪いらしい。
そんで、いまは愚直にコピーしまくる代わりにアロケータを賢くすることで
パフォーマンスを稼ごうって流れだっけ?

798 名前:デフォルトの名無しさん :2005/11/11(金) 02:01:38
>>796
More Exceptional C++(英語) P118〜
COWはマルチスレッド時のパフォーマンス低下が甚だしいので、
従来の参照カウント方式を使わない方向の方が望ましいような
事が書いてある。

COWは遅延評価の一種であるため、mutexなどを使ってスレッド・
セーフにしないと、バグる理由が説明してある。

但し、シングル・スレッドで走らせるならば、50%程度のパフォー
マンス向上が望めるとも書いてある。

これ早く和訳されないかね〜

799 名前:デフォルトの名無しさん :2005/11/11(金) 02:03:17
Effectiveみたいに訳者が変わって悲惨なことにならないでくれるといいけど・・・

800 名前:デフォルトの名無しさん :2005/11/11(金) 02:06:40
>>799
俺そのために、More Effective C++は英語版も買ってしまった('A`)
こいつらを付き合わせて読まないと、意味が通らない所があるんで。

801 名前:デフォルトの名無しさん :2005/11/11(金) 02:11:04
>>800
漏れもだ('A`)
C++FAQとMoreEffectiveC++は原著を読んだ方がいい

802 名前:デフォルトの名無しさん :2005/11/11(金) 08:10:36
どこに書いたらいいか分からなかったのでここで質問させて頂きます。
少々長文になってしまいますが。

自分の環境は、WindowsXP SP2、P4 2.6G HT
コンパイラはBCC 5.5.1です。

単なるローカル変数として宣言したもの同士の割り算、
100万回ループに掛かる時間が
int型同士 約0.769ms、float型同士 約16.763ms、double型同士 約54.38ms
(int a / int b 等)
なのですが、あるクラスのメンバー変数の場合、上記と同じ計算をすると、
int型同士 約22.725ms、float型同士 約16.581ms、double型同士 約16.649ms
(class a.a / class b.b 等)
と、int型が鼻糞な程遅くなります。

使ったコードはクラス、変数の宣言とループと時間計測に必要なコードのみの
単純な物でQueryPerformanceCounterで計測しました。
メンバー変数の場合、色々状況を変えて計測してみても、
ループに掛かる時間の変化はあってもintが絡む場合intだから早いという事にはならず、
結果としてはfloat型の変数が一番高速に計算できるという結果に。
クラスのメンバー変数になったとたんにint型だけが超低速になってしまうのが
どうしても納得いかないのです。

この辺りの事に詳しい方がいましたら、
どういう事でこうなってしまうのか教えて頂きたいのです。
(メンバー変数のint型が遅くなる理由とか)
宜しくお願します


803 名前:デフォルトの名無しさん :2005/11/11(金) 09:23:54
環境依存スレチガイ

804 名前:デフォルトの名無しさん :2005/11/11(金) 10:43:29
class A{
public:
void ff(const char* c){}
};
class B{
public:
void ff(const char* b){}
void foo(){
std::vector< const char* > v;
A a;
std::for_each(v.begin(), v.end(), boost::bind(&A::ff, &a, _1)); // (1)
std::for_each(v.begin(), v.end(), boost::bind(&B::ff, this, _1)); // (2)
}
};

(1)はOKですが(2)はコンパイルがとおりません。
自分のメンバ関数を呼ぶときはどう書くんでしょうか?

VC7.1 boost1.31

805 名前:デフォルトの名無しさん :2005/11/11(金) 11:01:30
>>804
VC7.1 boost1.33でコンパイル通ったけどなぁ
boost::bind

806 名前:デフォルトの名無しさん :2005/11/11(金) 11:02:55
途中で送信してもた orz
boost::bind(boost::mem_fn(&B::ff), this, _1) にしてみては

807 名前:デフォルトの名無しさん :2005/11/11(金) 11:37:16
>>804
g++ 3.3.5 boost1.32でそれ通りますね


808 名前:804 :2005/11/11(金) 11:50:56
あ、すみません。
class B が関数内クラスになってました。

class A{
...
};

void XXXX(){
class B{
...
};
...
}

class Bを外に出したらうまくいきました。

(が、なぜ関数内だと駄目なのかは理解していない・・)

809 名前:デフォルトの名無しさん :2005/11/11(金) 15:14:22
>>808
>>730-733

810 名前:デフォルトの名無しさん :2005/11/11(金) 18:45:51
>>808
笑いを堪えるのに必死。

811 名前:デフォルトの名無しさん :2005/11/11(金) 22:16:49
>>810
笑い終わったら理由を教えてくれないか
俺もわかんねぇぞw

812 名前:デフォルトの名無しさん :2005/11/11(金) 23:15:37
>>811
きっと >>810 はVIPPERなんだよ。

813 名前:デフォルトの名無しさん :2005/11/12(土) 03:27:00
>808のネタが分からない奴がいるとは悲しいことだ

814 名前:デフォルトの名無しさん :2005/11/12(土) 07:14:40
↑説明たのむ

815 名前:デフォルトの名無しさん :2005/11/12(土) 19:52:22
バイトオーダがネットワーク型、intが4バイトとしてとして
int i = 12345;
(i >> 12) & 0xffff
みたいに任意の場所を2バイト整数として取り出すことができますが(プログラム正しいか?)
逆に値を設定するときはどうするの?


816 名前:デフォルトの名無しさん :2005/11/12(土) 19:54:55
バイトオーダー関係ないとおもう

817 名前:デフォルトの名無しさん :2005/11/12(土) 20:01:14
>>815
そういう時のためのunion

818 名前:デフォルトの名無しさん :2005/11/12(土) 20:58:02
>>815
更地にしてからOR

819 名前:デフォルトの名無しさん :2005/11/13(日) 01:27:34
>>818
家建てたばかりなのでそれは勘弁・・・

820 名前:デフォルトの名無しさん :2005/11/13(日) 02:18:50
>>819
寒゛。

821 名前:デフォルトの名無しさん :2005/11/13(日) 05:02:33
>>816
ビット演算ってバイトオーナ関係なかったのか

定番の方法ってないんですね
とりあえず内部的には個別に整数でもってビットパターンがほしいときに(a<<32)|(b<<14)ってして返すようにした。

822 名前:デフォルトの名無しさん :2005/11/13(日) 05:24:59
バイトオーナ?

823 名前:デフォルトの名無しさん :2005/11/13(日) 09:52:08
ニー

824 名前:デフォルトの名無しさん :2005/11/13(日) 12:03:02
つーかC++スレならbetset使えよ。

825 名前:デフォルトの名無しさん :2005/11/13(日) 12:23:27
betset?

826 名前:デフォルトの名無しさん :2005/11/13(日) 12:24:11
そんなにいっぱい賭けられません><

827 名前:デフォルトの名無しさん :2005/11/13(日) 14:01:27
誤字で会話するスレはここですか

828 名前:デフォルトの名無しさん :2005/11/13(日) 15:58:11
>>815
int i=12345;
int mask= 0xffff<<12;
i&= ~mask; /*更地*/
i|= mask&(0xabcd<<12); /*セット*/


829 名前:デフォルトの名無しさん :2005/11/14(月) 05:00:02
#include<cstdio>
template <class U>
U operator+(U i, U k){
return i + k + 2;
}
int main(){
printf("%d\n",2+2);
}
これでコンパイルすると"4"と表示されてしまうのですが、
演算子オーバーロードを有効にするには何が足りないのでしょうか?

830 名前:デフォルトの名無しさん :2005/11/14(月) 05:01:30
>>829
組み込み型の振る舞いを変えることは出来ない
operator+のパラメータのうち最低一つはユーザー定義型でなくてはならないから、
Uはintにはなりえない

831 名前:デフォルトの名無しさん :2005/11/14(月) 05:13:42
>>830
>operator+のパラメータのうち最低一つはユーザー定義型でなくてはならない

なるほど。試しに以下のようなコードをにしたら演算子オーバーロードが機能しました。どうもです。
#include<cstdio>
struct CLASS{};
template<class T, class U>
U operator+(T t, U k){
return sizeof(t) + k;
}
int main(){
CLASS cls;
printf("%f\n",cls+2.5);
}

832 名前:デフォルトの名無しさん :2005/11/14(月) 05:25:23
あれ、どうでもいいけど上のコードが
$gcc foo.cpp
でコンパイル実行できちゃっってた。なんでんだろ・・・

833 名前:デフォルトの名無しさん :2005/11/14(月) 05:40:56
コンパイルできない理由がないだろ。

834 名前:デフォルトの名無しさん :2005/11/14(月) 07:36:44
c++ライブラリを使ってないから。l

835 名前:デフォルトの名無しさん :2005/11/14(月) 08:37:59
char c[]{ 0xff };
c == 255;
このcの大きさが任意、例えば10バイトとかでも10進表現の文字列に変換したいんだけど
どうすればできる?


836 名前:デフォルトの名無しさん :2005/11/14(月) 08:42:29
>>835
頼むから初心者スレに行くか、問題を整理して書くかしてくれ。

837 名前:デフォルトの名無しさん :2005/11/14(月) 17:23:29
多倍長整数の表示ルーチンをつくりたいって話か?

838 名前:デフォルトの名無しさん :2005/11/14(月) 20:55:28
>>837
多倍長整数っていうのか。検索してみたけどある程度コードかかないとダメっぽいね

839 名前:デフォルトの名無しさん :2005/11/14(月) 22:33:19
g++3.4.4 で以下のコードがコンパイルできないのは何ででしょうか?
また,以下みたいな generic な template-class の中で map の全要素を舐めたいときはどうすればよいのでしょうか?

template <class T>
struct X {
  std::map<T,int> map_;
  void func() {
    for (std::map<T,int>::iterator itr = map_.begin(); 
        itr != map_.end(); ++itr) {
      cout << itr->first << " " << itr->second << endl;
    }
  }
};

840 名前:デフォルトの名無しさん :2005/11/14(月) 22:38:28
error: dependent-name `std::map<T, int, std::less<_Key>, std::allocator<std::pair<const T,\
int> > >::iterator' is parsed as a non-type, but instantiation yields a type
note: say `typename std::map<T, int, std::less<_Key>, std::allocator<std::pair<const T, in\
t> > >::iterator' if a type is meant

コンパイルエラーくらい嫁よ。

841 名前:デフォルトの名無しさん :2005/11/14(月) 22:38:51
どうせtypenameだろ
エラーメッセージぐらい書け

842 名前:デフォルトの名無しさん :2005/11/15(火) 20:53:34
intellisenseってどんな仕組みでパラメータヒントを表示しているんですか?
インクルードしていないヘッダの定義を勝手に表示してくれたり
逆にインクルードしてても表示してくれなかったりわけがわかりません
mfc使ってないのに定義とか表示されると邪魔でしょうがないです
vs2003です

843 名前:デフォルトの名無しさん :2005/11/15(火) 21:00:09
確かファイルに吐き出してたはず
ビルドした時点でそのファイル更新して
新規追加したヘッダーのも追加してるんじゃね?

詳しい解説は↓よろ

844 名前:デフォルトの名無しさん :2005/11/15(火) 21:07:46
書こうかと思ったがスレ違いなのでやめておく。

845 名前:デフォルトの名無しさん :2005/11/15(火) 21:11:10
おい、書いてくれよw

846 名前:デフォルトの名無しさん :2005/11/15(火) 21:22:45
vs2003 は知らないけど vc6 なら ncb ファイルを見てるんじゃなかったっけ

847 名前:デフォルトの名無しさん :2005/11/15(火) 21:30:22
ncbファイルってどうやって修正するの?

848 名前:デフォルトの名無しさん :2005/11/15(火) 21:33:37
PODについて調べていたのですが、PODである要件の中に、仮想関数をメンバに持たないというのがないようなのですが、
これは何かの間違いですよね?(集成体の要件には仮想関数を持たないというのがありましたが)

849 名前:デフォルトの名無しさん :2005/11/15(火) 21:52:32
調べてみたらncbファイルを編集するツールとかは無いらしい
不便なままでいろってこと?w

850 名前:デフォルトの名無しさん :2005/11/15(火) 21:53:52
POD-StructはAggregateだって書いてあるようにみえるんですが?

851 名前:デフォルトの名無しさん :2005/11/15(火) 21:55:31
できるかしらんが、同名の空ファイル作って読み込み専用にしてみたら?

852 名前:デフォルトの名無しさん :2005/11/15(火) 22:18:10
>848
仮想関数にはvtblが要るじゃあないか。PODとは言えんよ。

853 名前:デフォルトの名無しさん :2005/11/15(火) 22:25:40
>>852
そう思ったのですが、ISOのドラフトやJISでさえ仮想関数があってはならないとは書いていないです。

854 名前:デフォルトの名無しさん :2005/11/15(火) 22:26:25
>>853
俺を無視スンナ

855 名前:デフォルトの名無しさん :2005/11/15(火) 22:35:00
>>854
ttp://pc8.2ch.net/test/read.cgi/tech/1129798459/785-796

856 名前:デフォルトの名無しさん :2005/11/15(火) 22:36:34
>>854
すいません。見逃していました。
ありがとうございます。疑問ははれました。

857 名前:デフォルトの名無しさん :2005/11/15(火) 22:41:22
>>855
おまえそこの791だろ

858 名前:デフォルトの名無しさん :2005/11/15(火) 22:50:45
>>857
どういう理由でそう思ったのかわからんが外れだ

859 名前:デフォルトの名無しさん :2005/11/15(火) 23:02:50
スマートポインタのbool値変換として、メンバポインタ
typedef T * (this_type::*unspecified_bool_type)() const;
typedef T * this_type::*unspecified_bool_type;
が使われているけど、もっと単純に、
不完全型のポインタ
struct unspecified_bool_type_tag;
typedef unspecified_bool_type_tag *unspecified_bool_type;
や、関数ポインタ
typedef void (*unspecified_bool_type)(void);
なんかじゃ駄目なのかな。
どこかに穴がある?

860 名前:デフォルトの名無しさん :2005/11/15(火) 23:45:53
void *にしてしまったら型が違うポインタ同士の比較が出来てしまう

861 名前:デフォルトの名無しさん :2005/11/16(水) 12:18:46
たとえばの話ですが,
1234という入力を,2バイト分ずつ(12, 34)というように読みたいときに,
aとbをそれぞれ2バイト変数として定義して,
cin >> a >> b;
とやってもa=12, b=34とはならないんですが,
どうやったらうまくできますか?
cin >>の形ではできないんですか?


862 名前:デフォルトの名無しさん :2005/11/16(水) 12:43:29
>>861
1234って16進数での話だよね?
というかその例だと1バイト分ずつだけど・・・
リトルエンディアンとして、
int tmp;
cin >> tmp;
a = tmp & 0xFF;
b = (tmp >> 8) & 0xFF;
じゃだめなん?


863 名前:861 :2005/11/16(水) 12:52:23
すいません.
入力は,あるフォーマットされたファイルなんですが,
そのファイルのヘッダ部分だけ一気に読みたいんです.
ヘッダには10個くらい項目があるので,
operator>>を定義して
cin一個で綺麗に読めないかなと思いまして.

864 名前:デフォルトの名無しさん :2005/11/16(水) 13:26:48
>>863
std::getline()で一度std::stringに読み取っておき、boost::lexical_castで
切り出して変換する。

865 名前:デフォルトの名無しさん :2005/11/16(水) 13:27:43
まあヘッダを読み取るだけのために専用クラスを作ってもいいけど、
何かもったいない気がしたので。やろうと思えばできない事もないが。

866 名前:デフォルトの名無しさん :2005/11/16(水) 14:01:25
ありがとうございます.
ついにboostを使うときが・・・.
いやよいやよと避けてきましたが,やってみます.

867 名前:デフォルトの名無しさん :2005/11/16(水) 14:06:58
嫌なんなら適当に書けば言いジャマイカ
template <class Target, class Source>
inline Target lexical_cast(Source source)
{
    std::stringstream ss;
    Target t;

    ss << source;
    ss >> t;

    return t;
}
素人が適当に書いてみるテスト
普通はどう書くんだろう…

868 名前:デフォルトの名無しさん :2005/11/16(水) 14:27:21
別に無理してboost使わなくても、atoi() or atof() + std::string::c_str()でも
オケ。

869 名前:デフォルトの名無しさん :2005/11/16(水) 15:10:07
Cの関数の引き数としてC++のメソッドのポインタを渡したいんですが。
無理でつか

870 名前:デフォルトの名無しさん :2005/11/16(水) 15:17:54
超FAQな質問だな

871 名前:デフォルトの名無しさん :2005/11/16(水) 15:48:26
>>869
Cの関数に、vtblを解析できる能力と、thisを受け取る能力があればな。

872 名前:デフォルトの名無しさん :2005/11/16(水) 17:38:56
>>869
諦めてstaticにしる

873 名前:デフォルトの名無しさん :2005/11/16(水) 17:42:40
>>869
BCB(BCC)で__closure

874 名前:デフォルトの名無しさん :2005/11/16(水) 18:26:47
POD vtbl Aggregateって何ですか?

875 名前:デフォルトの名無しさん :2005/11/16(水) 18:31:06
18禁の単語だから聞いちゃダメ!

876 名前:デフォルトの名無しさん :2005/11/16(水) 18:35:53
そうなんですか、失礼しました

877 名前:デフォルトの名無しさん :2005/11/16(水) 19:04:08
PODはPlain Old Dancerつまり古き良き時代の踊り子
vtblはバーチャルリアルリアリティの世界に登場する机
Aggregateは睾丸だ

878 名前:デフォルトの名無しさん :2005/11/16(水) 19:32:37
間違えたがどうでもいいや

879 名前:デフォルトの名無しさん :2005/11/16(水) 20:11:34
>>869
無理。
でもWinAPIみたいに追加の引数を渡せるようになっていれば何とかなる。

880 名前:デフォルトの名無しさん :2005/11/16(水) 20:59:05
WNDPROCに追加の引数はない

881 名前:デフォルトの名無しさん :2005/11/16(水) 21:09:04
仮想関数のテーブル書き換えるのってどうやるの?

882 名前:デフォルトの名無しさん :2005/11/16(水) 21:29:27
>>880
ウィンドウハンドルに好きなだけデータを関連付けられるから、そっちで何とかすればいい。

883 名前:デフォルトの名無しさん :2005/11/16(水) 22:31:19
>>881
実装依存だし、できたとしてもやっちゃダメだ。

884 名前:デフォルトの名無しさん :2005/11/16(水) 22:37:21
>>882
ウインドウをサブクラスして、あるクラスに処理させたいときはどうするの?

885 名前:デフォルトの名無しさん :2005/11/16(水) 23:08:12
>>884
違いがわからん

886 名前:デフォルトの名無しさん :2005/11/16(水) 23:30:24
SetPropでウィンドウにクラスへのポインタを関連付けて
GetPropでそのポインタを拾ってクラスに処理させればいい
ウィンドウを閉じる前にRemovePropするのを忘れずに

887 名前:デフォルトの名無しさん :2005/11/17(木) 17:35:06
VC++でCOMのインターフェイスとクラスの関係についてです。

IStream ← CStream(IStreamの実装)
 ↑          ↑
IFile(Open追加)← CFile(IFile::Openの実装)

class CStream : public IStream
interface IFile : public IStream
class CFile : public IFile, CStream

これだとIStreamの各関数が定義されていませんとエラーが出てしまいます。


IStream ← CStream(IStreamの実装)
      ♂
IFile(Open追加)← CFile(IFile::Openの実装)

class CStream : public IStream
interface IFile : public CStream
class CFile : public IFile

IFileの派生元をCStreamに、CFileの派生元をIFileにすれば
エラーは出ないのですが、何かしっくり来ません。


こういうモノなのでしょうか?

888 名前:デフォルトの名無しさん :2005/11/17(木) 17:46:21
ATL風に
IStream ← CStream<IStream>(IStreamの実装)
 ↑         
IFile(Open追加)←CStream<IFile>(IFileのIstream部分を実装)←CFile(IFile::Openの実装)
とでもすれば?

889 名前:デフォルトの名無しさん :2005/11/17(木) 19:05:15
>>887
CFileの中でIStreamのメソッドそれぞれに対していちいち次のように親のメソッドを呼ぶ方法もないわけではない。
STDMETHODIMP Read(void *pv, ULONG cb, ULONG *pcbRead)
{
    return CStream::Read(pv, cb, pcb);
}

ただ、そもそもIFile::Openの存在意義がわからない。何故必要?

890 名前:887 :2005/11/17(木) 19:23:56
>>888
おぉ、ありがとうございます。
こんなかんじで出来ました。

template <class TYPE> class CStream : public IStream
interface IFile : public IStream
class CFile : public CStream<IFile>

ただ、IStreamからの派生物が増えてくると、お腹いっぱいになりそうです。
それとQueryInterfaceでIFileインターフェイスの取得が上手くいかなさげ??


>>889
その方法は面倒臭そうだったので止めました。

> ただ、そもそもIFile::Openの存在意義がわからない。何故必要?
え゛? 他にもIBufferとかICompressとか作って
IStreamでの一括管理がしてみたいから、としか…
COMに拘る理由は無いんですが、勉強にもなるかなと。

891 名前:デフォルトの名無しさん :2005/11/17(木) 19:56:41
>890
×class CFile : public IFile, CStream

class CFile : public IFile
{
private:
CStream foo;
}
理由もなくprivate継承するな。
めんどくさがらずに、いちいち実装しろ。

892 名前:デフォルトの名無しさん :2005/11/17(木) 20:07:09
891のは>887とするべきだったか
もひとつ
>890
×template <class TYPE> class CStream : public IStream
○template <class TYPE> class CStream : public TYPE
テンプレートを使うとなると、
実装をモジュールに封じ込めるために別のクラスが欲しくなる罠。

893 名前:889 :2005/11/17(木) 20:10:48
>>890
template <class T> class CStream : public T
おそらく888はこうすることを考えていたはず。

ところで俺はIFile/CFileなどを作らずともSHCreateStreamOnFileとかで十分ではと思った。

894 名前:887 :2005/11/17(木) 20:51:42
>891
> 理由もなくprivate継承するな。
こ、これはバグです。

>892 >893
public TYPE
これで出来ました。何故なのかは後で考察します。


で、妄想を膨らませたらこうなりました。

template <class TYPE> class CStream : public TYPE
template <class TYPE> class CFile : public TYPE

CFile< CStream<IFileStream> >


> SHCreateStreamOnFile
更に悟りを開いた結果、これが全てを物語ってる気がします。
タイヤの発明 ('A`)

895 名前:887 :2005/11/17(木) 21:23:56
ああ、なるほど。
template <class TYPE> class CStream : public IStream だと
>888 IStream ← CStream<IStream>(IStreamの実装)
固定になってしまうのか。

896 名前:887 :2005/11/18(金) 15:21:10
> template <class TYPE> class CStream : public TYPE
でも、これって複数のinterfaceを継承する時どうするんだろ?

IArchive  IStream
  ↑    ↑
 IArchiveStream

CStream<IArchiveStream> (IArchiveStreamのIStreamの実装)
CArchive<IArchiveStream> (IArchiveStreamのIArchiveの実装)

だとすると

template <class TYPE> class CArchiveStream : public CStream<TYPE>, public CArchive<TYPE>
CArchiveStream<IArchiveStream>
または
template <class TYPE> class CArchiveStream : TYPE
CArchiveStream< CStream< CArchive<IArchiveStream> > >

前者はIStreamが未実装、後者はIUnknownの変換があいまい、てエラーが出る。

897 名前:デフォルトの名無しさん :2005/11/18(金) 22:51:12
>896
正直なところ、
CArchiveStreamの実装が単純なCArchiveとCStreamからの横流しで
できるようなものなのかが疑問だが(それ故の多重継承じゃないのか?)

1.いちいち定義
class CArchiveStream : public IArchiveStream
{
private:
CArchive<IArchive> a;
CStream<IStream> s;
}
2.多重継承なインターフェイスが悪い
interface IArchiveStream
{
virtual IArchive &GetIArchive() = 0;
virtual IStram &GetIStream() = 0;
}

898 名前:デフォルトの名無しさん :2005/11/18(金) 22:57:25
CArchiveStreamからIUnknown*への変換を必要とするところすべてに、
ちゃんとしたキャストを実行すればよろし。
static_cast<IUnknown*>(static_cast<IArchive*>(this));か、
static_cast<IUnknown*>(static_cast<IStream*>(this ));かどっちかだろうが。

899 名前:887 :2005/11/19(土) 03:19:58
>>897-898
レスありがとうございます。

> 多重継承なインターフェイスが悪い
なんとなくそんな気はしてました。
(887の最初のところも含めて)COMの理念にそぐわない設計なんだろーな、と。

キャストに関しては、テンプレートの利点を生かせるように試行錯誤してましたが
やはり明示的に指定してやらないとダメみたいですねぇ。

もうしばらくは色々な文献を漁ってみることにします。

900 名前:デフォルトの名無しさん :2005/11/19(土) 03:46:01
>>898
キャスト使う時点で設計ミスだ。static_castだとしても。

901 名前:デフォルトの名無しさん :2005/11/19(土) 08:01:49
すいません。教えてください。
C++用のlint は存在するのでしょうか?


902 名前:デフォルトの名無しさん :2005/11/19(土) 08:51:13
>>897
> > 多重継承なインターフェイスが悪い
>COMの理念にそぐわない設計
実際、COMのインターフェイスは単独継承しかできない仕様。(だからIArchiveStreamは存在できない)
(それを実装するときは好きなだけインターフェースを継承して実装できるがそれはCOMの世界でないから)
複数のインターフェイスをサポートしたければQueryInterfaceで対応することになる。

903 名前:デフォルトの名無しさん :2005/11/19(土) 12:06:09
>>901
ない。仮にあったとしたらそれは既にlintではない。

904 名前:デフォルトの名無しさん :2005/11/19(土) 12:25:21
903>> ありがとうございました。納得です。

905 名前:デフォルトの名無しさん :2005/11/19(土) 20:26:07
過去ログって見れないの?

906 名前:デフォルトの名無しさん :2005/11/19(土) 20:29:33
●買えばみれる

907 名前:デフォルトの名無しさん :2005/11/19(土) 21:13:03
>>905
ttp://makimo.to

908 名前:デフォルトの名無しさん :2005/11/19(土) 23:45:11
Modern C++ Designのポリシーっていうやつなんだけど、
あれについてもう少しいろんな具体例が書かれているような本とかってある?

909 名前:デフォルトの名無しさん :2005/11/20(日) 00:10:52
>>908
Lokiソース

910 名前:デフォルトの名無しさん :2005/11/20(日) 00:14:12
アレはまさにLokiの解説本って感じの本だった。
サパーリ活用してないが。


911 名前:デフォルトの名無しさん :2005/11/20(日) 00:30:51
>>906
●買ったらID:???の板とかでも全部ID見えるって本当?

912 名前:デフォルトの名無しさん :2005/11/20(日) 00:33:48
hontou

913 名前:デフォルトの名無しさん :2005/11/20(日) 00:44:24
>908
ポリシーってアレだろ。
単に、テンプレート引数で与えられるクラスに「処理」を任せるようにして、
「処理」の中身を選択したり、自分で作ったりできるようにした。
ってだけの事じゃないのか?

914 名前:デフォルトの名無しさん :2005/11/20(日) 13:44:13
908は多分、そこんとこはわかった上で
機能をポリシーに分解する具体例をたくさん見たいんだと思う。

915 名前:デフォルトの名無しさん :2005/11/20(日) 14:14:09
Lokiの実装を見るのが一番だと思うなぁ。
ModernC++Designで触れられてないコンポーネントもあるし。
他のライブラリでポリシーを前面に押し出したやつってあるかな?

916 名前:デフォルトの名無しさん :2005/11/20(日) 14:50:44
boost

917 名前:デフォルトの名無しさん :2005/11/20(日) 16:18:09
>>916
絡みが激しい

918 名前:デフォルトの名無しさん :2005/11/20(日) 20:07:16
boostライブラリっていつ標準化されるんすか?

919 名前:デフォルトの名無しさん :2005/11/20(日) 20:18:15
>>918
明後日

920 名前:デフォルトの名無しさん :2005/11/20(日) 20:18:33
マジかよ

921 名前:デフォルトの名無しさん :2005/11/20(日) 20:45:22
ΩΩ Ω<ナ、ナンダッテー

922 名前:デフォルトの名無しさん :2005/11/20(日) 22:53:09
>915
STLコンテナ(のアロケータ)

923 名前:デフォルトの名無しさん :2005/11/21(月) 00:07:05
dbx形式のメールを、eml形式に変換するにはどうすればいいのでしょうか。

924 名前:デフォルトの名無しさん :2005/11/21(月) 00:09:30
>>923
ここではスレ違いだから、頑張れとしか言えない。

925 名前:デフォルトの名無しさん :2005/11/21(月) 00:22:45
>923
頑張れ

926 名前:デフォルトの名無しさん :2005/11/21(月) 00:49:48
>>923
フォーマットを調べればいいと思う。

927 名前:デフォルトの名無しさん :2005/11/21(月) 07:33:32
>>923
というわけで頑張れ

928 名前:923 :2005/11/21(月) 08:01:43
自己解決しました、お騒がせしてすみませんでした

929 名前:デフォルトの名無しさん :2005/11/21(月) 10:41:50
>>908
ATL のソース読んでみ。
Loki よりもだいぶ昔にかかれたものだけど、
スレッドモデル選択や、ウィンドウスタイル選択などは
Loki のポリシーに通じるものがある。

930 名前:デフォルトの名無しさん :2005/11/21(月) 12:39:31
>>929
ATL。MFCよりいい出来なのに、マニアックすぎて人気がいまいちなのが悲しい。

931 名前:デフォルトの名無しさん :2005/11/21(月) 18:03:13
日本語の資料が少ないのも原因かと。 <ATL

932 名前:デフォルトの名無しさん :2005/11/21(月) 19:33:33
質問なんですが、変数に値を代入する時に、例えば、
a=10,b=15;
とするのと、
a=10;b=15;
とするのとでは違いというのはでるものなのですか?


933 名前:デフォルトの名無しさん :2005/11/21(月) 19:59:31
コンパイラに聞いてください

934 名前:デフォルトの名無しさん :2005/11/21(月) 20:33:45
>>932
「副作用完了点」でぐぐってみ。上の式しか右辺値になれないし。
C++では左辺値にもなれるんだっけ。変態仕様だな。

935 名前:デフォルトの名無しさん :2005/11/22(火) 10:29:44
>>932
上は式が一つ。下は式が二つ。
実行結果に違いは無いので、下のほうが見た目に違和感が無くて好ましい。
式が一つしか書けない所では上を使うことになる。

936 名前:デフォルトの名無しさん :2005/11/22(火) 10:55:48
basic_ostream に、バイナリデータを書き込みたい場合、

// n は出力する文字数
basic_ostream::write(const char_type *s, streamsize n);

を利用して出力すると思うのですが、basic_ostream< char > ならば、
n == 出力するバイト数になるので問題は無いのですが、
basic_ostream< wchar_t > の場合、sizeof(wchar_t) >= 1 のため、
バイナリデータをキッチリ出力するのは難しいような気もします。

basic_ostream< wchar_t > にバイナリデータをキッチリ出力する
上手い方法はないでしょうか。





937 名前:デフォルトの名無しさん :2005/11/22(火) 10:58:09
ない。

938 名前:932 :2005/11/22(火) 15:46:08
>>934>>935
ありがとうございました。

939 名前:デフォルトの名無しさん :2005/11/24(木) 19:42:04
Hoge::Hoge() //コンストラクタ
: m_var(0)
{ ... }

というメンバの初期化法を知ったのですが、これは

Hoge::Hoge()
{ m_var = 0; ... }

と同じことなのでしょうか?

940 名前:デフォルトの名無しさん :2005/11/24(木) 19:45:00
>>939
前者は初期化、後者は代入

941 名前:デフォルトの名無しさん :2005/11/24(木) 19:50:38
>>940
ありがとうございます
皆さんよく使われる方法なのでしょうか?
今まで私はコンストラクタ内にずらずらと代入してきましたが…

942 名前:デフォルトの名無しさん :2005/11/24(木) 19:54:37
可能な限り使うよ

943 名前:デフォルトの名無しさん :2005/11/24(木) 19:59:16
そうですか、参考になりました

944 名前:デフォルトの名無しさん :2005/11/24(木) 20:15:50
>>939
constオブジェクトとか、オブジェクトのリファレンスは前者の初期化法しか
使えんよ。というか初期化忘れのコンパイルエラーが出る。

945 名前:デフォルトの名無しさん :2005/11/25(金) 16:59:41
>>939
初期化と代入の違いは大丈夫かい?
int i = 0;

int j;
j = 0;
は別物。可能な限り前者を使う。

946 名前:デフォルトの名無しさん :2005/11/25(金) 17:18:06
初期化って必ずしないといけないものでしょうか。
特に自動変数の時。

947 名前:デフォルトの名無しさん :2005/11/25(金) 17:25:03
>>946
かならず値を代入することが分かっていて、かつ最初の代入が
行われるより前に参照されることはないと分かっているのなら
しなくてもいい

948 名前:デフォルトの名無しさん :2005/11/25(金) 19:47:27
定義と同時に初期化を済ませるのがC++の流儀。
初期化しない自動変数はバグの温床。

949 名前:デフォルトの名無しさん :2005/11/25(金) 19:51:29
時と場合によるが「初期化は必ずしないといけない」で
全ておkなんでクセ付けときな。


950 名前:デフォルトの名無しさん :2005/11/25(金) 20:02:39
for(;;){
  int val;

  // valを使った処理・・・
}

と、

int val;
for(;;){
  // valを使った処理・・・
}

って、やっぱ後者のが早淫すか?
それともおんなじ?


951 名前:デフォルトの名無しさん :2005/11/25(金) 20:13:32
>>950
意味が違う。
後者がブロックの外でvalを使わないなら一般的には、全く同じコードを吐くと思われる。
#つーか、何で後者の方が速いと思うんだ? 最適化が蛸なら寧ろ前者の方が速くなることが期待できるぞ。

952 名前:デフォルトの名無しさん :2005/11/25(金) 20:13:33
>>950
初期化しない int なら同じ可能性がまあまあ高い。もちろんコンパイラ依存だけど。

953 名前:デフォルトの名無しさん :2005/11/25(金) 21:58:02
>>950とはちがうけど、
STL等の走査で、iterator の終端の判定用にインスタンス別に作ったほうが早いのかな?

1.
for(list<int>::iterator it = hoge.begin(); it != hoge.end(); ++it);
2.
list<int>::iterator end = hoge.end();
for(list<int>::iterator it = hoge.begin(); it != end; ++it);

前者のほうがソースとしては楽&見た目すっきりだけどどうなんでしょ?

954 名前:デフォルトの名無しさん :2005/11/25(金) 22:14:59
endが無効化したらどうするんだこのスカタン

955 名前:デフォルトの名無しさん :2005/11/25(金) 22:22:40
いや、もちろんそういったものがないって前提で

956 名前:デフォルトの名無しさん :2005/11/25(金) 22:41:44
早いに決まってんだろこのド低脳が

957 名前:デフォルトの名無しさん :2005/11/25(金) 22:55:40
決まってはいないよ。質問は「STL等」についてだし、処理系も指定していないからね。

958 名前:デフォルトの名無しさん :2005/11/25(金) 22:56:21
>>956
不満事を書いた瓦を頭で割ってるCMの、
ナレーターの台詞を思い出した

959 名前:デフォルトの名無しさん :2005/11/25(金) 22:59:50
相当要素数が多くないと有意差は出ないよ.
実用的にはよほど効率を切り詰めたい部分でもなければ,毎回 end 呼んで構わないと思うけど.

960 名前:デフォルトの名無しさん :2005/11/25(金) 23:15:32
>for(list<int>::iterator it = hoge.begin(); it != hoge.end(); ++it);
この例だと、実質同じコードになる希ガス。

961 名前:デフォルトの名無しさん :2005/11/25(金) 23:34:53
>>960
試したのか? 俺の環境では g++, cl, bcc32 のどのコンパイラでも異なるコードを生成したぞ?

962 名前:デフォルトの名無しさん :2005/11/26(土) 00:26:28
Metrowerks CodeWarrior for Windows v8.3では全く同じコード。

963 名前:デフォルトの名無しさん :2005/11/26(土) 02:35:46
C++もそろそろネタ切れだな

964 名前:デフォルトの名無しさん :2005/11/26(土) 02:44:06
>>963
お前にとってはな。ということでさようなら。

965 名前:デフォルトの名無しさん :2005/11/26(土) 03:01:37
話は戻るけどswitch文の一部でしか使わない、しかも複数の箇所で使う変数はどうしてるの?
switch(c){
case 0: int i = 0 ;return i;
case 1: int i = 1; return i;
case 2: return 2;
}
面倒だからいい加減なサンプルだけどこれだとコンパイルエラーになる。
iをswitchの外側で定義すると初期化できないし。
case文の所を{}で囲めばいいんだけど正直見た目が悪いような。

966 名前:デフォルトの名無しさん :2005/11/26(土) 09:22:19
>965
変数の使いまわしなんかするくらいなら、多少見た目は悪くとも
>case文の所を{}で囲めば
これ一択だと思いますけど。


967 名前:デフォルトの名無しさん :2005/11/26(土) 09:33:19
Windowsのメウィンドウプロシージャなんかだと、
メッセージクラッカーを使うから半強制的に各caseの中身が関数に切り出されて、
そんな心配が要らなくなる。あくまで結果的にだけどね。

968 名前:デフォルトの名無しさん :2005/11/26(土) 09:47:55
「Windows限定」の話ならスレ違い

969 名前:デフォルトの名無しさん :2005/11/26(土) 10:01:08
>967 を「スレ違い」と認識するのは、理解力が足りない。


970 名前:デフォルトの名無しさん :2005/11/26(土) 10:14:00
参照って言うのは実態はなんですか?
たとえばWindowsでSendMessageで文字列をスレッド間で引き渡す場合、
ポインタだったらサブスレッドのスタックにある文字列を指していても、
SendMessageでWPARAMやLPARAMに乗っけてメインスレッドに渡せるじゃないですか。
参照は無理ですか?


971 名前:デフォルトの名無しさん :2005/11/26(土) 10:50:10
http://dl.njfiw.gov.cn/books/C/

972 名前:デフォルトの名無しさん :2005/11/26(土) 11:05:36
これはいいのか?

973 名前:デフォルトの名無しさん :2005/11/26(土) 11:24:35
うん

974 名前:デフォルトの名無しさん :2005/11/26(土) 11:25:34
> 参照って言うのは実態はなんですか?

ポインタ

> 参照は無理ですか?

無理ではないがどっちかに統一したほうがいい
win32apiだとかを呼びまくる場所ではポインタのほうがいい
抽象化が十分になされた、アプリケーションロジックが主体のレイヤでは
参照のほうがいい
混ざってるのはたいへん見苦しいしバグの温床

975 名前:デフォルトの名無しさん :2005/11/26(土) 12:24:23
C++って、以下のようなコードで例外を出してくれないのでしょうか。


struct test *p = NULL;
int val;

try{
val = p->member;
}
catch(...){
std::cout << "例外をキャッチ" << std::endl;
}

またtryのなかを
val = 100/0;
とかに変更してみても、例外を投げずにアプリケーションエラーとなりました。
そういうものなんでしょうか?

WinXPでmingwを使用しています。


976 名前:デフォルトの名無しさん :2005/11/26(土) 12:26:57
>>975
そういうものです。

977 名前:デフォルトの名無しさん :2005/11/26(土) 12:44:24
>>975
自分で例外投げれ

978 名前:デフォルトの名無しさん :2005/11/26(土) 12:48:42
catch(...)でWIN32構造化例外が取れるかどうかはコンパイラ依存

979 名前:デフォルトの名無しさん :2005/11/26(土) 13:06:38
関数example1からexample2にmultimapのtestMapを引き渡したいのですが
どうしたらうまくいくでしょうか?
以下のような感じなのですが

void example1 (){
MMAP testMap;
testMap.insert(Mvalue([配列]));
}

void example2(MMAP map){
for(MMAP::iterator i=testMap.begin(),end=testMap.end(); i!=end; i++){
cout << *i << endl;
}
}

980 名前:デフォルトの名無しさん :2005/11/26(土) 13:11:21
>>979
const参照で渡せば?

981 名前:デフォルトの名無しさん :2005/11/26(土) 13:24:00
>>975
Windowsには構造化処理例外(SEH)というのがある。
SEHではヌルポインタへのアクセスも例外となる。(その名称がNullPointerExceptionでないのが残念)
Winodws用のC++コンパイラは大抵C++例外の実装にこいつを使っているので、
そういう風にヌルポインタアクセスはcatchできる。

982 名前:デフォルトの名無しさん :2005/11/26(土) 13:56:50
>>974
サンキュ

983 名前:デフォルトの名無しさん :2005/11/26(土) 14:05:40
すみません。もうひとつ。
参照とポインタが実態としては同じと言うことは
どうにかコンパイラを騙せばポインタを渡す関数に参照を渡しても、その逆をやっても動きますか?


984 名前:デフォルトの名無しさん :2005/11/26(土) 14:11:46
>>980
具体的にはどのようにしたらよいのでしょうか?

985 名前:デフォルトの名無しさん :2005/11/26(土) 14:12:01
そんなことするくらいなら、Javaなりドトネトなりに行けよwwwww

986 名前:975 :2005/11/26(土) 14:12:06
ありがとうございます。

VC8 Expressのコンパイラで__tryと__exceptを使用してみると、確かにキャッチできました。
C++が勝手に投げてくれるのは、標準例外
http://www.02.246.ne.jp/~torutk/cxx/exception/stdexceptions.html
にあるものだけ、という認識でよいのでしょうか。
しかし、newで失敗してもbad_allocを投げないコンパイラがあったり(VCのことだと
思うのですが)するようですので、C++における標準例外の
位置づけがいまいちわかりません…


以下本題とは逸れるのですが。
書籍「.NET&Windowsプログラマのためのデバッグテクニック徹底解説」の記述によると
> catch(...)はC++例外を補足するだけでなく、SEH例外も捕捉することになっているのです
ということでした。
VC6+MFCのプログラムで、NULL参照をcatchしていたのを見て、てっきり
C++の機能で面倒見てくれているのだと思っていました。
# ただ、VC8で>>975を走らせても、やっぱり例外を捕捉してくれない…
# 記憶違い?


987 名前:デフォルトの名無しさん :2005/11/26(土) 14:12:31
>>985>>983へのレスね。

988 名前:デフォルトの名無しさん :2005/11/26(土) 14:14:35
>>986
newがNULLを返すか例外を投げるかは規定されてなかった希ガス
この2通りの内どちらかになるのは規定されてるが、どっちかはシラネ

989 名前:デフォルトの名無しさん :2005/11/26(土) 14:16:54
>>986
newが失敗してbad_allocを投げないのは規格違反。
VC7以降ならちゃんと投げるはず。

990 名前:デフォルトの名無しさん :2005/11/26(土) 14:58:19
>>986
規格上C++のcatchで受け取れるのは下に書いたのとあとはthrowされたもの。
bad_cast(dynamic_castで参照型のキャストに失敗したとき)
bad_typeid(動的なtypeidでヌルポインタが渡されたとき)
bad_exception(例外指定に合わない型の例外を投げようとしたとき)


991 名前:デフォルトの名無しさん :2005/11/26(土) 19:33:02
>>953
>前者のほうがソースとしては楽&見た目すっきりだけどどうなんでしょ?
for(list<int>::iterator it = hoge.begin(), end = hoge.end (); it != end; ++it);
とか


992 名前:デフォルトの名無しさん :2005/11/26(土) 19:55:40
次スレ立てられなかった。誰かよろしこ。

993 名前:(*^ー゚)b グッジョブ!! :2005/11/26(土) 21:21:10
ハイ。
http://pc8.2ch.net/test/read.cgi/tech/1133007604/

994 名前:デフォルトの名無しさん :2005/11/26(土) 21:27:41
// ちょっとここをお借りしますよ。

class CTest1;
class CTest2;

class CTest1
{
public:
CTest2 *pCTest2;
};
class CTest2
{
public:
CTest1 *pCTest1;
};

995 名前:v(^・^)v :2005/11/26(土) 21:42:14
>>993
テンプレ補完終了

996 名前:デフォルトの名無しさん :2005/11/26(土) 22:27:19
>>993


997 名前:デフォルトの名無しさん :2005/11/26(土) 23:08:41
997

998 名前:デフォルトの名無しさん :2005/11/26(土) 23:53:40
998

999 名前:デフォルトの名無しさん :2005/11/26(土) 23:54:33
999

1000 名前:デフォルトの名無しさん :2005/11/26(土) 23:55:04
!!!


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