C++相談室 part69
..
654:645
09/05/31 20:04:50
>>651
忘れた。
原著第3版に書いてあった。
確か、最初の方の章に。
655:デフォルトの名無しさん
09/05/31 21:20:51
改訂2版にはどこにも書いていないんだが、
第3版には本当に書いてあるのか?
第4版まであと2年はかかりそうな気がするし、
第3版買ってくるか・・・
656:645
09/05/31 21:28:28
>>655
第3版には本当に書いてある。
厳密に同じコードかどうが覚えてないが、
const版をnon-const版にて呼び出してconst_castでconst属性を外す
という方式であることは本当。
俺もそんなことして良いの!?と思ったから信じられなくても無理はない。
657:645
09/05/31 21:31:01
わざわざ引っ張ってきて確かめみた。
原著第3版(日本語翻訳されているもの)で
15ページから始まる項目にある。
658:デフォルトの名無しさん
09/05/31 21:48:18
2版の21項「使えるときは、必ずconstを使おう」に
対応するんじゃないかなと思うけど、
そこではmutableをサポートしてないコンパイラのための苦肉の策として
「みっともないけど」と前置きした上でconst外しをしている。
これのことじゃないよな?
659:デフォルトの名無しさん
09/05/31 22:06:17
>>658
じゃないってば。
少しは俺を信じろ(笑)
他の人も誰か証言してくれ。
660:デフォルトの名無しさん
09/05/31 22:08:18
ようやっと見つけたが、
さっぱり読めなくて意図が分からん。
URLリンク(books.google.co.jp)
俺の英語力も落ちたな・・・
661:デフォルトの名無しさん
09/05/31 22:10:32
ああ、これって王家の血を引く者にしか読めないよ
662:デフォルトの名無しさん
09/05/31 22:10:40
>>659
すまんwww
明日買ってくる。
663:645
09/05/31 22:12:21
>>660
メンバ関数foo()のconst版とnon-const版の定義が
同じようなものになることは多々あるじゃない。
同じような定義を繰り返し書きたくない、そんなあなたにconst_cast
って言うような主旨。
const版をうまく定義することで、non-const版の定義は
それを呼び出してconst性を除去するだけ
で良くなる。
664:デフォルトの名無しさん
09/05/31 22:13:17
>>661
俺読めたw
・・・そろそろ天の啓示が来る頃だろうか。
665:デフォルトの名無しさん
09/05/31 22:14:26
>>664
もしかして、お兄様なの!
こんなところで巡り合えるなんて。。
666:デフォルトの名無しさん
09/05/31 22:16:24
おまえか
しょせん、暇をもてあました神々の遊び
667:デフォルトの名無しさん
09/05/31 22:20:04
理解した。解説thx
感覚的にconst側で非constのコードを
再利用したくなりそうなものだけど
それも理由があるのかな。
とりあえず第3版買ってくるよ。
生き別れた妹はいなかった気がするし。
668:645
09/05/31 22:23:19
>>667
俺もそう思ったが、
理由としては
const側で非constメンバ関数を呼び出すというのはダメ
ってことらしい。
たとえ実際にはオブジェクトが変更されないとしても。
まあ買ってくる価値はあるかと。
何てったって名著だし、無駄な出費ではないと思う。
669:デフォルトの名無しさん
09/05/31 22:41:23
#define UNICODE
#define _UNICODE
で定義されたソースコードがあるとします。
それを
#define UNICODE
#define _UNICODE
と定義してはエラーになってしまう、つまりANSI版のソースに混ぜて使いたい場合どの
ようにすればいいのでしょうか?
たとえば
int WINAPI WinMain(…){
…(ANSIソースコード)
sub();
}
int sub(){
#define UNICODE
#define _UNICODE
…(UNICODEソースコード)
}
みたいなことはできるでしょうか?
670:デフォルトの名無しさん
09/05/31 22:49:30
できます。
671:デフォルトの名無しさん
09/05/31 22:52:12
いまいち質問内容がよく分からんが、
#define UNICODE
#define _UNICODE
したあと
#undef UNICODE
#undef _UNICODE
すればdefineは消える。
でもWIN32なら、
UNICODE版、ANSI版両方そろってるはずだが。
672:デフォルトの名無しさん
09/05/31 23:25:45
CreateWindow("aaa",....
とかやってるんだろ
673:デフォルトの名無しさん
09/05/31 23:59:32
>>670 >>671
いやできなかった
結論からいうと
原理からいうとその方法でできるのは確かなんだが
UNICODEと_UNICODEは最初の最初で定義しておかなければならならないみたいだ
先にwindows.hとか読み込まれてるからその関係で動作がおかしくなる
>>672
アホすぎ
てか解決法をいうと単純にソースファイルをわければ解決できる
最初からやればよかったけど
674:デフォルトの名無しさん
09/06/01 00:14:01
本筋とは全く関係ないが、>>669を見ると_tWinMainにしろと言いたくなる。
675:デフォルトの名無しさん
09/06/01 01:15:41
もうこれから書くコードは全部_UNICODEでいいかもと思ってしまうがな。
676:デフォルトの名無しさん
09/06/01 04:06:41
なに、いいってことよ┏( ^ω^)┛
677:デフォルトの名無しさん
09/06/01 14:32:49
下の様な感じで合成関数を作ろうと思ったのですが、
error C2678: 二項演算子 '*' : 型 'composite_impl<result_type_,arg_type_>' の左オペランドを扱う演算子が見つかりません
とエラーが出ます。どうやって回避すればいいのでしょうか?
678:デフォルトの名無しさん
09/06/01 14:33:55
struct composite_type{};
template<typename result_type_, typename arg_type_>
struct composite_impl{
typedef result_type_ result_type; typedef arg_type_ arg_type; typedef result_type (*fn_type)(arg_type);
static fn_type &fn_holder(){ static fn_type fn; return fn; }
result_type operator ()(arg_type a) const{ return (fn_holder())(a); }
};
template<typename result_type_a_, typename result_type_b_, typename arg_type_b_>
struct composite_impl<result_type_a_, composite_impl<result_type_b_, arg_type_b_> >{
typedef result_type_a_ result_type; typedef arg_type_b_ arg_type; typedef result_type (*fn_type)(arg_type);
static fn_type &fn_holder(){ static fn_type fn; return fn; }
result_type operator ()(arg_type a) const{ return (fn_holder())(composite_impl<result_type_b, arg_type_b_>()(a)); }
};
template<typename result_type, typename arg_type>
inline composite_impl<result_type, arg_type> operator *(composite_type, result_type (*fn)(arg_type)){
composite_impl<result_type, arg_type> a; a.fn_holder() = fn; return a;
}
template<typename result_type_a, typename result_type_b, typename arg_type_b>
inline composite_impl<result_type_a, composite_impl<result_type_b, arg_type_b> > operator *(composite_impl<result_type_a, result_type_b> a, result_type_b (*fn)(arg_type_b)){
composite_impl<result_type_a, composite_impl<result_type_b, arg_type_b> > a; a.fn_holder() = fn; return a;
}
composite_type composite;
#include <iostream>
#include <cstring>
int fn_a(int a){ return a * a; }
char *fn_b(int a){ static char str[0xFF]; std::sprintf(str, "%d", a + 1); return str; }
int main(){ std::cout << (composite * fn_a * fn_b)(2) << std::endl; return 0; }
679:デフォルトの名無しさん
09/06/01 14:42:39
>>668
> const側で非constメンバ関数を呼び出すというのはダメ
> ってことらしい。
これって、単純にconstメンバ関数内で非constメンバ関数を呼び出すと
コンパイルが通らないって話。
680:デフォルトの名無しさん
09/06/01 15:00:03
>>679
const_castで*thisからconstを外すって話だよ。
681:デフォルトの名無しさん
09/06/01 15:12:45
>>680
あーそういうことね。
でも*thisのconst外しが駄目なのも当たり前の話だな。
682:デフォルトの名無しさん
09/06/01 20:59:19
*thisのconstは外してないぜ
むしろconstメンバ関数を呼ぶために*thisにconstを付けてる
外してるのは戻り値のconst
683:デフォルトの名無しさん
09/06/01 21:04:09
>>682
>>667-668
>>679-681
を読みかえしくれ。
684:デフォルトの名無しさん
09/06/01 21:13:26
???
>>645のことだろ?
static_cast<const sample&>(*this)は明らかに*thisにconstを付けてる
何か間違ってるのか
685:デフォルトの名無しさん
09/06/01 21:15:12
>>684
> >>645のことだろ?
否。
>>667-668の事。
それに対し>>679-681というやりとりが行われている。
皆は>>645は理解している。
686:デフォルトの名無しさん
09/06/01 21:18:48
なるほど理解した
687:デフォルトの名無しさん
09/06/01 22:34:32
いろいろあるよ。
URLリンク(www.sengoku.co.jp)
個人的には極細より線と鈴メッキ銅線が好きだけど (どうせ趣味だし)、
信頼性からジュンフロン線使う人のほうが多い。
このシリーズのより線はストリッパー必須。
ジュンフロンは苦手です。ええ。
688:デフォルトの名無しさん
09/06/01 22:36:18
ご、誤爆・・・
689:デフォルトの名無しさん
09/06/01 22:43:04
どんまい、
というかハードとソフト両方いけるとかうらやましい
690:デフォルトの名無しさん
09/06/01 22:45:09
>>687
全然 なんだかわからないwww
すごいな。
691:デフォルトの名無しさん
09/06/02 01:02:51
とりあえずイミフだからストリッパーってあたりに反応しとこうぜ
692:デフォルトの名無しさん
09/06/02 01:44:25
ストリッパーくらい分かるだろ
線の被覆を剥ぐための工具だろ
693:デフォルトの名無しさん
09/06/02 02:19:34
struct A{A();virtual void fun() = 0;};
struct B:A{B();fun();};
struct C{C(A&b); C problem(A&b);};
C c(B());
c.problem(B()); // no-match function になるのは何故?
C::problem(一時オブジェクト参照)を弾くならコンストラクタでも弾くべきだと思うんだけど
694:デフォルトの名無しさん
09/06/02 02:57:23
>>692
しらんがな(´・ω・`)
695:デフォルトの名無しさん
09/06/02 03:51:45
ドラクエなどで登場する戦士や魔法使いを意味するFighterクラスと Mageクラスがあったとして、
そのクラスのインスタンスが持つHPやMP,攻撃力などのステータス一覧を表示する関数を作るとき、
クラス自信にその関数を持たせるのか、あるいはクラスとは関係のない部分で作るのか、どちらがいいんでしょう?
クラス設計の考え方がまったくわかりません・・。
696:デフォルトの名無しさん
09/06/02 06:17:21
>>695
その場合はカプセル化を優先する。
まず、HPやMP,攻撃力などのステータスを格納する変数(intだったりstd::size_tだったりするだろう)のアクセス指定子がどう宣言されているかによって考えを分ける。
1.
もしprivateで宣言されていて、そのステータスをpublicなメンバ関数h_point()で取得するような仕組みにしている場合(むろんそれが望ましい)は、「クラスとは関係のない部分で作る」が正解。
つまり別の関数show_status(〜)を作り、〜の部分にキャラクタのインスタンスを渡すようにする。
2.
もしpublicで宣言されているならば、「クラス自身にその関数を持たせる」ないし「friend指定して外部関数を作る」が正解。しかしステータスを格納する変数がpublic指定されていること自体、そもそも望ましくないことだが。
697:デフォルトの名無しさん
09/06/02 06:23:39
>>693
private継承しているからだろ
698:デフォルトの名無しさん
09/06/02 08:07:42
>>693
そのコンストラクタで本当に動くか試した?
699:デフォルトの名無しさん
09/06/02 17:56:43
C c(B());
は
C c(B (*)());
という関数宣言に解釈される。
B b0;
C c(b0);
c.problem(b0);
とするとできましたが。
関数の引数のリファレンスの型にconstをつけて
"const B&b"、"const A&b"のようにすると
C c = C(B());
c.problem(B());
でもいけました。
なぜかは僕には分かりませんのでどなたか解説お願いします。
コンパイラはgcc4.2.1で確かめました。
700:デフォルトの名無しさん
09/06/02 19:02:59
const参照型のインスタンスは、呼び出す側が値渡しと同じ感覚で扱えるように、
一次オブジェクトで初期化できることになっている。
701:693
09/06/02 20:13:27
実コードはstruct Bにtemplate特殊化やらvirtualメンバやらなんやら絡んで魔窟状態で実は
C c(static_cacst<A&>(B())); に成ってますた。
>>699
C c((B())); でも逝けますね。
702:デフォルトの名無しさん
09/06/02 21:44:52
>>701
Effective STL の第1章第6項「C++の最も奇妙な解析に注意しよう」に書かれてるね。
(この本自体はSTLの解説本だけど…)
でも、すべてのコンパイラで成功するとも書かれていない・・・おそろしや。
703:デフォルトの名無しさん
09/06/03 17:16:04
#include <stdio.h>
void main(void)
{
char data[3465300]
int idata[3465300];
int KOTAE[3465300/2];
int data1[12032/2][300];
int idata1[300][300];
int i,j,id,a,b,No,day,LDAY,d;
char fnamein,fnameout;
FILE *fin,*fout;
#define LDAY 30 //月ごとに変える
//No=1→ステータス;No=2→交通量;No3=速度;No4=オキュパンシー
#define No 2
for(day=0;day<LDAY;day++){
d=day+1;
printf("%d/%d\n",d,LDAY);
sprintf(fnamein,"D:\\/torakan-Y/R_barashi/Ku0409/Ku0409%02d.dat",d);
sprintf(fnameout,"D:\\/torakan-Y/R_barashi/Ku04/Q_Ku0409%02d.txt",d);
fin = fopen(fnamein,"rb");
fread(&data,1,3465216,fin);
fclose(fin);
if((fout=fopen(fnameout,"w"))==NULL) printf("Cannot open output file\n");
704:デフォルトの名無しさん
09/06/03 17:17:18
>>703
なんだこの凶悪なのはっ!!
705:703
09/06/03 17:19:00
703のプログラムですが、コンパイルは通る一方で
出力される結果が同じ数字の繰り返しになってしまいます。
エラーの原因としては、以下の4行が怪しいと思っています。
詳しい方、よろしくお願いします。
sprintf(fnameout,"D:\\/torakan-Y/R_barashi/Ku04/Q_Ku0409%02d.txt",d);
fin = fopen(fnamein,"rb");
fread(&data,1,3465216,fin);
fclose(fin);
706:デフォルトの名無しさん
09/06/03 17:23:44
>>705
あんたが勝手に”エラー”って呼んでいるものを,具体的に書き表してごらんよ
少なくとも”出力される結果が同じ数字の繰り返し”になることは具体的に書け
707:デフォルトの名無しさん
09/06/03 17:29:33
変数宣言で嫌になるものは久しぶり…
708:デフォルトの名無しさん
09/06/03 17:32:39
スレの住人の中におエスパー様はおられませんか?
709:デフォルトの名無しさん
09/06/03 17:34:40
>>703
とりあえず変数を#defineで上書きしているのが分かった
710:703
09/06/03 17:42:02
≫>705様
レスありがとうございます。
出力されたファイルを開くと
526855268552685といった感じで同じ数列がただ繰り返されたファイルが
出力されます。
このプログラムはもともと、膨大なデータの中から
一部分を抽出するプログラムとなっています。
また、その莫大なデータにはそのような数列は見られないので
勝手にエラーと判定してしまいました。
>709様
ありがとうございます。
さっそく そこを修正したいと思います。
711:デフォルトの名無しさん
09/06/03 17:52:30
>>710
かんじんのファイルに出力している部分が・・・ねぇwwwwwwさすがにESPじゃない俺にはむり
712:703
09/06/03 17:57:36
for(i=0;i<3465216;i++){
idata[i]=int(data[i]);
if(idata[i]<0){
idata[i]=256+idata[i];
}
}
id=0;
for(i=0;i<3465216;i=i+2){
a=idata[i]/16;
b=idata[i]%16;
KOTAE[id]=a*16*16*16+b*16*16+idata[i+1];
id=id+1;
}
id=0;
for(j=0;j<288;j++){
for(i=0;i<12032/2;i++){
data1[i][j]=KOTAE[id];
id=id+1;
}
}
713:703
09/06/03 18:00:29
/*区間データの抜き出し*/
id=0;
//////6号三郷JCT‐江戸橋JCT間////////////
for(j=0;j<288;j++){
for(i=0;i<17;i++){
idata1[id][j]=data1[4*i+(8+4*501+No-1)][j];
id=id+1;
}
id=0;
}
for(j=0;j<288;j++){
for(i=0;i<2;i++){
idata1[id+17][j]=data1[4*i+(8+4*772+No-1)][j];
id=id+1;
}
id=0;
}
714:703
09/06/03 18:02:01
for(j=0;j<288;j++){
for(i=0;i<15;i++){
idata1[id+19][j]=data1[4*i+(8+4*542+No-1)][j];
id=id+1;
}
id=0;
}
for(j=0;j<288;j++){
for(i=0;i<34;i++){
fprintf(fout,"%d",idata1[i][j]);
}
fprintf(fout,"\n");
}
}
}
715:デフォルトの名無しさん
09/06/03 18:02:27
>>712
> for(j=0;j<288;j++){
> for(i=0;i<12032/2;i++){
この辺で悪意を感じた
あと,もし仮に名前を付け替えるのが許可されているなら,ぜひデータ構造と名前を変えるべきだとおもふ
716:デフォルトの名無しさん
09/06/03 18:10:48
まずマジックナンバーが多過ぎるから定数で宣言して分かりやすい名前を付けるべき
それと、
>char fnamein,fnameout;
ここはファイル名格納するバッファじゃなかろうか
717:703
09/06/03 18:11:01
>712
すいません。まったく悪意はないです。
もうしわけないです。
名前は変更できます。
718:デフォルトの名無しさん
09/06/03 18:16:08
なげぇwww
codepad
URLリンク(codepad.org)
せめてここに貼るとかさあ。。
719:デフォルトの名無しさん
09/06/03 18:19:07
そもそも何の目的で作られた何をするためのプログラムで
どうなれば成功なんだよ
そこが分からないのに何も答えられるわけがないだろ
どうせ宿題なんだろうけど
720:703
09/06/03 18:26:59
>719様
説明不足ですいません。
トラカンデータといわれる交通量や平均速度といった
情報が網羅されているデータから
一部分を抽出して、自分たちが調べたい路線の
交通量を抜き取るプログラムです。
数列が同じ数字の繰り返しにならなければ、ほぼ成功だと思います。
宿題ではないです。申し訳ないです。
>718様
さっそく、張ってみようと思います。
721:703
09/06/03 18:30:03
URLリンク(codepad.org)
さっそく貼ってみました。
722:デフォルトの名無しさん
09/06/03 18:32:15
ふむふむ
ひどすぎて目眩がしてきた
一つ言えるのは、これはCであってC++ではないということだ
だからスレ違い
723:デフォルトの名無しさん
09/06/03 18:32:56
と思ったらnew使ってるからC++かよ
なんだこれは
724:デフォルトの名無しさん
09/06/03 18:52:09
読むのに時間かかりそうだ…
725:デフォルトの名無しさん
09/06/03 19:03:32
管理番号とかファイルのパスとか
危険な香りのする文字列がたくさんあるけど大丈夫なのか
726:デフォルトの名無しさん
09/06/03 19:09:39
>>703
とりあえず
fread(&data,1,3465216,fin);
↓
fread(data,1,3465216,fin);
727:デフォルトの名無しさん
09/06/03 19:12:43
プログラムに間違いらしきものはなし。
データ解析部分でデータの構造が合致していないような感じだが?
728:703
09/06/03 19:18:54
>726様
あなたは神様です。
あなたのおかげで無事解決しました。
なんてお礼をいえばいいのかわかりません。
729:デフォルトの名無しさん
09/06/03 20:18:52
すげえうれしくない感謝の言葉だなぁ
730:デフォルトの名無しさん
09/06/03 20:22:20
You are God.
I solved the problem, thank you.
What it only has to say the reward is not understood.
731:703
09/06/03 20:27:36
と思ったら、まだ解決していませんでした。
申し訳ないです。
732:デフォルトの名無しさん
09/06/03 20:39:13
<stdexcept> と <exception> って、
どっちをインクルードするほうが望ましいの?
733:デフォルトの名無しさん
09/06/03 20:41:32
<stdexcept>で定義されている例外を使いたければ<stdexcept>
734:デフォルトの名無しさん
09/06/03 20:42:12
>>731
書き直してもいい?
要するにファイルの内容は unsigned short 型のデータが
ビッグエンディアンで 6016x288 個格納されているのを
data1 に代入すれば data も idata も KOTAE も必要ないよね
735:デフォルトの名無しさん
09/06/03 20:53:56
>>703
社内で使ってる(であろう)コードをこんなところに晒して、
ただで済むと思ってるのか?
オープンソースじゃないだろうし、上司に知られたらやばいんじゃねーの。
736:デフォルトの名無しさん
09/06/03 21:21:08
スタックオーバーフローエラーを直してくれた先輩には
もう見限られたのか?
737:デフォルトの名無しさん
09/06/03 21:58:15
>>731
なにが解決してないの?
738:デフォルトの名無しさん
09/06/03 22:40:43
ほんとプロが作るソースって
ゴミクズだよな。
どこもかわらねえなぁ。
739:デフォルトの名無しさん
09/06/03 22:48:19
え?>>703の話なら、プロのコードじゃないっしょ。
社内でコンピュータにちょっと詳しい人(事務職とかバイトのお兄ちゃんとか)に
アホ課長が「エクセルで計算するのめんどいからお前プログラム書けよ」って
仕方なくしこったんじゃない?
どうみてもCで書いたコードを、その人がやめちゃって保守要員がいなくなったので
これまたその辺のちょっとコンピュータ詳しい奴にむりくりやらせてるってところでは。
すごいエスパー。昔、エスパドリューはエスパーが身につける特別な装備だと思っていたのを思い出した。
740:デフォルトの名無しさん
09/06/03 23:49:15
ふと思ったんだが↓↓
C++では関数が返せる変数の型は1つだけである。
(その型と継承関係によってはその子クラスの型でも返せることもあるが。)
ところが、例外処理におけるthrowは関数から外へ任意の型の例外を投げることが可能である。
これをその関数の返り値(戻り値)とみなして
プログラミングをするという面白い技法が
この世に存在していてもおかしくないのではないか
と思ったのだが、誰か知っている人いない?
例外を使ったプログラミングの話をしている訳じゃ無くて
あくまでthrowによる例外を戻り値として利用するスタイルってことで。
741:デフォルトの名無しさん
09/06/03 23:55:54
テンプレートクラスを使えば戻り値の型なんて自由自在ですよ。
無茶しないでください。
742:デフォルトの名無しさん
09/06/03 23:57:22
そのアイデアに「catchされなければ呼出元へ伝播する」という例外の特徴も考慮した?
していないならboost::any返せばいいでしょという話だと思う。
743:デフォルトの名無しさん
09/06/03 23:57:35
>>740
実用してる奴がいたら絶対に近づきたくないが
ネタとしてはおもしろそうだな。
はたして意味のあるプログラムを作ることができるのか・・・
744:デフォルトの名無しさん
09/06/04 00:04:54
もしうまいことやったとしても、Schemeなんかの継続のきわめて限定的なまねごとになるのではと思う。
どういう形か想像もつかないが。
745:デフォルトの名無しさん
09/06/04 00:10:33
継続ねえ。
じゃあお題は例外でC#で言うところのyield()を作る
でどうよ。
746:デフォルトの名無しさん
09/06/04 00:17:20
_
さっそく自分で否定しちまった・・・
747:デフォルトの名無しさん
09/06/04 00:39:24
>>740のは面白いな
何か可能性を感じる
748:デフォルトの名無しさん
09/06/04 01:27:32
variantでいいじゃん
戻り値の型として使いたいものの集合がコンパイル時に決まっていないと
例外使う方法も結局何もできないわけだし
749:デフォルトの名無しさん
09/06/04 02:00:23
変態プログラミングの可能性と聞いて
750:703
09/06/04 02:02:54
>734様
先程、プログラミングを回してみた結果
無事解決しました。
727様のおっしゃるとおり
データ解析部分でデータの構造が合致してないことが
原因でした。
もし、お時間があるなら、書き直してくださったプログラムを
見せていただきたいです。
751:デフォルトの名無しさん
09/06/04 02:36:54
>>740
そういうのはイベント駆動型とかいうやつじゃないか
752:740
09/06/04 06:28:37
>>741
え?
どういうことだい?
よく分からないんだが。。。
みんなありがとう。
俺も絶対やらないと思うけど、
>そのアイデアに「catchされなければ呼出元へ伝播する」という例外の特徴も考慮した?
一応考えてる。
boost::anyやvariantは頭をよぎったが忘れることにした。
うーん、むずかしいよねぇ。
少なくとも俺はやらないけど、きっと誰かが何かすごいことを
やってくれるんじゃないかと思った。
753:デフォルトの名無しさん
09/06/04 11:11:57
やらないのかよ
754:デフォルトの名無しさん
09/06/04 11:52:00
>>752
c#でもやっていてください
とくにLINQ
755:デフォルトの名無しさん
09/06/04 14:00:53
>>752
例外のキャッチってコストかかるんでパフォーマンス劣化が激しいと思うぞ
756:デフォルトの名無しさん
09/06/04 14:02:25
アゲ
757:732
09/06/04 17:05:22
>>733
ありがとう!
758:デフォルトの名無しさん
09/06/04 17:20:46
>>740
むやみやたらにthrow使うのはgotoと大して変わらないので、
普通やらん。
やめとけ。
759:デフォルトの名無しさん
09/06/04 17:51:57
普通に関数オブジェクトでも引数として渡せばいいだけやん。
760:740
09/06/04 17:57:29
もちろん俺だって普通はやらんさ。
でもまあどこかの変態級のプログラマがうまくこれを生かして…(ry
761:デフォルトの名無しさん
09/06/04 20:32:06
試しに
#define return assert(0)
して、throw以外で関数から出るのを禁止してプログラム書いてみたらいい
何かが見えてくるかもしれんぞ
762:デフォルトの名無しさん
09/06/04 20:42:01
C++の関数を全部こう書き換える
retType func(/* ... */){
/* ... */
return foo;
}
↓
function func(/* ... */) throw(retType){
/* ... */
throw foo;
}
そして
class function{private:function();~function();};
と定義すれば、めでたく例外指向プログラミング言語の出来上がり
使うのは遠慮します
763:740
09/06/04 21:00:49
>>761-762
ありがとう。
うーん、なんとも気持ち悪い物が出来上がりそうだw
764:デフォルトの名無しさん
09/06/04 23:10:07
三値論理の関数型言語?で似たような事が出来たような?
よくわからんが
765:デフォルトの名無しさん
09/06/04 23:20:59
boost::any を使えば受け取る側は関数側から何が返ってくるか知らなくてもいいけど
例外の場合は、帰ってくる型が何であるかは知っておく必要があるよね?
間違ってるかしら・・・
766:デフォルトの名無しさん
09/06/04 23:47:52
>>765
一応catch(...)で、何でも受けれる。
受けられるだけだが。
戻り値返しにない例外の機能として、
安全な中間すっとばしがある。
funcA() -> funcB() -> funcC() -> 例外発生
↑-----------------------------」
これを使えば、非常に柔軟な逆フロー制御が実現できる。
つまり、メインルーチンを例外のcatch()ブロックに書くのだ。
これを使って何が出来るかというと、それは次の人どうぞ。
767:デフォルトの名無しさん
09/06/05 00:11:17
一方ロシアはgotoを使った。
768:デフォルトの名無しさん
09/06/05 00:16:15
anyだろうと何だろうと型を知らないと何も出来ないから、
結局そのままどっかに転送するしかないよな
throw;で同じ事が出来そうな気はする
769:デフォルトの名無しさん
09/06/05 00:19:15
VC9だと落ちるんだけどw
#include <iostream>
void fib(int n) {
if (n < 2) { throw 1; }
else {
try { fib(n-1); } catch (int r1) {
try { fib(n-2); } catch (int r2) {
throw r1 + r2;
}
}
}
}
int main() {
try { fib(20); } catch (int ret) {
std::cout << ret << std::endl;
}
return 0;
}
770:デフォルトの名無しさん
09/06/05 00:21:40
あーそうだ、多重例外は未定義だったな
標準C++の範囲で例外指向プログラミングはできないようです
771:デフォルトの名無しさん
09/06/05 00:29:57
うーん、
変態Chain Respinsibility?
void discover() {
switch (random) {
case 0:
throw Chair;
case 1:
throw Human;
case 2:
throw Orange;
case 3:
throw Truth;
}
}
void loop() {
while (1) {
Sitter(Killer(Eater(Philosopher(discover))));
}
}
どうすんだこれ・・・
772:デフォルトの名無しさん
09/06/05 00:31:46
綴りひでぇorz
773:デフォルトの名無しさん
09/06/05 00:45:36
いいかんじに変態的だな
774:デフォルトの名無しさん
09/06/05 02:23:18
>768
visitorで何とかする手はあるよ。
URLリンク(www.boostpro.com)
775:デフォルトの名無しさん
09/06/05 05:26:42
多重例外って何ですか?
アクティブな例外が2つ以上同時に発生することですか?
それともtry・catchブロックの中にtry・catchブロックがあることですか?
776:デフォルトの名無しさん
09/06/05 09:32:40
例外ハンドラで例外が出ること
777:デフォルトの名無しさん
09/06/05 11:12:55
テンプレートクラスで自身を返す場合、書き方としてどっちが正しいのでしょうか。
1も正しいなら今後1で書こうと思ってます。
template<class T> class X
{
public:
X &Func() // 1
X<T> &Func() // 2
{
return *this;
}
}
778:デフォルトの名無しさん
09/06/05 11:33:33
C++を1から学習しようかと思うのですが、参考書は何がおすすめでしょうか?
visual C++を使おうかと思っているのですが。
分厚くてもよいので、一冊で応用まで深く学習出来るのはありませんかね?
779:デフォルトの名無しさん
09/06/05 11:52:54
>>777
2、テンプレート引数を省略しないといけないのはコンストラクタだけ
780:デフォルトの名無しさん
09/06/05 12:03:14
>>778
禿本を買っておけば間違いは無い
781:デフォルトの名無しさん
09/06/05 13:44:02
>>780
禿本とは何ですか?
782:デフォルトの名無しさん
09/06/05 13:53:12
softbank
783:デフォルトの名無しさん
09/06/05 13:54:12
そういう時に真っ先に「C++ 禿本」で検索しない精神がよくわからん。
784:デフォルトの名無しさん
09/06/05 14:47:44
検索したのですが、出てきませんでした。
ていうより、59件ヒットしてその全てがただ禿本とC++を含んでるやつのみで
何の略かも書いてありませんでした。
その本の正式名称がわかりません。
すいませんが、本の正式名称で書いていただけませんか?
785:デフォルトの名無しさん
09/06/05 15:01:04
C++ 禿
でぐぐったら一番上におっさんの名前出てきたわw
786:780
09/06/05 15:04:39
確かにC++ってググるときに引用符を付けないと駄目なんだよな。
正式名称はThe C Programming Language(邦訳はプログラミング言語C++)
著者はC++の設計者である禿ことBjarne Stroustrupだ。
URLリンク(www.research.att.com) に写真があるからよく拝んでおくように。
日本語訳については色々言われているみたいだが、俺は原著しか使ったことが
ないので分からん。英語に問題ないなら原著をすすめておく。
787:デフォルトの名無しさん
09/06/05 15:07:13
一番、二番目に出てくるならまだしもそれ以外でググレとか言う奴の精神が分からん。
素直に教えて感謝されればいいのに
788:デフォルトの名無しさん
09/06/05 15:12:09
>>786
禿本とはそういう意味だったのですか。
教えてくださってどうもありがとうございました。参考にします。
789:デフォルトの名無しさん
09/06/05 15:37:25
確かに"禿本"だけであとググれってのはちょっとひどいなw
英語に問題ないならTC++PL(禿本)よりも先にProgrammingを読んだほうがいいかも
同じようなこと書いてあるけどProgrammingのほうが分かりやすい
TC++PLにしか書いてないこともあるからどのみちTC++PLは読むんだけどね
790:デフォルトの名無しさん
09/06/05 15:39:18
途中で送信しちまった…
TC++PL(禿本): URLリンク(www.research.att.com)
Programming: URLリンク(www.research.att.com)
791:780
09/06/05 15:42:31
>>876
自己レススマソ。原著名間違えた。K&Rじゃないっての。
>>787
まあ2chだから仕方ないね。
禿本ってこのスレでは良く知られてると思ってたけど、意外とそうでもないのかな。
792:777
09/06/05 15:44:42
>>779
ありがとう。コンパイル通るからいいのかと思ったけど
やっぱり基本的には全部書かないとだめなのね。
793:デフォルトの名無しさん
09/06/05 15:45:04
禿本と書いてても意味がわからんからスルーしてた
スルーで正解だった
794:デフォルトの名無しさん
09/06/05 16:20:14
>>787
> 一番、二番目に出てくるならまだしも
Googleを使わせるか否かを考えるのに「一番、二番目に出て来るかどうか」を基準にする、
怠惰な人間をつけあがらせる使命でもあるかのような考え方は理解不能だし、
悪いけど二番目の結果(環境依存OKスレの2スレ目)にこういう文章が出て来るぞ。
> 「プログラミング言語C++」は禿本と呼ぶ。
あ、"C++"と"禿本"をダブルクォーテーションで括る発想に至らないバカは考慮してないけど。
795:デフォルトの名無しさん
09/06/05 16:27:12
質問です。どうしてこのスレには捻くれた奴が湧くんですか?
796:デフォルトの名無しさん
09/06/05 16:30:53
たとえばどのレスのことなのか例を挙げてくれないと、
本当にそういう傾向があるのか、自分のバカさを指摘されたバカが
必死にそう見ようとしてるだけなのか判断つかず、回答できないです。
797:デフォルトの名無しさん
09/06/05 19:26:31
>>792
2でもいいんだけどね。テンプレートパラメータは
宣言された範囲(テンプレートのスコープ)内では省略していいことになっている。
クラス定義の冒頭で template が宣言されていて、その範囲内に入っているので、
この場合のメンバ関数宣言のテンプレートパラメータは省略できる。
(Accelerated C++ p.197などを参照)
template < class T > class foo {
template < class T > foo &bar( foo<T> &t );
};
のような紛らわしい宣言も可能な様子。
798:デフォルトの名無しさん
09/06/05 19:26:34
>>795
捻くれものは大抵、過去に何らかの形で虐げられた経験がある
あとはわかるな?
799:デフォルトの名無しさん
09/06/05 19:29:36
>795
C++自体が捻れた言語だからです。
800:デフォルトの名無しさん
09/06/06 15:12:48
>>797
全然別人なんだけど割り込んで聞いて良い?
template < class T > class foo {
template < class T > foo &bar( foo<T> &t );
};
ってのは要するに
template < class T > class foo {
template < class U > foo<T> &bar( foo<U> &t );
};
ってことだよね?
801:デフォルトの名無しさん
09/06/06 20:23:43
>>798
わかります。
現実の現在で叩きのめされたので、架空の過去を夢想して脳内逆襲ですね?
802:デフォルトの名無しさん
09/06/06 20:26:59
>>800
最初の方はgcc 4.2.1ではエラーになった。
803:デフォルトの名無しさん
09/06/06 21:46:37
(・3・) エェー。ぼじゅあるくっぷぷ(Visual C++)では問題なしだYO
>>800
Yes。
804:デフォルトの名無しさん
09/06/06 22:04:24
以下の変態プログラムでテンプレートパラメータの挙動についてご確認ください
#include <iostream>
using namespace std;
template < class T > class foo {
public:
foo() : x( 0 ) {};
foo( foo *p ) : x( p ) {};
template < class T > foo &bar( foo<T> &t ){
cout << t.member << endl;
return *x;
}
T member;
foo *x;
};
int main() {
foo< int > base;
base.member = 1000;
foo< int > i(&base);
foo< char > c;
i.member = 1;
c.member = 'a';
foo< int > r = i.bar( c );
cout << r.member << endl;
}
805:デフォルトの名無しさん
09/06/07 05:02:33
危うく騙されそうになったが
return *xだから挙動自体は普通だな
806:デフォルトの名無しさん
09/06/07 05:28:11
r.memberが初期化されない…と思ったがコピーコンストラクタじゃないのか。
807:デフォルトの名無しさん
09/06/07 12:07:05
>>804
読むだけで疲労した。
barメンバ関数が何をやりたいのか意図が分からない
(練習プログラムだから仕方ないことだが。)
のに理解をじゃまされた。
分かって良かった。
808:デフォルトの名無しさん
09/06/07 12:38:25
>>807
>>797の再現じゃないの?
809:807
09/06/07 12:56:34
>>808
ああそうなのか、ここのところこのスレ見てなかったから
全然流れを読んでなかったわ。
810:デフォルトの名無しさん
09/06/07 13:58:30
下のように、クラスAAのインスタンスを、メモリーに割り当てたときに。
コンストラクタとデストラクタをどうやって起動したらいいのでしょ?
class AA { int i1,i2; AA(); ~AA(); }
void func()
{
char dat[100];
AA *dat;
dat = (AA *)dat;
}
811:デフォルトの名無しさん
09/06/07 14:02:17
コンストラクタ
new(dat) AA();
デストラクタ
dat->~AA();
812:デフォルトの名無しさん
09/06/07 14:11:53
AA * dat = new AA[100];
delete[] dat;
813:デフォルトの名無しさん
09/06/07 14:38:59
上の例、バッファーとポインターが同じでした、ミスすみません
>>881 下記のようにうにエラーになります >>812 100個のインスタンスを作るわけではないです
class AA
{
int a1,a2;
public:
AA() { printf("AA コンストラクタ\n"); }
~AA() { printf("AA デストラクタ\n"); }
};
int _tmain(int argc, _TCHAR* argv[])
{
char buf[100];
AA *datp;
datp = (AA *)buf;
new(datp) AA(); // ここがエラーになる…
datp->~AA();
return 0;
}
エラー 1 error C2660: 'operator new' : 関数に 2 個の引数を指定できません。
814:デフォルトの名無しさん
09/06/07 14:39:55
#include <new> が抜けてるだろ
815:デフォルトの名無しさん
09/06/07 14:41:49
URLリンク(atnd.org)
URLリンク(124.45.27.25:12086)
IRCNET #CRYBUTSU
816:デフォルトの名無しさん
09/06/07 14:55:53
>>814 できました、ありがとうございます。
817:デフォルトの名無しさん
09/06/07 15:12:11
ローカル変数に対するplacement newって、アラインメントを気にする必要がなかったっけ?
818:デフォルトの名無しさん
09/06/07 15:16:19
気にする必要があると思います。
実際のプログラムは、sizeof で確認をしています
819:デフォルトの名無しさん
09/06/07 16:27:09
std::vector のようなコンテナを作ろうと思うんだが、
要件について詳しくまとまってるページない?
820:デフォルトの名無しさん
09/06/07 16:49:49
規格を読め
821:デフォルトの名無しさん
09/06/07 16:55:54
別にinterfaceクラスを継承してるわけでもないし、
要件なんて無いぞ。
822:デフォルトの名無しさん
09/06/07 17:05:30
要するに value_type なんかの必須 typedef や
領域確保時の用件とかを知りたいんじゃろ?
領域確保に new を使っちゃらめとか、
知らないとはまる部分もあるしー。
823:デフォルトの名無しさん
09/06/07 17:09:05
>>819
URLリンク(www.open-std.org)
の23.2.6をしっかり読むこと。
SGIのドキュメントはまとまっていて良かったんだが、最新の仕様と乖離してるのかな。
URLリンク(www.sgi.com)
>>821
馬鹿か?
824:デフォルトの名無しさん
09/06/07 17:17:18
>>820-823
トンクス
825:デフォルトの名無しさん
09/06/07 17:21:58
>>821
ちょwww
826:デフォルトの名無しさん
09/06/07 19:02:35
>>769-770
>>775-776
このレスで出てきている多重例外「例外ハンドラで例外が出ること」についてですが、
try
{foo();}//適当な例外を投げる関数
catch(const std::exception& ex)
{throw 42;}//ここが多重例外
ってことですよね?
では
try
{foo();}//適当な例外を投げる関数
catch(const std::exception& ex)
{throw ex;}//ここは?
この様に例外を再送する場合も多重例外となり未定義の動作ですか?
また、再送する場合{throw;}と書いても未定義になりますか?
827:デフォルトの名無しさん
09/06/07 19:33:06
>>826
>770や>776は何か勘違いしているような・・・。
例外ハンドラ(catch節)で例外を投げるのは正当。
多重例外というのはもっと異常な事態で、
例外によるスタックの巻戻し中にデストラクタがさらに例外を投げたとか、
値渡しのcatchへ例外をコピー中にコピーコンストラクタが例外を投げたとかのことを言い、
そういう時でも未定義ではなく、terminate()が呼ばれるんじゃなかったっけ?
828:==775==826
09/06/07 20:20:29
とりあえず例外の再送出は問題ないと分かれば当面は解決です。ありがとうございます。
>>827
>例外によるスタックの巻戻し中にデストラクタがさらに例外を投げた
は、
私(>>775)の言う
>アクティブな例外が2つ以上同時に発生すること
ってヤツですよね。
この場合は未定義だとEffective C++で紹介されています。
しかし
デストラクタからの例外送出::実装技術
URLリンク(cppemb.blog17.fc2.com)
ここによると
>デストラクタから例外を送出するクラスAのオブジェクトを自動記憶域で宣言し、
>その生存期間内で他の例外が発生した場合、A::~A()が呼び出されて、
>その中でまた例外が送出されます。これは二重例外と呼ばれ、
>問答無用でstd::teminateが呼び出されます。
>次に、デストラクタから例外を送出するかもしれないオブジェクトを
>静的記憶域期間で宣言した場合を考えてみてください。
>静的記憶域のオブジェクトを監視ブロック(try〜catchの制御文)で囲む構文を
>記述することはできません。すなわち、こちらはデストラクタから例外が発生した
>時点で(std::terminateの呼び出しではなく)未定義の動作になります。
と書いてありますが、果たして何がどうなんでしょうね。
829:デフォルトの名無しさん
09/06/07 21:16:02
catch節で例外を受けた場合、受け取った例外を再送するか、
受け取った例外を破棄して別の例外を送出するしかなくて、
結局、伝播する例外は1つだけになるので問題ない。
それ以外で例外伝播中に他の例外が発生すると、
2つの例外を伝播させなければならなくなるけど、
それはできないことになってて、かわりにstd::terminate()が呼ばれる。
830:828
09/06/07 22:14:01
>>829
・・・としますと
Effective C++の未定義だという記述の方が誤りで、
デストラクタからの例外送出::実装技術
URLリンク(cppemb.blog17.fc2.com)
の方が正しいと言うことでしょうか?
831:デフォルトの名無しさん
09/06/08 03:03:48
多重例外が未定義動作だなんてどこに書いてあった?
832:デフォルトの名無しさん
09/06/08 05:20:46
デストラクタで例外を投げてもちゃんと動作は定義されている
意味のある(まともな)動作をさせるのが困難というだけ
833:828
09/06/08 06:59:07
>>831
Effective C++ 原著第3版
p39末行
〜p40頭の数行
にかけて、はっきりと未定義と書かれています。
>>832
それもEffective C++で上と同じ節に書いてあります。
834:デフォルトの名無しさん
09/06/08 08:03:12
>>830
静的記憶域期間を持つオブジェクトがデストラクタで例外送出したらterminateじゃなかったっけ
と思ったら「staticでnon-local」はterminateらしい
「staticでlocal」は記述が見当たらねぇ…
835:828
09/06/08 16:14:44
そしてまあ困ったことに、たしかVC2008とかの有名どころですら
複雑な例外処理の仕様は、正確には実装されていないと聞いたことがあります。
結局は多重例外になるという状況を作らないように気をつけていくしかないのでしょうかね。
836:デフォルトの名無しさん
09/06/08 21:14:03
>>833
そこは仕様書を持ち出すべきだろ。
837:828
09/06/08 21:15:40
>>836
私は仕様書を持ってないんですよ。
趣味グラマなもんでして。
838:デフォルトの名無しさん
09/06/08 21:22:44
例外処理の実装を詳しく説明している書籍は何がありますか?
839:デフォルトの名無しさん
09/06/08 21:26:27
more exceptional C++
840:デフォルトの名無しさん
09/06/08 21:55:50
>>837
興味があるならタダで見られる、日本語で。
URLリンク(www.jisc.go.jp)から規格番号X3014。
841:837
09/06/08 21:58:59
>>840
ありがとうございます。
なんとかDLしたいものですが、ガードされているようですね。
必要に応じてWEBで見るようにします。
842:デフォルトの名無しさん
09/06/08 23:40:41
FDISでよければこことか
URLリンク(www.kuzbass.ru)
15.5.1に
>when the exception handling mechanism,
>after completing evaluation of the expression to be thrown but before the exception is caught,
>calls a user function that exits via an uncaught exception,
>...
>In such cases, void terminate(); is called.
とあるから、terminate()が呼ばれるのは間違いないと思うのだが、
Effective C++には確かに未定義っぽいことが書いてあるし…
英語版でもそうなのかなあ
843:デフォルトの名無しさん
09/06/09 00:25:07
しかし、デストラクタで例外なげるようなプログラムなんて書く訳無いし、あんまり気にしすぎても仕方ないよ。
いえ、ごめんなさい。
844:デフォルトの名無しさん
09/06/09 20:20:17
関数テンプレートがインスタンスを指定することによって実体化できるのに対し、
クラステンプレートは型名を指定しないと実体化できないところに不便さを感じます(boost::rangeとか特に)。
何かいい方法はないですかね?
845:デフォルトの名無しさん
09/06/09 20:26:59
そのためのtypedefだろ?
846:デフォルトの名無しさん
09/06/09 20:27:22
クラステンプレートは、型を引数に取って型を返す関数
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5017日前に更新/243 KB
担当:undef