C++相談室 part59
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん
2007/10/20(土) 16:45:05ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
0002デフォルトの名無しさん
2007/10/20(土) 16:54:28テンプレも無いし
現行スレ
http://pc11.2ch.net/test/read.cgi/tech/1190745673/
0003デフォルトの名無しさん
2007/10/20(土) 16:56:41[C++ FAQ]
http://www.parashift.com/c++-faq-lite/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
Cとその仕様を比較しながらの解説なので分かりやすい。
***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
http://www.cppreference.com/ (英語)
http://www.cppll.jp/cppreference/ (↑の日本語訳だけど最新は反映しない)
[禿 Stroustrup]
http://public.research.att.com/~bs/
[C++ International Standard]
http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=38110
[JTC1/SC22/WG21 - C++]
http://www.open-std.org/jtc1/sc22/wg21/
ここから規格の最新(2003より新しい)ドラフトがダウンロードできる。
[JIS X3014]
http://www.jisc.go.jp/app/pager?&RKKNP_vJISJISNO=X3014
ISO規格の日本語訳。JIS X 3014:2003はISO/IEC 14882:2003 (E)に対応。
0004デフォルトの名無しさん
2007/10/20(土) 16:57:48Effective 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/
0005デフォルトの名無しさん
2007/10/20(土) 16:58:31[Boost]
Boost http://www.boost.org/
(日本語) http://www.kmonos.net/alang/boost/
(日本語) http://shinh.skr.jp/boost/
[標準ライブラリ]
SGI-STL http://www.sgi.com/tech/stl/
STLport http://stlport.sourceforge.net/
GNU libstdc++ http://gcc.gnu.org/libstdc++/
Apache STDCXX http://incubator.apache.org/stdcxx/
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://sourceforge.net/projects/loki-lib/
LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport
0006デフォルトの名無しさん
2007/10/20(土) 17:25:01環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後死ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
0007デフォルトの名無しさん
2007/10/20(土) 17:31:260008デフォルトの名無しさん
2007/10/20(土) 17:32:43どう見てもスレ立て荒らしでしょ
0009デフォルトの名無しさん
2007/10/20(土) 17:41:24削除依頼出しとけよ
0010デフォルトの名無しさん
2007/10/20(土) 18:27:101.まず半角入力に切り替える
2.Wキーを押しっぱなしにする
3.Wキを押しっぱなしにしながらsageのチェックするところをおもむろにクリック
0011デフォルトの名無しさん
2007/10/20(土) 18:59:370012デフォルトの名無しさん
2007/10/20(土) 19:08:33きっと
vector<int>;
vector<char>;
vector<string>
とかコンテナクラスの乱立になっているんだろうなぁきっと…
コンパイラオプションは弄ってないでしょうなきっと…。
0013デフォルトの名無しさん
2007/10/20(土) 20:41:290015デフォルトの名無しさん
2007/10/25(木) 18:05:45重いから bool :1 って定義してるけど、32ビットも保持する意味あるの?
0016デフォルトの名無しさん
2007/10/25(木) 19:30:081ビットで足りるとでも?
0017デフォルトの名無しさん
2007/10/25(木) 22:09:510018デフォルトの名無しさん
2007/10/26(金) 00:45:320019デフォルトの名無しさん
2007/10/27(土) 16:43:090020デフォルトの名無しさん
2007/11/08(木) 23:03:050021デフォルトの名無しさん
2007/11/08(木) 23:47:490022デフォルトの名無しさん
2007/11/09(金) 04:06:190023デフォルトの名無しさん
2007/11/17(土) 22:55:410024デフォルトの名無しさん
2007/11/19(月) 19:55:18英語のサイトに詳しく書いてあるぽいのですが英語読めないorz
0025デフォルトの名無しさん
2007/11/19(月) 23:40:47具体的には型の特徴をメンバとして持つクラステンプレート
policyも英語の意味のまま、方針
具体的には型の機能の一部をテンプレート引数としてMix-Inできるように書かれた型
conceptは型の型、つまりメタ型
C++0xではHaskellのclassに近いものになる
002625
2007/11/19(月) 23:52:40ああ、テンプレートである必要はないか
0027デフォルトの名無しさん
2007/11/23(金) 21:01:22クラスA、B、Cがあって、
class A {
...
C c;
};
class B {
...
C c;
};
みたいな感じにした際、Aクラスを介してアクセスするcの色々と
Bからアクセスするcは同じもの? 違うもの?
自分でも言ってる意味がわからないのだが、これは
A用に使うCのオブジェクトが生成されて、
B用にもCのオブジェクトがみたいなものが生成されて
別物をアクセスしてるんじゃないかなって。
実際はどうなんでしょうか?
0028デフォルトの名無しさん
2007/11/23(金) 21:08:24A a2;
このとき a1.c と a2.c は別インスタンスだよな、それはOK?
0029デフォルトの名無しさん
2007/11/23(金) 21:08:360030デフォルトの名無しさん
2007/11/23(金) 22:26:26>27のclassをstructに置き換えても理解できない?
0031デフォルトの名無しさん
2007/11/23(金) 22:31:03>>30の言うとおり、structみたいなのを考えると当たり前ですね。
失礼しました
あと、staticを付けた変数は共有できるんですね。 頑張ります
0032デフォルトの名無しさん
2007/11/23(金) 22:31:05クラスって型のことだよ。structと同じ。
あとその型で定義したオブジェクトだけに使える関数があって
これをメソッドという。
0033デフォルトの名無しさん
2007/11/23(金) 22:35:510034デフォルトの名無しさん
2007/11/23(金) 22:41:260035デフォルトの名無しさん
2007/11/23(金) 23:53:110036デフォルトの名無しさん
2007/11/23(金) 23:59:02わかるw 俺の場合メンバ関数も、メソ・・・メンバ関数と言い直してしまう。
0037デフォルトの名無しさん
2007/11/24(土) 00:01:180038デフォルトの名無しさん
2007/11/24(土) 10:14:16A
B1 <--> B2 <--> B3 etc.
C
Bの部分の関数呼び出しの引数が固定ならなんとかなるのですが、
テンプレートパラメータとして可変長引数を扱うにはどうすればいいと思いますか?
誰か教えてください
0039デフォルトの名無しさん
2007/11/24(土) 11:01:01それか、引数を構造体にまとめて1つとして扱うとか。
004038
2007/11/24(土) 14:13:13なるべく自由につかってもらいたい
0041デフォルトの名無しさん
2007/11/24(土) 14:23:01なんで固定の A, C の間に挟む処理の引数が可変長になるんだ?
無理にテンプレート使おうとしてうまくいってないだけじゃね?
0042デフォルトの名無しさん
2007/11/24(土) 14:30:090043デフォルトの名無しさん
2007/11/24(土) 14:39:100044デフォルトの名無しさん
2007/11/24(土) 16:16:00ファンクタはメンバも持てるんだから追加の引数はそこに入れて渡せ。
004538
2007/11/25(日) 14:52:25AとCは自分で作るからいいとして
Bには制限をつけたくないんです
基本的にBを使うのは何もわかってないアホだと思ってください
0046デフォルトの名無しさん
2007/11/25(日) 14:56:480047デフォルトの名無しさん
2007/11/25(日) 15:03:180048デフォルトの名無しさん
2007/11/25(日) 15:04:170049デフォルトの名無しさん
2007/11/25(日) 15:10:010050デフォルトの名無しさん
2007/11/25(日) 15:27:510051デフォルトの名無しさん
2007/11/25(日) 15:48:540052デフォルトの名無しさん
2007/11/25(日) 17:15:31005338
2007/11/25(日) 20:15:13難しいとは思うけどさ…
0054デフォルトの名無しさん
2007/11/25(日) 20:22:31boost::any
std::vector
0056デフォルトの名無しさん
2007/11/25(日) 20:32:55005738
2007/11/25(日) 20:33:39理想はラムダ関数なんですけどね。
0058デフォルトの名無しさん
2007/11/25(日) 20:34:53いくつかある異なるゴールへのヒントばかりでかわいそうになってきた
0059デフォルトの名無しさん
2007/11/25(日) 20:39:100060デフォルトの名無しさん
2007/11/25(日) 20:40:290061デフォルトの名無しさん
2007/11/25(日) 20:41:270062デフォルトの名無しさん
2007/11/25(日) 20:43:45006338
2007/11/25(日) 20:45:33問題はA、B、Cと3つの処理があってBを自由に取り替えたいだけだからな
A
B1 <--> B2 <--> B3
C
みたいな感じだな
0064デフォルトの名無しさん
2007/11/25(日) 20:47:03006538
2007/11/25(日) 20:53:09わかんない人いるから
0066デフォルトの名無しさん
2007/11/25(日) 20:54:08ここで答えを待ってる間に>>38はさっさと自分で作ればいいんじゃね?
006738
2007/11/25(日) 20:58:33006838
2007/11/25(日) 21:00:25自分で作れないから聞いてるんですが…
006938
2007/11/25(日) 21:00:45お題を投下してやったらこれだ
意欲も才能もないのになんで
プログラムやろうと思ったの、きみら?
0070デフォルトの名無しさん
2007/11/25(日) 21:10:36007138
2007/11/25(日) 21:18:27いやほんとマジでお手上げなんですが…
0072デフォルトの名無しさん
2007/11/25(日) 21:22:37ってか、A, CだけじゃなくてBも【全部】自分で作ればアホに提供できるだろが。
007338
2007/11/25(日) 21:30:550074デフォルトの名無しさん
2007/11/25(日) 21:38:43どんなライブラリを提供したいのか、もそっと具体的に書ける? ロギング?
0075デフォルトの名無しさん
2007/11/25(日) 21:39:09だったら関数仕様を明確にするだけでいいんじゃね?
0076デフォルトの名無しさん
2007/11/25(日) 21:47:21Bに渡す引数は全部Xのメンバ変数にしておけ。
そうすりゃBに引数はいらない。
0077デフォルトの名無しさん
2007/11/25(日) 21:49:530078デフォルトの名無しさん
2007/11/25(日) 21:50:07/main.cxx:23: undefined reference to `Environment(double, double, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
collect2: ld はステータス 1 で終了しました
というエラーがg++で出ました。
-lmはつけてるし仮想関数でもないし、ちょっと意味がわかりません。
どこを考えればいいのか思いつく方いらっしゃいませんか?
0079デフォルトの名無しさん
2007/11/25(日) 21:52:160080デフォルトの名無しさん
2007/11/25(日) 21:55:01でもさ、理想はラムダ関数って>>57でいっているよね。
関数オブジェクトを受け取るようにしておけば、
Boost.LambdaやC++0xで導入されるかもしれないラムダ関数なども受け付けられる。
関数オブジェクトがわからなければとりあえず普通の関数を作って渡せばいい。
こんな関数オブジェクトのどこに問題がある?
0081デフォルトの名無しさん
2007/11/25(日) 21:59:46ありがとうございます!
引数を確認するときにdoubleかstringかーしか見てませんでした。
宣言のところ(自作ヘッダーファイルの中)と定義のところで
参照の&がついてるかついてないかという違いを見落としていました。
くだらんミスでごめんなさい。ありがとう!
008238
2007/11/25(日) 22:10:03アホなんです。基本的に。
今のC++の仕様では不可能ということで結論も出たのでもう寝ます。
ありがとうございました
0083デフォルトの名無しさん
2007/11/25(日) 22:13:21そういうときはこう答えないと相手にしてもらえないよ
> 言葉が悪いな。それで教えているつもりか。
> まぁヒントぐらいにはなったな。
> うむごくろう。
008480
2007/11/25(日) 22:18:30誰も、というより少なくとも俺は全員理解できるなんて言っていないぞ。
なんなら関数へのポインタを引数に取るものを多重定義しておくか。
そうしたら今度は世の中全員が関数へのポインタを理解できると思うな
とでも言ってくるんだろうな。
0085デフォルトの名無しさん
2007/11/25(日) 22:20:160086デフォルトの名無しさん
2007/11/25(日) 22:25:150087デフォルトの名無しさん
2007/11/25(日) 22:35:07同意。
もちろんチームのスキルの底上げをやり遂げられる人もいるが、
>>38にはそのつもりもないようだし、それなら程度に合わせてコードを書くべきだ。
0088デフォルトの名無しさん
2007/11/25(日) 23:07:512次元配列 d[3][3] に対するポインター (*p)[3] を作って
p=d
とやったのにcannot convertとかエラー出たんですがわかりませんか?
0089デフォルトの名無しさん
2007/11/25(日) 23:10:392次元配列だろうが何次元だろうが、関係ない。
int d[3][3];
int *p;
p = d;
0090デフォルトの名無しさん
2007/11/25(日) 23:12:36ちょwwそれコンパイルエラー
009188
2007/11/25(日) 23:14:21error: cannot convert `int[((unsigned int)((int)ObjNum))][((unsigned int)((int)DataNum))]' to `unsigned int (*)[6]' in assignment
です
どういうことでしょうか?
009238
2007/11/25(日) 23:18:350093デフォルトの名無しさん
2007/11/25(日) 23:20:19そのエラーを吐くソースはってみ?
0094デフォルトの名無しさん
2007/11/25(日) 23:21:17(*)[][]
でしょうに。
でもって
p=&d;
だろうに。
0095デフォルトの名無しさん
2007/11/25(日) 23:25:25で代入すりゃいいんじゃねーの?
009688
2007/11/25(日) 23:29:38{
(省略)
int d[ObjNum][DataNum];// ちなみに4と6です
//[]の2つはグローバルなint変数です
(省略)
for(int i=0;i<ObjNum;i++){
fp >> n[i];
for(int k=0;k<DataNum;k++){
fp >> d[i][k];
}
}
data=d;
}
ソースを分割してて main関数のあるところでグローバルとして以下を宣言
int (*data)[6];
でエラります。(91の書き込みのときのunsignedは気にしないでください)
アドバイスしていただいたものイチから試してみます!
ありがとうございます!
009788
2007/11/25(日) 23:43:510098デフォルトの名無しさん
2007/11/25(日) 23:44:45double (*p)[DataNum];
こんな感じで。
0099デフォルトの名無しさん
2007/11/25(日) 23:45:430100デフォルトの名無しさん
2007/11/25(日) 23:45:57int (*data)[DataNum];
010188
2007/11/25(日) 23:59:31そういえばコレ外部で使おうとするときには
ポインター先消えますね汗
2重に馬鹿でした。
ポインターに代入したのはファイルからロードしたデータをプログラム内
どこからでも参照できるようにしたかったからです。
じゃあ配列自身をグローバル化しろよって話ですね。。。
>100
そのとおり書いてあるはずなんですが・・
010288
2007/11/26(月) 00:08:26それが嫌で中で宣言したんです。
ポインターを作るときにも要素数が必要だってのがわかったので今となっては
意味のない代入かもしれませんが出来ないってとこがどうしても納得できません。
0103デフォルトの名無しさん
2007/11/26(月) 00:11:35std::vectorで動的配列作れる。
0104デフォルトの名無しさん
2007/11/26(月) 00:12:47>int d[ObjNum][DataNum];// ちなみに4と6です
このDataNumは定数じゃなくて動的な値? これってCの新しい規格の奴だよね。
使ったことないから詳しくは知らないが、型のサイズが動的に決まる、
つまりコンパイル時に特定できないのなら、そこから int(*)[6] へのキャストは無理でしょ。
010588
2007/11/26(月) 03:24:33うんうん唸って結局以下の様にしました。
main関数のあるソースファイルで
vector<vector<double> > *data;
Entry関数のあるソースファイルで。
vector<vector<double> > d(ObjNum, vector<double>(DataNum));
および
data=*d;
別の関数でdataを使うとき
ac = (*data)[x][y];
配列の大きさを自動判別にしたかったためこのようになりました。
103、104、およびhttp://gimite.net/bcbqtree/qtreemain.cgi?mode=thread&thread=424
とても参考になりました。
みなさまほんとにありがとうございました!
0106デフォルトの名無しさん
2007/11/26(月) 11:18:45...
delete p;
ってコードみたんだけど、pがNULLかどうかチェックしてなくてdeleteしてるの。
これってNULLをdeleteしてもOKみたいなこと規格にあるの?
規格厨ヘルプ!
0107デフォルトの名無しさん
2007/11/26(月) 11:25:53なんで問題ないでしょう
0108デフォルトの名無しさん
2007/11/26(月) 19:01:58じゃぁ結局ifでチェックするコードは無駄なんですね
0109デフォルトの名無しさん
2007/11/26(月) 20:58:260110デフォルトの名無しさん
2007/11/26(月) 21:03:40・効率が悪い
・知らないと思われるのが腹立たしい
よって、つけないのが良いと思います。
0111デフォルトの名無しさん
2007/11/26(月) 21:06:380112デフォルトの名無しさん
2007/11/26(月) 21:11:510113デフォルトの名無しさん
2007/11/26(月) 21:20:150114デフォルトの名無しさん
2007/11/26(月) 21:33:200115デフォルトの名無しさん
2007/11/26(月) 21:51:170116デフォルトの名無しさん
2007/11/26(月) 22:14:400117デフォルトの名無しさん
2007/11/26(月) 22:20:07と言われてるからなあ
C++ではヌルポインタ定数は0だからNULLマクロを使うなら(int)0と
すべきか????
0118デフォルトの名無しさん
2007/11/26(月) 22:24:27__null 拡張キーワードで定義されてたりする。
0119デフォルトの名無しさん
2007/11/26(月) 22:30:59Cのヌルポインタ定数の定義が規格でも変わったの?
俺が見たのはJIS X 3010 (2003年)だけど。
C++はプログラミング言語C++しか見てないから
わからない。
0120デフォルトの名無しさん
2007/11/26(月) 22:32:50C++ はいつからなのかは知らん。
0121デフォルトの名無しさん
2007/11/26(月) 22:34:01thx
知らんかった。
0122デフォルトの名無しさん
2007/11/26(月) 22:38:02VC++ はどうなのかな?
#include <iostream>
#define BARE_2(macro) #macro
#define BARE_1(macro) BARE_2(macro)
#define BARE(macro) BARE_1(macro)
int main() {
std::cout << BARE(NULL) << std::endl;
}
0123デフォルトの名無しさん
2007/11/26(月) 22:38:07知っている人います?
0124デフォルトの名無しさん
2007/11/26(月) 22:39:020125デフォルトの名無しさん
2007/11/26(月) 22:41:02まあ C なら C89 にはおおむね準拠できてると思うけど、100% じゃないんじゃないかな。
C++ に関しては VC++ 6.0 は C++ の規格が固まる前に出たというものもあってか、
C++ の規格への準拠率は酷いもん。
0126デフォルトの名無しさん
2007/11/26(月) 22:42:21ANSI準拠かどうかの判断をしたいのですが、何かいい手段(方法)ありませんか?
コンパイルオプションZaを指定するとコンパイルエラーが出ちゃうし。
ANSI準拠が今回の案件の用件の一つに入っているのでなにかいい案ないでしょうか。
0127デフォルトの名無しさん
2007/11/26(月) 22:44:290128デフォルトの名無しさん
2007/11/26(月) 22:48:140129デフォルトの名無しさん
2007/11/26(月) 22:53:14コードなら他のコンパイラでも(ANSI準拠なら)問題ないんだから>>128みたいなかんじでいいんでね?
0130デフォルトの名無しさん
2007/11/26(月) 22:59:13C++ は ISO/IEC → ANSI の順だから ISO って言った方がいい気がする。
まあどうでもいい話だが。
0131デフォルトの名無しさん
2007/11/26(月) 23:05:020132デフォルトの名無しさん
2007/11/27(火) 00:18:02}
ってこれなんですか?C++の自作関数ですか?
この関数が他に使われてるところを調べるにはどうしたらいいんでしょう?
0133デフォルトの名無しさん
2007/11/27(火) 00:29:07どこで使われているかを探すには、Cと大差ない。
IDEの機能に頼ったり、grepしたり。Cより見付けにくいかもしれないけど。
0134デフォルトの名無しさん
2007/11/27(火) 00:39:23ありがとうございます!恩にきます!
ですが、すみません。Cもあまりよくわかってないのですが、
○○○::□□□
だけでgrepしたところ、一件もヒットがないのです。
○○○だけで検索すべきでしょうか?□□□の方が真髄なのでしょうか?
0135デフォルトの名無しさん
2007/11/27(火) 00:45:55□□□の方が関数の名前なのでそっちで検索する…んだけど、○○○::□□□じゃない□□□も
引っかかる可能性があるんで、それ以上は C++ 勉強してくれって感じ。
0136デフォルトの名無しさん
2007/11/27(火) 00:49:11類似する関数があれば○○○がクラスなら継承の有無を確認する必要がある。
0137デフォルトの名無しさん
2007/11/27(火) 00:53:49大変助かります。ありがとうございます。
□□□がメンバ関数にあたるのでしょうか?
すみませんが、もう一つだけ!
○○○::~□□□()
となってるのがありますが、これはちょっと何か特殊なのでしょうか?
0138デフォルトの名無しさん
2007/11/27(火) 00:55:42入門の本なりサイトなりを参考にするといいよ。
○○○::~□□□←これはデストラクタ。
この程度の内容なら猫でもなんでもいいから一読すりゃ覚えられる。
0139デフォルトの名無しさん
2007/11/27(火) 01:08:26クラスやら継承やらを学べばいいですね!ありがとうざいます!
>>138
猫って、、、これですか?
http://www.kumei.ne.jp/c_lang/
一読すりゃ覚えられるかどうかはアレですが・・易しく書いてありそうですし
猫好きなのでなんとかなりそうです。挑戦してみます!
(一括ダウンロードとかあれば携帯に入れられるのに!)
0140デフォルトの名無しさん
2007/11/27(火) 01:16:09禿と、ハーブ・サッターたんが提案したこれとか、ここの住人的にはどうよ?
ttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2431.pdf
0141デフォルトの名無しさん
2007/11/27(火) 01:27:020142デフォルトの名無しさん
2007/11/27(火) 01:31:52あ、有名だから出したってだけでそこにあるコードがいい物じゃないんで、一応。
大体の基礎的なことが猫の20章までにあるからそこまで読めば十分。
C++で使われる単語(コンストラクタとかデストラクタ、継承、オーバーロード等)が
多少理解できるようになればいろんなサイト回ったほうがいい。
0143デフォルトの名無しさん
2007/11/27(火) 01:39:38ひとまずは目の前にある大量のソースを読めるようになり、簡単な修正が
できるようになることが目標ですので、基礎が身につけばいいです!
コンストラクタとかデストラクタ、継承、オーバーロードなどが目安ですね!
Cを一通りやったはずなのに、目の前のコードの意味が分からず、C++だったことに
気付き、涙目になってたところでしたので、本当に大っ変、大っっ変助かりました!!!
展望が見えてきました!!!ひとまずやってみます。ありがとうございました!!!
0144デフォルトの名無しさん
2007/11/27(火) 01:58:57やっぱりそう思う?
でもここでも毎度毎度でてくるじゃん。
もう何度この手のやり取りを見たことか。
おい、NULLとは何だ規格厨ども?
マクロに決まってんだろボケ!
値は0か? それとも((void *)(0))か?
いや、それは処理系依存だ。
規格でも0だと決まっているぞアホが。
いや、しかしだな、実際昔のある処理系では云々。
何かしら必要とされているんじゃない?
0145デフォルトの名無しさん
2007/11/27(火) 02:01:42必要なものっていうなら、ずっと昔からある C FAQ 5 で十分。
どうせ互換性は捨てられないんだから 0 も NULL も残る。そこにさらに nullptr を
追加しても、混乱は増すだろう。一部の問題を解決するのは確かなんだけれども。
0146デフォルトの名無しさん
2007/11/27(火) 02:06:08例えば
1 2/3
2 1/6
3 1/6
の確率で返すことが決まっているときにどのように書けば
この確率どおりに返り値を返すことができるでしょうか?
0147デフォルトの名無しさん
2007/11/27(火) 02:15:330148デフォルトの名無しさん
2007/11/27(火) 02:18:29int foo() {
switch (rand() % 6) {
case 0:
return 2;
case 1:
return 3;
default:
return 1;
}
}
0149デフォルトの名無しさん
2007/11/27(火) 02:18:44乱数使えって授業で言ってなかった?
0150デフォルトの名無しさん
2007/11/27(火) 02:19:20ここしか人いなさそうなので…
0151デフォルトの名無しさん
2007/11/27(火) 02:21:11例えばサイコロを再現しようとしても、均等に値が分かれないとか…
なんか実用的な乱数ライブラリあった気がするけど、思い出せない
0152デフォルトの名無しさん
2007/11/27(火) 02:27:07プログラムサイコロの再現なんて、ほんとにできたらノーベル賞もんだけどな。
>>150
アセンブラすれあるし、言語関係ないスレでもいいんでね?
http://pc11.2ch.net/test/read.cgi/tech/1187079488/
0153デフォルトの名無しさん
2007/11/27(火) 02:31:06ありがとうございます
一応アセンブラスレには書き込んだんですけど
こっちでも聞いてみてもいいでしょうか?
0154デフォルトの名無しさん
2007/11/27(火) 02:31:090155デフォルトの名無しさん
2007/11/27(火) 02:33:12srandとtime関数使って種別変えてもダメなの?
0156デフォルトの名無しさん
2007/11/27(火) 02:38:05>プログラムサイコロの再現なんて、ほんとにできたらノーベル賞もんだけどな。
知らなかった
>>155
関係ないはず
本物のサイコロ使うと 6 が連続して出るなんてことも結構な頻度で起こるけど
コンピュータの乱数だと、そんな風にならない…という話だったような
0157146
2007/11/27(火) 02:38:08ありがとうございます。
分母を最小公倍数で消して
1 4
2 1
3 1
とした上でrandom関数にmax6min0で返り値吐かせて
0〜4なら1を、4〜5なら2を、・・という風にしようかと思います。
返り値の組は変動するのでswitchには乗せられないと思ったので。。
0158デフォルトの名無しさん
2007/11/27(火) 07:12:58サイコロのかわりに (rand() % 6) + 1 なんてしてると、そんなことになりやすいかもね。
C FAQ にある方法使えば、値域が十分小さいときにあんまりひどい結果にはならないと思うよ。
0159デフォルトの名無しさん
2007/11/27(火) 10:41:50map<string, map<int,int> > a;
こんな感じでKeyをstringとintにしたいんです・
使うときa["test"][100]++;という具合にカウントしていきたいんですが
0160デフォルトの名無しさん
2007/11/27(火) 10:57:04Keyをstringとintの構造体かクラスにして、Compare指定したらどうだろ
0161159
2007/11/27(火) 11:10:04ありがとうございます。
では自分で自作する方針で行きたいと思うのですが
Compare指定について勉強するサイトを教えていただけませんか・・
(浅いものでコンペア指定という語を初めて聞きました)
0162デフォルトの名無しさん
2007/11/27(火) 11:41:24こんな感じに:
template <class T> struct less_key2 {
bool operator()(const T& s1,const T& s2) const { return s1.first < s2.first && s1.second < s2.second; }
};
typedef std::pair<std::string,int> Key2;
std::map<Key2,int,less_key2<Key2> > a;
0163159
2007/11/27(火) 12:17:04すみません、わざわざソース探していただいて。
参考にしつつ考えてみます!ありがとうございましたm(__)m
0164鈴木
2007/11/27(火) 13:12:56どのようにしてファイルの中身は見れるでしょうか?
0165デフォルトの名無しさん
2007/11/27(火) 14:08:36仕様にそんな名前のものはありません。環境依存スレにでもどうぞ。
0167デフォルトの名無しさん
2007/11/27(火) 15:02:55C++ に MiniDumpWriteDump などというものはありません
Windows API の話は↓へ
Win32API質問箱 Build59
http://pc11.2ch.net/test/read.cgi/tech/1194701996/
0168デフォルトの名無しさん
2007/11/27(火) 15:03:42C++言語の話ではないってこと
0169デフォルトの名無しさん
2007/11/27(火) 15:03:52寧ろ、初心者スレへどうぞ。
0170デフォルトの名無しさん
2007/11/27(火) 15:05:08こういうレスする奴って性格悪そうだな
普通に誘導すりゃいいじゃん
0171デフォルトの名無しさん
2007/11/27(火) 15:06:340173デフォルトの名無しさん
2007/11/27(火) 15:37:44鼻から悪魔を召喚したいのですがどのスレが適切でしょうか?
0174デフォルトの名無しさん
2007/11/27(火) 15:40:570175デフォルトの名無しさん
2007/11/27(火) 16:03:55と
>>167、>>168
0177デフォルトの名無しさん
2007/11/28(水) 01:03:23なんか初心者スレに似たような比較関数で嵌ってる奴いたな。同一人物か?
ちゃんと Strict Weak Ordering にしないとダメでしょ。
0178デフォルトの名無しさん
2007/11/28(水) 09:54:12Strict Weak Ordering ですが、>>162の例で言うと
どういう規則になるんですか?
s1.first < s2.first && s1.second < s2.second
これがStrict Weak Orderingを満たしているということは
どういう意味?こういうのは直感的に分かるもの?
0179デフォルトの名無しさん
2007/11/28(水) 10:01:11なんかこれ違う気がする。。
s1.firstとs2.firstが一致した場合、secondを調べないで
falseを返すことになるけどいいのかな?条件が複数あると
混乱してくる。
0180デフォルトの名無しさん
2007/11/28(水) 10:26:48return s1.second < s2.second
が正しい。
というか、 std::pair<T, U> は標準で比較演算子持ってるから
基本的に自分で書かなくてよい。
0181デフォルトの名無しさん
2007/11/28(水) 10:49:55なるほど。
例えばboostのtuple使った場合、Strict Weak Ordering は
if( t1.get<0>() != t2.get<0>() ) return t1.get<0>() < t2.get<0>();
else if( t1.get<1>() != t2.get<1>() ) return t1.get<1>() < t2.get<1>();
else if( t1.get<2>() != t2.get<2>() ) return t1.get<2>() < t2.get<2>();
・
・以下続く
・
となるんですか?
0182デフォルトの名無しさん
2007/11/28(水) 11:00:13汎用的なコードにするためには、 operator != が定義されていない場合も考慮して
↓のようにしたほうがいい。これなら operator < しか使わない。
if( t1.get<0>() < t2.get<0>() ) return true; else if( t2.get<0>() < t1.get<0>() ) return true;
if( t1.get<1>() < t2.get<1>() ) return true; else if( t2.get<1>() < t1.get<1>() ) return true;
if( t1.get<2>() < t2.get<2>() ) return true; else if( t2.get<2>() < t1.get<2>() ) return true;
・
・以下続く
・
return false;
ポインタが入ってることを考えると厳密には std::less を使わないといけないんだけど、
激しくメンドイ。
0183182
2007/11/28(水) 11:00:550184デフォルトの名無しさん
2007/11/28(水) 11:01:59辞書式比較を実装するならそう。
(ただし、型によっては != 演算子を実装してないかもしれないので
そこは回避する必要があるかも)
ただ、 strict weak ordering を満たす順序づけは一通りではないので、
別のやり方で順序を定義してもいい。
一般には、以下の条件が満たされる比較順序なら何でもいい。
ある型の値 x, y, z に対して
1. x < x は false
2. x < y が true ならば y < x は false
3. x < y と y < z が両方 true ならば x < z も true
4. x < y, y < x, y < z, z < y が全て false ならば x < z と z < x も false
0185デフォルトの名無しさん
2007/11/28(水) 11:18:290186デフォルトの名無しさん
2007/11/28(水) 11:23:00書き換えれば、x == y, y == z が言える状況なら、 x== z も言えないといけないということ。
x < y, y < x がどちらもfalseなら1.から当然、x == y と言えるから。
0187デフォルトの名無しさん
2007/11/28(水) 11:24:07このことを x≡y と書くとすると、4番目の条件は
x≡y かつ y≡z ならば x≡z
と書き換えられる。
要するに、等しい連中同士を比べたら必ず等しくなってないと駄目だってこと。
0188デフォルトの名無しさん
2007/11/28(水) 11:32:40惜しい。この説明だとおかしい。
0189デフォルトの名無しさん
2007/11/28(水) 11:44:25!= は < で表現できるから、!= が定義されていない場合がある
ということですよね?
この例の場合>>184の1の条件と2の条件を使ってるということですね。
確かEffectiveSTLにStrict Weak Oderingの一つとして比較対象が一致
した場合は常にfalseを返すことが必要と書かれていました。これは、
>>184の1の条件ということですね。
奥が深いです。
みなさん、どのような書籍を読まれてるのですか?
0190デフォルトの名無しさん
2007/11/28(水) 11:47:02!(x < y) かつ !(y < x) が true かつ true ならば
つまり『一方が他方の前にあるということはない』
と解釈しました。
0191デフォルトの名無しさん
2007/11/28(水) 11:47:27それ書いたの俺だ、しかも比較文を間違えてるね
>>159さん、巻き込んだみんなもごめん
演算子はoperator<とoperator==は実装されていると思うけど、
他の人が言うとおり、operator==(!=)は極力避ける方向で>>162の比較は下になります
if (s1.first < s2.first) {
return true;
} else {
if (!(s2.first < s1.first)) {
return s1.second < s2.second;
} else {
return false;
}
}
0192デフォルトの名無しさん
2007/11/28(水) 11:55:19!(x < y) && !(y < x)
ということで正しいですか?
0193191
2007/11/28(水) 12:04:06if (s1.first < s2.first) {
return true;
} else {
if (!(s2.first < s1.first)) {//if (s1.first <= s2.first) {
return s1.second < s2.second;
} else {
return false;
}
}
>>192
!(x < y) && !(y < x)
(x >= y) && (y >= x)
(x > y) || (x == y) && (y > x) || (x == y)
(x > y) && (y > x) || (x == y)
(x == y)
0194デフォルトの名無しさん
2007/11/28(水) 12:06:29((x > y) || (x == y)) && ((y > x) || (x == y)) …○
0195デフォルトの名無しさん
2007/11/28(水) 12:06:46>(x > y) || (x == y) && (y > x) || (x == y)
間違い。
0196デフォルトの名無しさん
2007/11/28(水) 12:48:14ってのは、クラスに ! 演算子をオーバーロードしておけば
そのインスタンスを assert () に渡せるかなと思って。
一応 VC8 見たら !!x で評価してたけど、処理系依存?
クラスの内部状態が整合性ある状態かどうかを自己診断して
失敗なら true、成功なら false 返す処理を ! 演算子で
やろうと思ってます。
えと、なんか気持ち悪いけど失敗なら「true」でいいんだよね・・
0197デフォルトの名無しさん
2007/11/28(水) 12:51:270198デフォルトの名無しさん
2007/11/28(水) 13:09:570199196
2007/11/28(水) 15:38:24bool operator!() const{
// test if no stream operation has failed
return (fail());
}
ってやってるし、「ダメ」なときに真を返せばいいのかなぁ。
0201196のチラウラ
2007/11/28(水) 15:44:550202196
2007/11/28(水) 18:05:50みたいだけど、上のサイトにのってるテンプレートの
コード自体は取り込まれていないの?
0203デフォルトの名無しさん
2007/11/28(水) 18:17:56basic_ios<>でもoperator boolではなくて
operator void*() constだからな。
ポインタとboolの暗黙の変換を利用して真偽値の判定を行う。
cin >> x;
if(cin) { ... }
0204デフォルトの名無しさん
2007/11/29(木) 07:53:55モノシックなヘッダを1つ include すれば使えるようにするのと、
500個のヘッダを必要になるたび一つ一つ include してもらうのと、
あるいは両者の中間と、それぞれどんな長所や短所があるでしょうか?
0205デフォルトの名無しさん
2007/11/29(木) 08:33:580206デフォルトの名無しさん
2007/11/29(木) 10:11:45class CHoge
{
static const char Names[][]
{
"Name1",
"Name2",
"Name3"
};
};
0207デフォルトの名無しさん
2007/11/29(木) 10:13:30class CHoge
{
static const char Names[][]
{ //ここでC2059
"Name1",
"Name2",
"Name3"
};
};
0208デフォルトの名無しさん
2007/11/29(木) 10:14:34これが本当の訂正。すまん。
class CHoge
{
static const char Names[][] =
{ //ここでC2059
"Name1",
"Name2",
"Name3"
};
};
0209デフォルトの名無しさん
2007/11/29(木) 10:38:59>>208のように、全ての要素(文字列)の長さが一緒になるとしても、です。
static const char Names[][6] = {
"Name1", "Name2", "Name3",
};
なら通るんじゃないでしょうか(VC++6.0で確認)
0210デフォルトの名無しさん
2007/11/29(木) 11:08:03static const char Names[][] =
{ //ここでC2059
"Name1",
"Name2",
"Name3"
};
class CHoge
{
};
これならOK。でもクラスの静的メンバーとして二次元配列を持ちたいんですが、どうすればいいですか?
0211デフォルトの名無しさん
2007/11/29(木) 11:42:34クラス宣言内に書くのではなく
CPPファイルのほうに書く
0212デフォルトの名無しさん
2007/11/29(木) 11:47:390213デフォルトの名無しさん
2007/11/29(木) 11:51:330214デフォルトの名無しさん
2007/11/29(木) 11:56:390215デフォルトの名無しさん
2007/11/29(木) 13:18:38Hoge.h
class CHoge
{
static const char Names[3][6];
};
Hoge.cpp
CHoge::Names[3][6] =
{
"Name1",
"Name2",
"Name3"
};
C2373 Namesが再定義されています。とコンパイルエラーになります。
よろしくお願いします。
0216デフォルトの名無しさん
2007/11/29(木) 13:49:140217デフォルトの名無しさん
2007/11/29(木) 13:50:20ソウイウコトダッタノカ。
早とちりすまん。
>>215のコードだと、cppの方に型指定が抜けてる気がするんだが。
正確には
cont char CHoge::names[3][6](以下略
じゃなかろうか。
0218デフォルトの名無しさん
2007/11/29(木) 14:02:050219デフォルトの名無しさん
2007/11/29(木) 17:53:370220デフォルトの名無しさん
2007/11/29(木) 18:08:370221デフォルトの名無しさん
2007/11/29(木) 19:58:27{
int hensu;
hensu = (int)toaru_kansu();
return (hensu);
}
ってこれ何やってる処理ですか?
0222デフォルトの名無しさん
2007/11/29(木) 20:04:03(int)関数()
ってのがわかんないです。何ですか?これ。
0223デフォルトの名無しさん
2007/11/29(木) 20:13:24toaru_kansu()が long型の関数だから、無理やり int型に変換してるみたいです。
toaru_kansu()の戻り値をintにして返してるだけの関数のようですね。。これ。
0224デフォルトの名無しさん
2007/11/29(木) 20:15:240225デフォルトの名無しさん
2007/11/29(木) 20:21:06の引数って
()
をつけてもつけなくてもいいんですか?
0226デフォルトの名無しさん
2007/11/29(木) 20:22:120227デフォルトの名無しさん
2007/11/29(木) 20:23:17retrun(0) って関数を呼び出しちゃうときがある
0229デフォルトの名無しさん
2007/11/29(木) 20:44:280230デフォルトの名無しさん
2007/11/29(木) 20:47:53好きなの使え
0231デフォルトの名無しさん
2007/11/29(木) 20:52:11たとえばこんなのどうでしょ「a.exe > out.txt」
Cならstdoutをファイルでrefopen(こんな名前だっけ?)すればいいけど
iostreamも基本、同じかな?
0232デフォルトの名無しさん
2007/11/29(木) 21:07:46ありがとうございました。
0233デフォルトの名無しさん
2007/11/29(木) 21:22:08consoleアプリで行った場合には問題なく動くのですが、DLLとして作成すると同じコードなのにファイルの読込に失敗します。
原因わかりませんか?
0234デフォルトの名無しさん
2007/11/29(木) 21:25:460235デフォルトの名無しさん
2007/11/29(木) 21:30:50excel VBAでDLLを読み込んでいるのですが、実行時のパスってどこにあるんでしょう?
exeファイルの場所??
0236デフォルトの名無しさん
2007/11/29(木) 21:39:33Excelのある場所になるのかのぉ?
悪いこと言わないから絶対パスですればよろし
0237デフォルトの名無しさん
2007/11/29(木) 21:39:460238デフォルトの名無しさん
2007/11/29(木) 21:48:30→ 変なエラーがたくさんでて終了
作戦2 : パス通してみた
→ 結局読み込めない
がーーー意味がわからないです…。
Consoleでちゃんと読み込めていることにさらに疑問。
0239デフォルトの名無しさん
2007/11/29(木) 22:00:230240デフォルトの名無しさん
2007/11/29(木) 22:07:20変なエラーってなんだよw
0241デフォルトの名無しさん
2007/11/29(木) 22:23:20ソースは全部会社にあるので確認ができないわけです…
0242デフォルトの名無しさん
2007/11/29(木) 22:41:47サンキューサー!!!!
0243デフォルトの名無しさん
2007/11/29(木) 23:05:28俺のエスパーはたぶん \\ だと告げている
0244デフォルトの名無しさん
2007/11/29(木) 23:13:30a.cpp
namespace a
{
void func()
{
}
} // namespace a
といった、名前空間内にある関数を、他のファイルから参照する方法は無いんですかね?
名前空間に閉じ込めてなければ、
extern void func();
でいいんですけど…
0245デフォルトの名無しさん
2007/11/29(木) 23:17:57namespace a{ extern void func(); };
でいいんじゃないの?
0246デフォルトの名無しさん
2007/11/29(木) 23:25:59で宣言、
a::func();
で使う。
0247デフォルトの名無しさん
2007/11/30(金) 03:41:57(・∀・)ありがとう!
分かってみると単純ですね(´・ω・)お騒がせしました。
0248デフォルトの名無しさん
2007/11/30(金) 10:28:07「この関数はラッピングしてるだけ」ってのは、その関数は別の関数を呼んでるだけで処理をやってない
って意味でしょうか?
0249デフォルトの名無しさん
2007/11/30(金) 10:33:030250デフォルトの名無しさん
2007/11/30(金) 10:38:39そのヘッダファイルを開いても意味不明の構造体が並んでるだけで、
その関数の処理自体がどこにも書かれていません。
この関数はどこにあるのでしょうか?
printf()関数などもそうですが、中身がどこにも書かれてなくても使えるものなのでしょうか?
その場合、その関数の使い方などはどこで知ったらいいですか?
0251デフォルトの名無しさん
2007/11/30(金) 10:42:12ふつうは、ライブラリの中にコンパイル済みのコードが入っている。
Windowsだと 〜.lib 〜.dll、UNIX だと lib〜.a lib〜.so とか。
使うだけなら、そのソースは必要ない。使い方はマニュアルを読む。
0252デフォルトの名無しさん
2007/11/30(金) 10:42:53使い方はドキュメント見れとしか言えないね
でも引数と戻り値、概要、例外安全性、計算複雑性(?)等のインタフェースが分かったらそれで使えるでしょ
0253デフォルトの名無しさん
2007/11/30(金) 10:49:44なるほど。.lib や .dll にあるんですね。ありがとうございます。
じゃあ、その関数の中身がソース上どこにもなかったら、外部で作って渡された部分と思って間違いないですね。
0254デフォルトの名無しさん
2007/11/30(金) 12:49:44{
}
という関数で、return 文のない関数がありました。
これはどういうことですか?なくてもいいんでしょうか?
0255デフォルトの名無しさん
2007/11/30(金) 12:54:57ただい返り値がvoid以外の場合はコンパイラエラーになると思われ
0256デフォルトの名無しさん
2007/11/30(金) 13:04:08returnを「挿入」するわけではないので念のため。
インライン展開してしまうかもしれないし、ジャンプに置き換えているかもしれない。
0257デフォルトの名無しさん
2007/11/30(金) 13:57:45voidの関数においてはreturnを明記しなくても問題ない、処理の途中でreturnさせるなら必要だけど。
環境依存と言語仕様は別じゃない?
returnを書いてある関数がインライン展開される事だってあるだろう。
0259デフォルトの名無しさん
2007/11/30(金) 16:36:47なので、main以外の関数では、コンパイラによっては正常にコンパイルでき、あった場合と
挙動になんら変わりはない。ってことで・・・いいんでしょうか・・
0260デフォルトの名無しさん
2007/11/30(金) 16:37:42Visual Studio 2005 で呼び込むと、
「
ソース管理
! プロジェクト○○.vcprojはソース管理下に存在しているようですが、関連付けされた
ソース管理プラグインがこのコンピュータにインストールされていません。
このプロジェクトのソース管理は無効になります。
□次回からこのダイアログ ボックスを表示しない(D)
[ OK ] [ ヘルプ(H) ]
」
と出て、その後
「
ソース管理 - データベースにアクセスできません
●一時的に管理なしで作業する(T)
○ソース管理の関連付けのバインドを完全に削除する(P)
[ OK ] [ ヘルプ(H) ]
」
と出ます。これはどういう原因で起こっているのでしょう?
0261デフォルトの名無しさん
2007/11/30(金) 16:42:25この状態で、「一時的に管理なしで作業」し、コンパイルした場合、何か
実行後のファイルに影響が出ますか?
中間ファイルや実行ファイルなどのゴミが混ざっていて、実行後のファイルにはなんの影響も
ないのであれば、コンパイルに必要なファイルだけをあれば教えていただきたいです。
あるファイルはこんな感じ↓です。
└「A」フォルダ
├「Release」フォルダ
│ ├BuildLog.htm
│ ├B.obj
│ ├A.dll.intermediate.manifest
│ ├A.obj
│ ├A.res
│ ├mt.dep
│ └vc80.idb
├A.vcproj.MEX.administrator.user
├A.vcproj.vspscc
├mssccprj.scc
├ReadMe.txt
├resource.h
├StdAfx.h
├vssver.scc
├B.cpp
├A.cpp
├A.def
├A.h
├A.rc
└A.vcproj
0262デフォルトの名無しさん
2007/11/30(金) 16:47:39そのKansuは戻り値がない(void)が、mainには戻り値がある(int)。
戻り値がある関数は、returnが必須。
戻り値がない関数は、その関数の最後まで実行する場合はreturnが要らない。
0263デフォルトの名無しさん
2007/11/30(金) 16:50:10スレ違い。VCスレにでもどうぞ。
>>259
main()は一般的に、int main()なので戻り値を「戻さないといけない」のでreturnが必要になる。
但し、c++の場合は省略が許されているし、void main()とした場合には戻せないので必ずしも必要ない。
その他の関数の場合は、voidじゃない限り戻り値を戻すことを明示する為にreturnが必要になる。
0264デフォルトの名無しさん
2007/11/30(金) 18:04:55class Base {
public:
template <class Iterator>
void f(Iterator first, Iterator last)=0;
};
このようなことがしたいんですけど、仮想関数を関数テンプレートにすることができず困っています。
引数を具体的な型にすると、汎用性がなくなってしまうし、う〜ん・・・。
0265デフォルトの名無しさん
2007/11/30(金) 18:24:35any_iteratorはどう?
0266デフォルトの名無しさん
2007/11/30(金) 18:45:19簡単に出来ない理由を説明すると、複数の.cppファイルなどで使われるテンプレート関数の型を、
1ファイルずつコンパイルするコンパイラが認識できないので、仮想関数テーブルが作れないんですよ。
0267264
2007/11/30(金) 19:32:32>>265
DLしてサンプル見てみました。
これ使って解決できそうです。
>>266
ポリモフィズムしたいので、Baseをテンプレートにできないです。
0268デフォルトの名無しさん
2007/12/01(土) 09:39:44static int x;
public:
TestClass(); //default constructor
以下略
};
int TestClass::x = 0;
こんなインクルードヘッダを複数の *.cpp ファイルで
インクルードしまくったら,TestClass::x の実体は
それぞれに確保されてしまって,リンカが混乱しますか?
0269デフォルトの名無しさん
2007/12/01(土) 10:00:580270デフォルトの名無しさん
2007/12/01(土) 11:23:56struct A{
int func();
};
void *p = (void*)&A::func;
手持ちの環境はVC6ですが、キャストできないというエラーが出てしまいます。
static_castやreinterpret_castも試しましたがダメでした。
標準的なプログラムから外れているのは承知しているのですが、リンク時の
アドレスがどうしても必要なのです。(メンバ関数ポインタのアドレス以外の
情報は不要で、アドレスの取得はリンク時に静的に解決したいのです)
最近のC++の仕様的には書きようが無いのでしょうか?
よろしくお願い致します。
0271デフォルトの名無しさん
2007/12/01(土) 11:39:27typedef int (A::*func_ptr)();
func_ptr p = &A::func;
0272デフォルトの名無しさん
2007/12/01(土) 11:55:098バイトになったり、16バイトになったりするからなー。
0273デフォルトの名無しさん
2007/12/01(土) 11:58:10何が違うの?何かの本ではメンバーへのポインタは
相対位置を表すみたいに書いてあったけどよくわからん。
0274デフォルトの名無しさん
2007/12/01(土) 11:58:320275デフォルトの名無しさん
2007/12/01(土) 12:03:110276デフォルトの名無しさん
2007/12/01(土) 12:09:33調整情報なども入れねばならないとか何とか。
一時期のg++は「メンバ関数」を「第一引数が明示的なthisをとる普通の関数ポインタ」
に変換する機能があったけどなー。そんなサンクくらい自分で作れってことかなー。
0277デフォルトの名無しさん
2007/12/01(土) 12:24:28非staticなメンバ関数へのポインタは通常のポインタとは
違うから、void *p = (void*)&A::func; はエラー。
funcがstaticならvoid *p = &A::func; はOK。
0278270
2007/12/01(土) 12:40:40>>275 それっぽいプラグマだと思ったのですが、やり方が悪いのか、うまく行きませんでした。
>>276 古いコンパイラだと普通にキャストするだけで取り出せたんですよね。
thisの変位に関する御指摘が複数ありましたが、その辺は無視して
リンク時のアドレスが欲しいんです。
ひと手間増えますが、とりあえずstatic関数経由で逃げることにしました。
ありがとうございます。
0279デフォルトの名無しさん
2007/12/01(土) 13:26:310280デフォルトの名無しさん
2007/12/01(土) 13:31:280281デフォルトの名無しさん
2007/12/01(土) 13:34:430282デフォルトの名無しさん
2007/12/01(土) 13:35:140283デフォルトの名無しさん
2007/12/01(土) 13:36:27void f();
};
上から下のようにmem_fn的な使い方なら用途はあると思う。
void hoge_f(hoge& h)
{
h.f();
}
0284デフォルトの名無しさん
2007/12/01(土) 13:40:220285デフォルトの名無しさん
2007/12/01(土) 13:44:340286デフォルトの名無しさん
2007/12/01(土) 13:50:13動的バイナリ変換とか自己書き換えでもやりたいのかね?でもそれじゃstatic関数を挟んだら意味ないよなぁ
0287デフォルトの名無しさん
2007/12/01(土) 14:14:38たぶん>>278はメンバ関数ポインタが理解できないヘタレ。
そこでこんな関数でも作ってつかってるんじゃね?
class Foo
{
public :
static void func1(Foo *this_ptr /*必要に応じて引数とか*/) ;
static void func2(Foo *this_ptr /*必要に応じて引数とか*/)
} ;
void (*p)(Foo *) ;
Foo foo ;
//どちらかを呼び出す。
p(foo) ;
普通はこうするんだけどな
void (Foo::*p)() ;
(foo.*p)() ;
0288デフォルトの名無しさん
2007/12/01(土) 15:25:03メンバ関数ポインタと通常の関数ポインタの違いを説明してもらえますか?
0289デフォルトの名無しさん
2007/12/01(土) 15:26:58mem_fun以外でどういうときに役に立つの?
0290デフォルトの名無しさん
2007/12/01(土) 16:04:43メンバ関数ポインタはメンバ関数を指すポインタ
通常の関数ポインタは通常の関数を指すポインタ
違いは明確
0291デフォルトの名無しさん
2007/12/01(土) 16:10:35具体例を挙げて、どこが明確に違うのか
説明できますか?
0292デフォルトの名無しさん
2007/12/01(土) 16:13:42違うよね!うん!違うね!
0293デフォルトの名無しさん
2007/12/01(土) 16:15:370294デフォルトの名無しさん
2007/12/01(土) 16:20:380295デフォルトの名無しさん
2007/12/01(土) 16:34:280296デフォルトの名無しさん
2007/12/01(土) 16:51:28#include <iostream.h>
int main()
{
int a;
cin >> a;
if(a == 0) cout << "0000" << endl;
else cout << "1" << endl;
return 0;
}
文字を入力されたとき1を返すようにしたいのですが何か良い方法はありませんか?
0297デフォルトの名無しさん
2007/12/01(土) 16:55:37>>270の場合、ただ単に、
void*型へのメンバ関数ポインタのキャストは禁止されてる。
0298デフォルトの名無しさん
2007/12/01(土) 16:56:35使うときにthisポインタが必要だからややこしいのが
メンバ関数ポインタじゃないの?
変なこと言ってたらスマン。
0299デフォルトの名無しさん
2007/12/01(土) 16:58:10何の文字よ。
char a;
cin >> a;
とか?もうちょっと詳しく
0300デフォルトの名無しさん
2007/12/01(土) 17:10:41数字以外が入れられたときに1を返すようにしたいです。
例といたしましては abc など 入力された場合 1を返す。
0301デフォルトの名無しさん
2007/12/01(土) 17:16:17こうか?よくわからんが
int a;
cin >> a;
if(cin) cout << "0000" << endl;
else cout << "1" << endl;
0302デフォルトの名無しさん
2007/12/01(土) 17:19:24staticならOK。
0303デフォルトの名無しさん
2007/12/01(土) 17:27:23申し訳ないです。
数字だけの処理をしたいだけで 0の入力がされれば0000を出力し、
それ以外の数字を入力されれば1を返す。
しかし、ユーザーが例外的に文字を入力した時1を返す処理をしたいと
思っています。
数字か文字かを判断できる処理があればと思い質問させていただきました。
0304デフォルトの名無しさん
2007/12/01(土) 17:33:37どんな顔して書き込んでるの?
0305デフォルトの名無しさん
2007/12/01(土) 17:37:58if(cin && a == 0) でいいんじゃない
0306デフォルトの名無しさん
2007/12/01(土) 17:47:18if(cin) これはどういった処理なのでしょうか?
0307デフォルトの名無しさん
2007/12/01(土) 17:49:400308デフォルトの名無しさん
2007/12/01(土) 17:53:50不正な入力(例えばintを要求しているのに文字を入力した)があるとストリームに failbit がセットされる
なので failbit を確認すれば過去の入力が正常であったか判る
0309デフォルトの名無しさん
2007/12/01(土) 17:54:29これの真ん中へん
0310デフォルトの名無しさん
2007/12/01(土) 19:40:47そうですか。
これは、複数 cin を使った場合一番最後につかったものが
適応されるのでしょうか?
0311デフォルトの名無しさん
2007/12/01(土) 19:42:010312デフォルトの名無しさん
2007/12/01(土) 19:53:33今 書き直しました。
#include <iostream.h>
int main()
{
int a;
cout << "数字を入力してください。" << endl;
while(1){
cin >> a;
if(cin){
if( a == '0') cout << "0000" << endl;
else cout << "1" << endl;
break;
}
else cout << "数字以外が入力されました。 もう一度数字を入力してください。" << endl;
}
return 0;
}
やっぱり無理で 文字が入力されると無限ループになってしまいます。
0313デフォルトの名無しさん
2007/12/01(土) 20:03:11>>311
あとなんで文字の'0'と比較してるんだ?
0314デフォルトの名無しさん
2007/12/01(土) 20:05:220315デフォルトの名無しさん
2007/12/01(土) 20:23:420316デフォルトの名無しさん
2007/12/01(土) 20:25:49文字が入力されるともう一度入力させるようにするにはどうすればいいでしょうか?
0317デフォルトの名無しさん
2007/12/01(土) 20:26:540318312
2007/12/02(日) 12:56:230319デフォルトの名無しさん
2007/12/02(日) 13:01:51自前で数値か判定すりゃいいやん
0320デフォルトの名無しさん
2007/12/02(日) 13:22:39isdigit関数とatoi関数で出来ました。
0321デフォルトの名無しさん
2007/12/02(日) 15:00:08どうせなら strtol() とか使えば?
0322デフォルトの名無しさん
2007/12/02(日) 15:13:21ありがとうございます。 使わせていただきました。
0323デフォルトの名無しさん
2007/12/02(日) 15:43:25が false になってしまいます。
std::string( 1, 'a' ) == "a" は成り立つのに、なぜ?
0324デフォルトの名無しさん
2007/12/02(日) 16:01:32std::string( 1, '\0' )は長さが1だが、""は長さが0だから。
0325デフォルトの名無しさん
2007/12/02(日) 17:06:23うほっ、ありがとう
0326デフォルトの名無しさん
2007/12/02(日) 23:51:15void F1();
void F2(){ puts( "F2" ); };
file.cppに
#include "file.h"
void F1(){ puts( "F2" );}
と書いて、mainを呼んでるmain.oとリンクさせると
F2()が多重定義されてるぼけってエラーが出るんだけど
これどう解決すりゃいいですか?
0327デフォルトの名無しさん
2007/12/02(日) 23:55:290328デフォルトの名無しさん
2007/12/02(日) 23:56:360329デフォルトの名無しさん
2007/12/02(日) 23:56:55普通は.hにはプロトタイプ宣言飲のみを書いて中身は.cに書く。
0330デフォルトの名無しさん
2007/12/02(日) 23:58:20ここで教えるのも簡単なんだろうけど
それよりは#includeというものがどういう操作かちゃんと理解しないと
同じエラーを繰り返すだけだよ。
0331デフォルトの名無しさん
2007/12/02(日) 23:59:20ここも変
0332デフォルトの名無しさん
2007/12/03(月) 00:21:11インクルードガードはしてる。
>>329
.hにプロトタイプ宣言だけするのは普通なんだけど、
ちょっと書きたくなった。
>>static
やってみる。
>>331
何が変なのかわかんね。おせーて
0333デフォルトの名無しさん
2007/12/03(月) 00:24:06main.oはmainを呼ばない。
0334デフォルトの名無しさん
2007/12/03(月) 00:29:55って、mainの再帰は規格違反だっけか?
0335デフォルトの名無しさん
2007/12/03(月) 00:43:17mainを呼んでるmain.cppをコンパイルってmain.oになった
ってこと。
mainを呼んでるって語弊あったすまん。
0336デフォルトの名無しさん
2007/12/03(月) 00:43:550337デフォルトの名無しさん
2007/12/03(月) 00:54:580338デフォルトの名無しさん
2007/12/03(月) 00:55:410339デフォルトの名無しさん
2007/12/03(月) 01:49:300340デフォルトの名無しさん
2007/12/03(月) 01:51:42staticにするとコンパイル単位の外からは見えなくなるから
0341デフォルトの名無しさん
2007/12/03(月) 13:40:02MAT* m_matrix[4]
というMAT型データのポインタ配列のポインタを渡したい場合、呼び出す側は
&m_matrix
で呼び出そうとしているのですが、コンストラクタの方の型指定は
どのようにすればよろしいのでしょうか?
( MAT**では通りませんでした)
0342デフォルトの名無しさん
2007/12/03(月) 13:47:58いいたいことがよくわからないけど、constructor の型を指定したいの?
0343デフォルトの名無しさん
2007/12/03(月) 13:55:02コンストラクタに限らず、引数として
MAT* m_matrix[4]のポインタを渡したい場合
受け側の関数の宣言ではどのように型を記述すればよいのか
お聞きしたかったのです。
0344デフォルトの名無しさん
2007/12/03(月) 14:00:230345デフォルトの名無しさん
2007/12/03(月) 14:01:04void f( MAT* (*p)[4] );
0346デフォルトの名無しさん
2007/12/03(月) 14:13:49ありがとうございます。通りました。
0347デフォルトの名無しさん
2007/12/04(火) 16:45:38現在、C++の値をgnuplotに渡すとき毎回gnuplotが起動します。(正確にはwgnuplotに値を渡している)
これを一回起動したら、以降は起動中のgnuplotに値を渡すのはどうすればいいでしょうか?
0348デフォルトの名無しさん
2007/12/04(火) 17:24:31それはC++の問題じゃないのでgnuplot関連スレへどうぞ。
0349デフォルトの名無しさん
2007/12/04(火) 17:42:37やっぱりそうでしたか、gnuplotにいってきます。
ありがとうございました。
0350347
2007/12/04(火) 20:47:49プログラムで何とかしたいのですが
プログラムのループの中のデータを毎回別のファイルに保存したいのですがどうすればいいですか?
例えば
t=0 0.txt , t=1 1.txt , ・・・
のように保存できるでしょうか?
0351デフォルトの名無しさん
2007/12/04(火) 20:53:07ループ内で毎回openして書き出してcloseすればいいんじゃないか。
0352347
2007/12/04(火) 21:07:00fstream EE ( "1.txt" , std::ios::out ) ;
を使って保存しているんですが
この1の部分をどうやって変更すればいいのかがわからないので、質問しました。
ループ内に入れるのはわかるんですが、ファイル名の変更がわかりませんという質問です。
文章が下手ですみません
0353デフォルトの名無しさん
2007/12/04(火) 21:08:450355デフォルトの名無しさん
2007/12/04(火) 21:18:24ostringstream使えば?
例
for(int i = 0; i < 10; ++i) {
ostringstream oss;
oss << i << ".txt"; //ファイル名作成
ofstream ofs(oss.str().c_str()); //ファイルオープン
ofs << "output i = " << i << endl; //ファイルへ出力
ofs.close();
}
0356デフォルトの名無しさん
2007/12/05(水) 02:54:41aaa()のほうがスタック開放コードが少ない分、コードサイズが小さい?
そもそもスタック開放コードって複数生成されるのですか
int aaa()
{
int ret = 1;
char buf[1024];
if(...) {
ret = 0;
}
// スタック開放コード
return ret;
}
int bbb()
{
char buf[1024];
if(...) {
// スタック開放コード
return 0;
}
// スタック開放コード
return 1;
}
0357デフォルトの名無しさん
2007/12/05(水) 04:27:32コンパイラにもよるんだろうけど
関数ごとのリターン処理は1箇所でジャンプ(つまりはgoto)で飛んでるものが多いと思う。
スタックの開放コードはスタックポインタを動かすだけだからきわめて軽微。
x86用のVC++2005だとこんなコード。
mov esp, ebp
pop ebp
ret 0
0358デフォルトの名無しさん
2007/12/05(水) 08:10:57いまどきは mov, pop の代わりに leave ニーモニックを使ってあることも。
なんで enter ニーモニックは使わないんだろう…
スレ違いスマソ。
0359デフォルトの名無しさん
2007/12/05(水) 09:30:334段落
A pointer can be explicitly converted to any integral type large enough to hold it.
5段落
A value of integral type or enumeration type can be explicitly converted to a pointer. A pointer converted to an integer of
sufficient size (if any such exists on the implementation) and back to the same pointer type will have its original value;
とあるんですが、整数→ポインタ→整数 と変換した場合は元の値は保たれるのでしょうか?
(explicitly convertの意味が良く分からない・・・厳密な変換とは??)
保たれるとして、"large enough"とか"sufficient size"かを確かめるのは、sizeofでチェックすれば十分でしょうか?
やりたいこと:
他人が提供するC言語で書かれたvoidポインターのコンテナに、
今はヒープに取った整数型をポインタを介して格納しているが
せっかくなのでvoidポインタに直接整数を格納したい。(パフォーマンス上の理由)
0360デフォルトの名無しさん
2007/12/05(水) 10:25:40>整数→ポインタ→整数 と変換した場合は元の値は保たれるのでしょうか?
処理系依存のはずだから保障はないはず。表示して確認すればよいと思う。
ただ、たいがい同じビットパターンだと思う。
>(explicitly convertの意味が良く分からない・・・厳密な変換とは??)
明示的な型変換という意味。(暗黙では変換不可)
0361デフォルトの名無しさん
2007/12/05(水) 10:39:45const char* p1 = "hoge";
short n1 = reinterpret_cast<short>(p1); // エラー。shortはlarge enough to holdではない。
__int64 n2 = 1 << 30; n2 <<= 30;
const char* p2 = reinterpret_cast<const char*>(n2); // OK。でもn2の上位32ビットは失われる。
この場合、整数が小さすぎる心配はコンパイラに任せれば安心だけど、
大きすぎるほうの心配はしなくちゃいけない、ってことになるね。
0362デフォルトの名無しさん
2007/12/05(水) 11:05:13enterは遅いから。
0363デフォルトの名無しさん
2007/12/05(水) 16:36:40その「整数」として、intptr_tやUINT_PTRなどの「ポインタと同サイズの整数型」を使うなら。
0365デフォルトの名無しさん
2007/12/07(金) 20:49:59void c_func(pfunc func) { func(); }
void cpp_func() { throw 0; }
void hoge()
{
try
c_func(
}
0366デフォルトの名無しさん
2007/12/07(金) 20:56:32C関数は誰かが作ったC言語のライブラリだとします。
以下のようにC関数内でC++例外を投げるのは規格上大丈夫なのでしょうか?
typedef void (*pfunc)();
void c_func(pfunc func) { func(); } // C関数
void cpp_func() { throw 0; } // 例外を投げるC++関数
void hoge()
{
try { c_func(&cpp_func); }
catch(int) {}
}
0367デフォルトの名無しさん
2007/12/07(金) 21:21:13Cの関数から呼び出された中で例外を投げたらどうなるかは未定義。
Cの関数に限らずC++同士でも、別のコンパイラでコンパイルした関数に向けて例外を投げると未定義の動作。
foo.hpp:
void foo();
foo.cpp:
#include "foo.hpp"
void foo(){
throw 0;
}
bar.cpp:
#include "foo.hpp"
int main(){
try{ foo(); }
catch(const int&){}
return 0;
}
foo.cppとbar.cppでコンパイラが違うと、まずい。
2つのコンパイラのmangleが同じでリンク出来たとしても、
何が起こるかわからない。
0368デフォルトの名無しさん
2007/12/07(金) 21:29:35ってなんか変な表現だな
とにかく、例外を投げると関数が終了して呼び出し元にどんどん戻るじゃん、
それで他のコンパイラでコンパイルした部分に達すると未定義の動作になるってことね。
0369デフォルトの名無しさん
2007/12/07(金) 21:33:180370デフォルトの名無しさん
2007/12/07(金) 21:46:080371デフォルトの名無しさん
2007/12/07(金) 21:47:50ハードディスクがゼロクリアされる
0372デフォルトの名無しさん
2007/12/07(金) 22:25:5117時で帰宅できるようになる
0373デフォルトの名無しさん
2007/12/07(金) 22:43:130374デフォルトの名無しさん
2007/12/08(土) 09:05:44(*this)[hogehoge]みたいにしなくちゃダメ?
あるいは this->operator[](hogehoge) とか.
もっと見やすい書き方ないかなぁ.
それもこれも this が参照じゃなくてポインタなのが悪い気がする.
しかし参照が仕様に入った時期を考えると仕方ない気もする.
いまさらどうしようもないか.
0375デフォルトの名無しさん
2007/12/08(土) 10:31:470376デフォルトの名無しさん
2007/12/08(土) 13:46:37for( int i = 0; i < 256; ++i )
って書き方は慣れたし便利だなぁと思うんですが
for( char buf[ 1024 ]; fgets( buf, sizeof(buf), fp ); )
って書き方はどうなんでしょう?
変数のスコープは↑の方向が小さいですが
char buf[ 1024 ];
while( fgets( buf, sizeof(buf), fp ) )
の方が普通ですか?
そもそもfgetsなんか使わねぇよ、ってのは無しでお願いします。
0377デフォルトの名無しさん
2007/12/08(土) 14:41:43ただwhileは条件でループ、forは回数でループってイメージがあるので、
whileの方が違和感がないし、forだと可読性が落ちるように思う。
(ソースを流し読みするときに、一瞬考えてしまう)
0378デフォルトの名無しさん
2007/12/08(土) 15:09:28for の初期化部分に、単なる変数の定義を入れるのは好ましくない。
スコープを制限したいなら、全体をブレースで囲むほうがいい。
0379デフォルトの名無しさん
2007/12/08(土) 15:18:40ありがとうございます。
やはり不自然でしたか...
0380デフォルトの名無しさん
2007/12/09(日) 00:02:20関数アダプタを使わない場合、
メンバ変数のない単純な関数オブジェクト(比較オブジェクトとか)は通常の関数で代替できる場合が多いと思うのですが、
その場合に関数オブジェクトを使う利点って何でしょう?
0381デフォルトの名無しさん
2007/12/09(日) 00:07:37最適化で早く小さくしやすい
0382デフォルトの名無しさん
2007/12/09(日) 00:14:02とレスしようとしたら既にされてた。
0383デフォルトの名無しさん
2007/12/09(日) 00:23:47ありがとうございます
関数でもinlineをつければインライン展開されうると思うのですが、
それよりも優れているのでしょうか?
0384デフォルトの名無しさん
2007/12/09(日) 00:26:16通常の関数を渡した場合は、関数ポインタを渡したものとされるので、
インライン展開されにくくなる。しちゃいけないってことはないんだろうけど、
そこまでやってくれるコンパイラは見たこと無いな。
0385デフォルトの名無しさん
2007/12/09(日) 00:30:13下記の a(b) と a(c) では同じ a がインスタンス化されうるが
インライン化しちゃったらそれができない
template<class X> void a(X x) { x(0); }
inline void b(int){}
inline void c(int){}
void d()
{
a(b);
a(c);
}
0386デフォルトの名無しさん
2007/12/09(日) 00:30:20ああ、そうか、ポインタを経由するから……そこまで頭が回りませんでした
参考になりました
ありがとうございます
0387デフォルトの名無しさん
2007/12/09(日) 00:36:38なるほど、確かにそういうことも起こりますね
結局はテンプレート関数・クラスを用いる場合に、
関数オブジェクトの方がより限定化された範囲で実体化されるので高速化しやすいってことですね
ありがとうございます
0388デフォルトの名無しさん
2007/12/09(日) 11:13:42関数オブジェクトのoperator()と、それを呼び出すコードが別の翻訳単位になった場合、
関数ポインタとどっちが高速になりやすい?
あるいは、あなたならどっちを選択する?
foofunc.h:
struct Foo{
bool operator()(bool cond);
}
foofunc.cpp:
bool Foo::operator()(bool cond){
return !cond;
}
main.cpp:
#include "foofunc.h"
#include <iostream>
int main(){
using namespace std;
Foo f;
cout << f(false) << endl;
}
0389デフォルトの名無しさん
2007/12/09(日) 11:29:44VC8(VS2005)の結果。
--- main.cpp ---------------------------
#include "foofunc.h"
#include <iostream>
int main(){
using namespace std;
Foo f;
cout << f(false) << endl;
00401000 mov eax,dword ptr [__imp_std::endl (402044h)]
00401005 mov ecx,dword ptr [__imp_std::cout (40203Ch)]
0040100B push eax
0040100C push 1
0040100E call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (402038h)]
00401014 mov ecx,eax
00401016 call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (402040h)]
}
0040101C xor eax,eax
0040101E ret
0390デフォルトの名無しさん
2007/12/09(日) 12:58:210391デフォルトの名無しさん
2007/12/09(日) 18:16:460392デフォルトの名無しさん
2007/12/09(日) 18:45:56const_cast は危険なキャストをしてないか調べるときに検索するから、
安全な奴は static_cast にしといてくれたほうがいい。
0393デフォルトの名無しさん
2007/12/09(日) 23:45:54関数に入った時点で全て確保されているものなのでしょうか?
それとも変数の宣言位置まで到達して初めて確保されるものなのでしょうか?
例えば下記のようなコードを書いてしまうと、
getHoge()の呼び出し毎に無駄なスタック領域が確保されてしまうものなのでしょうか?
const Hoge& getHoge()
{
static Hoge hoge;
if (hoge.isInitialized()) {
return hoge;
}
// ここでhogeの初期化処理のために変数を大量に使用。
// 以降、hoge.isInitialized()はtrueを返す。
return hoge;
}
0394デフォルトの名無しさん
2007/12/09(日) 23:49:42たいがいの環境では、関数に入った時点で、ローカル変数全部の領域が取られる。
0396デフォルトの名無しさん
2007/12/09(日) 23:56:33コードやコンパイラの実装によるだろ。スタックの確保なんて無駄になるって言っても
数命令だろうから気にしないでいいと思うけど、心配ならコンパイル結果のアセンブリ
見ないと確実なことはわからない。
0397デフォルトの名無しさん
2007/12/09(日) 23:57:19実行時に処理が進むたびに必要な領域を確保するのはコストがかかって仕方ないんじゃない?
プラットフォームによって違うだろうけど、そもそもスタックってプロセス生成時に
あらかじめ決まった仮想アドレス空間を割り当てて、関数呼び出しのたびに領域を割り当てるのではなく
フレームポインタ(?)だかなんだかをずらしていくだけ、というのが多いと思う。
間違ってたら全面的にゴメン。
0398デフォルトの名無しさん
2007/12/10(月) 10:11:32スタックは予め確保されてます、関数毎に確保されるものではないです。
コンパイラはespレジスタ(SH系だとr15など、スタックポインタを管理するレジスタ)が示すポインタに
ローカル変数を積み重ねる形のコードを出力するだけで、スタック領域はOSの管理となっています。
スタック領域が足りなくなったときの振る舞いはOSによって異なるし言語範囲外なので除外。
0399デフォルトの名無しさん
2007/12/10(月) 11:46:36>>398
ヒープとスタックの境界が決められてるだけで確保はされてないだろ
0400デフォルトの名無しさん
2007/12/10(月) 13:01:51「確保」の概念の違いなのかな?
0401デフォルトの名無しさん
2007/12/10(月) 13:12:08そんな簡単なことでオーバーヘッドになったりしないよう
偉い人はちゃんと考えてくれているので気にしなくていい
0402デフォルトの名無しさん
2007/12/10(月) 13:29:11staticな変数は確保されているだろうが、一般的な実装では、
auto変数(ローカル変数)は関数がコールされるたびにスタックに積まれる。
そうしなきゃ、再起呼び出しなんてできないよ。
階乗を求める
int kai(int n)
{
if(n=1)return 1;
else return n*kai(n-1);
}
の場合、スタックにn回分のローカル変数(とreturn時に戻り先のアドレス)が積まれる。
0403400
2007/12/10(月) 15:11:45「スタック領域」と言う形で用意されているのではないだろうか、という話。
0404デフォルトの名無しさん
2007/12/10(月) 16:21:460405デフォルトの名無しさん
2007/12/10(月) 17:17:59とは限らない。Cランタイムライブラリが_main()とかで初期化する場合もある。
ヒープ食いつぶすとスタック領域に食い込んで、スタック壊す実装系もある。
0406デフォルトの名無しさん
2007/12/10(月) 19:40:48>>404
0407デフォルトの名無しさん
2007/12/11(火) 00:06:28http://sourceforge.net/forum/forum.php?forum_id=762922
0408デフォルトの名無しさん
2007/12/13(木) 02:47:570409デフォルトの名無しさん
2007/12/13(木) 06:34:370410デフォルトの名無しさん
2007/12/13(木) 11:03:480411デフォルトの名無しさん
2007/12/13(木) 19:03:17vector<vector<int> > a;
と宣言した領域のたとえばa[1][1]に値を放り込むにはどう書いたらいいのでしょうか?
0412デフォルトの名無しさん
2007/12/13(木) 19:04:52static vector<vector<int> > a;
の場合ですと直接
a[1][1]=3;
のように書けると自分では思ってるんですが、この場合staticで
全部の値が0だからだと思うんですが、果たして全部ってどこまで
取られているんでしょうか
0413デフォルトの名無しさん
2007/12/13(木) 19:38:38日本語でおk。
0414デフォルトの名無しさん
2007/12/13(木) 19:47:280415デフォルトの名無しさん
2007/12/13(木) 20:29:16自動的にハイパーリンクにする機能が欲しいのですがどのような関数を使えば
いいのでしょうか
0416411
2007/12/13(木) 21:02:37けっきょく
vector<vector<int>* > a;
と宣言し
vector<int> *tmp = new vector<int>;
a.push_back(tmp);
(*a).push_back(x);//xは数値
のようにし
cout << (*a)[0];
のように用いることで解消しました
0417411
2007/12/13(木) 21:05:17正しくは右です
(*a).push_back(x); →(*a[0]).push_back(x);
cout << (*a)[0]; →cout << (*a[0])[0];
0418デフォルトの名無しさん
2007/12/13(木) 21:15:38for(n=0;n<100;n++) a[n].resize(100);
とすればOK
a[0][0]からa[99][99]まで使える
0419デフォルトの名無しさん
2007/12/13(木) 21:21:000420デフォルトの名無しさん
2007/12/13(木) 21:26:32vector< Dint > a(100, Dint(100));
とすると、a[]の値をDint(100)型で初期化するって事か
なんかどういう仕組みで確保できるのかわからなったよ
0421デフォルトの名無しさん
2007/12/13(木) 21:27:290422デフォルトの名無しさん
2007/12/13(木) 21:28:55cout<<a[0][0]<<endl;
という初期化も出来るんだね
0423デフォルトの名無しさん
2007/12/14(金) 01:08:520424デフォルトの名無しさん
2007/12/14(金) 01:12:390425デフォルトの名無しさん
2007/12/14(金) 01:22:420426デフォルトの名無しさん
2007/12/14(金) 21:31:270427デフォルトの名無しさん
2007/12/14(金) 21:38:19ファイルスコープの変数に使うくらいしか知らないのですが、
もしよかったらどんな場合に使ったらよいか教えてください。
0428デフォルトの名無しさん
2007/12/14(金) 21:42:16それはおいらも欲しい。
中途半端に作ったことはあったけどw
0429デフォルトの名無しさん
2007/12/14(金) 23:52:090430デフォルトの名無しさん
2007/12/15(土) 02:48:32って、
char a[10];
のように、その変数を固定長にしたい(最大長を制限したい)場合どうするの?
0431デフォルトの名無しさん
2007/12/15(土) 02:57:100432デフォルトの名無しさん
2007/12/15(土) 02:58:18boost の subversio リポジトリ見てるけど,
最近 asio まわり更新多いね.
0433デフォルトの名無しさん
2007/12/15(土) 03:05:41具体的に制限を越える操作をしたときに何が起こって欲しいの。例外?
0434デフォルトの名無しさん
2007/12/15(土) 03:32:41メモリ使用量固定にしたいと考えたんだけど、
どちらで書くにしても、結局事前のチェックをして
から格納しなきゃならないから、確かに >>431 の
気を付けるしかないってわけですね
>>433
そっか、仕様として想定した範囲以上のメモリ領域
を使った場合に、例外飛ばすようにしておくのも手ですね。
0435デフォルトの名無しさん
2007/12/15(土) 03:38:15std::sort( list.begin(), list.end(), cmpfunc);
みたいにしてソート処理させてみました。
string lhs, rhs とすると、cmp func は、 return (lhs < rhs); のようにしています。
これで数字のソートをさせると
10, 11, 12, 1, 2, 3 が
1, 10, 11, 12 ,2, 3 みたいになっちゃうのですが、1, 2, 3, 10, 11, 12 というように
並べるにはどうするのが良いでしょうか?
0436デフォルトの名無しさん
2007/12/15(土) 03:42:260437デフォルトの名無しさん
2007/12/15(土) 06:48:05bool operator()(const std::string& lhs, const std::string& rhs) const {
return (atoi(lhs.c_str()) < atoi(rhs.c_str()));
}
};
std::sort(ls.begin(), ls.end(), cmpf());
0438デフォルトの名無しさん
2007/12/15(土) 08:45:140439デフォルトの名無しさん
2007/12/15(土) 08:47:200440デフォルトの名無しさん
2007/12/15(土) 10:18:52デフォルトのallocatorを継承してmax_sizeだけいじってなんとかならんかね。
0441デフォルトの名無しさん
2007/12/15(土) 10:28:080442デフォルトの名無しさん
2007/12/15(土) 10:57:53STLの構造を理解するのに何か良い学習方法
ありませんか?
特にallocatorあたりが理解できてません。
0443デフォルトの名無しさん
2007/12/15(土) 11:42:340444デフォルトの名無しさん
2007/12/15(土) 12:47:320445デフォルトの名無しさん
2007/12/15(土) 13:10:12allocator<T>のメンバー関数を理解して、独自のコンテナでも作ってみる。
0446デフォルトの名無しさん
2007/12/15(土) 21:48:26知れば知るほど面白いね
処で参照、引数の参照渡しについて、質問です
引数に関数や、配列等を与える場合は、リファレンスで、組込み型の場合は
値渡しがよいと、認識しているのですが、組込み型の引数が2つ以上の場合でも、
値渡しの方がいいのでしょうか?
例えば
unsigned int Foo( const unsigned int n ) const;
も
unsigned int Hoge( const unsigned int lhs, const unsigned int rhs ) const;
でも、値渡しの方がベター?
0447デフォルトの名無しさん
2007/12/15(土) 21:52:49×unsigned int Foo( const unsigned int n ) const;
○int Foo( const int n ) const;
×unsigned int Hoge( const unsigned int lhs, const unsigned int rhs ) const;
○int Hoge( const int lhs, const int rhs ) const;
unsignedは考えないでください
0448デフォルトの名無しさん
2007/12/15(土) 22:04:32引数それぞれの型に応じて使い分けるのであって、引数の数でどうなるものでもない。
組み込み方かどうかという区分けもあんまり理論的じゃないね。たぶんサイズに応じた
基準を端折って説明されてたのを見たんだろうけど。
0449デフォルトの名無しさん
2007/12/15(土) 22:09:54引数をまとめて構造体に入れてそれを参照渡しするなら話は別だが
構造体に入れるときに結局コピーするんだし、
void Foo(long long a, long long b, long long c, long long d){
}
void Bar(long long a, long long b, long long c, long long d){
Foo(a, b,c, d);
}
引数をそのまま別の関数に渡すんなら、まあ両方とも構造体参照渡しにすれば…
(でもそういう場合ってインライン化しちゃうか)
0450デフォルトの名無しさん
2007/12/15(土) 22:27:22>>449
>>447です
サンクスです、
>引数それぞれの型に応じて使い分けるのであって、引数の数でどうなるものでもない。
なるほど、リファレンスのバイト数:値のバイト数との大小関係を考慮しろってことだね
だとすると、VCとかだと、リファレンスのサイズって何バイトなんだろう?
Effective C++ではint型の場合は参照渡しより、値渡しのほうが良いと書いてあったけど
てことは、リファレンスは32バイト以下なんだろうか?
>構造体に入れるときに結局コピーするんだし
そうですね、構造体ってことは、クラスと同じようなもんだとすると、コンストラクタ、デストラクタが
動くから、そのコストもかかることになりますね。
0451デフォルトの名無しさん
2007/12/15(土) 22:33:01変な日本語になったかな?
インスタンスのサイズ>リファレンスのサイズ
の場合、参照渡しが○
インスタンスのサイズ<リファレンスのサイズ
の場合、値渡しが○
ってことが書きたかった(^^;
0452447
2007/12/15(土) 22:40:33using namespace std;
int main()
{
int n = 10;
cout << sizeof( n ) << endl;
cout << sizeof( &n ) << endl;
return 0;
}
あれ?同じサイズだな?
値渡しの優位性は何処なんだろう?
0453デフォルトの名無しさん
2007/12/15(土) 22:42:040454デフォルトの名無しさん
2007/12/15(土) 22:45:59>>447
値渡しで一番速いのはCPUの扱うワード長を基準に考えればいいだろう。
まあ、基本型のデータをわざわざ参照にしなくてもいいと思うし。
データのコピーより参照を手繰るほうが早く済みそうなら参照・ポインタを使えばいい。
0455デフォルトの名無しさん
2007/12/15(土) 22:54:23それと値渡しでconstを指定する意味はない。
0456デフォルトの名無しさん
2007/12/15(土) 22:58:33なるほど@納得した
>>454
まぁそう言うな、どうせお前も暇なんだろww
さて、スキーリしたので、プログラミング言語C++第3版の
続きよーもうっと
0457デフォルトの名無しさん
2007/12/15(土) 23:19:24受け取った側でポカミス防げるじゃん.
まぁ渡した側としてはどうでもいいけど.
0458デフォルトの名無しさん
2007/12/15(土) 23:22:11>>それと値渡しでconstを指定する意味はない。
あ、これね前説が抜けてたけど、
FooやHoge関数内で、引き数をいじって、変えて欲しくなかったからだ
だから意味はあるのよん
0459デフォルトの名無しさん
2007/12/15(土) 23:24:09元がわかんなくなっちゃって、えいやってconst 参照で渡すように書いちゃうんだけど・・・
0460デフォルトの名無しさん
2007/12/15(土) 23:45:46int Foo( const int n ) const;
int Foo( int n ) const;
のオーバーロードができなくなるという
問題はあるがな。呼ばれた側で値を変えたく
ないなら組み込み型でもconst int&にするわ。
0461デフォルトの名無しさん
2007/12/15(土) 23:54:580462デフォルトの名無しさん
2007/12/15(土) 23:57:14プロトタイプのほうを
int hoge(int n);
にして、関数を定義してるほうを
int hoge(const int n) { ・・・
すべしって、なんかの本に書いてあったよ。
0463デフォルトの名無しさん
2007/12/15(土) 23:59:02どこの本だよ
0464デフォルトの名無しさん
2007/12/15(土) 23:59:56オーバーロードではなく
正確には
int Foo( int n ) const;
が定義できなくなるだった。
>>461
書籍に少し載ってる
0465デフォルトの名無しさん
2007/12/16(日) 00:04:19ハーブサッターっていう偉人を知ってるか?
0466デフォルトの名無しさん
2007/12/16(日) 00:04:58C++ Coding Standards
0467デフォルトの名無しさん
2007/12/16(日) 00:36:56>>447だけど
それは、ないやろ
VS2005だと、error C2511が出るぞ?それとも関数定義のブレスの中で何か
テクニックがあるのかな?
今ちょっと、他の本見てみたら、ピアソンの「C++FAQ第2版」では、
int Foo( const int& n );
オブジェクト変更のポカミスには、これが推奨ってなってるな
0468デフォルトの名無しさん
2007/12/16(日) 00:56:29VS2005でためしたけど、エラーにならないよ?
0469デフォルトの名無しさん
2007/12/16(日) 01:09:25int f(int a);
int g()
{
return f(1);
}
int f(const int a)
{
return a+1;
}
class X
{
void f(int a);
};
void X::f(const int a)
{}
0470デフォルトの名無しさん
2007/12/16(日) 01:48:31なんか違う?g++では「error: redefinition of `void A::f1(int) const'」っていわれた。
#include <iostream>
struct A {
void f1(int n) const;
// void f1(const int n) const;
};
int main()
{
A a;
a.f1(100);
return 0;
}
void A::f1(int n) const {
std::cout << "call int";
n += 200;
}
void A::f1(int const n) const {
std::cout << "call const int";
n += 200;
}
0471デフォルトの名無しさん
2007/12/16(日) 01:59:22>>467のconst参照ならわかるが、コピーのnを変更禁止にする利点うかばないのだが....
0472デフォルトの名無しさん
2007/12/16(日) 02:01:18void A::f1(int n) const
void A::f1(int const n) const
この二つはオーバーロードできない。
参照、ポインタならできる。
以上。
0473デフォルトの名無しさん
2007/12/16(日) 02:01:43引数を変更したくないときに便利
0474デフォルトの名無しさん
2007/12/16(日) 02:02:18嫁
0475デフォルトの名無しさん
2007/12/16(日) 02:02:57ならば、const int& にすべき。
Exceptional C++
嫁
0476デフォルトの名無しさん
2007/12/16(日) 02:06:32なぜわざわざ参照渡しに???
0477デフォルトの名無しさん
2007/12/16(日) 02:07:450478デフォルトの名無しさん
2007/12/16(日) 02:09:43[ Example: the type void(*)(const int) becomes void(*)(int) .end example ]
Such cv-qualifier s affect only the definition of the parameter within the body of the
function; they do not affect the function type.
0479デフォルトの名無しさん
2007/12/16(日) 02:30:00妄想で答えると、>>460はconst/非constオブジェクト両方受けたいために
オーバーロードしたいんじゃね。
0480デフォルトの名無しさん
2007/12/16(日) 02:36:48"C++ Coding Standards" は糞本?
0481デフォルトの名無しさん
2007/12/16(日) 02:39:33"Exceptional C++" は糞本?
0482デフォルトの名無しさん
2007/12/16(日) 02:42:14for(;;)とwhile(true)と同じ
0483デフォルトの名無しさん
2007/12/16(日) 02:42:28本では、constで定義を薦めてるんではなくて
constの宣言はよしなさいと言っている
0484デフォルトの名無しさん
2007/12/16(日) 03:11:21定義const引数でも、宣言非constに汁
と言ってるようじゃ
ハーブサッターって糞著者だな
0485デフォルトの名無しさん
2007/12/16(日) 03:29:440486デフォルトの名無しさん
2007/12/16(日) 03:44:03>>484 を言ってるんだろ
0487デフォルトの名無しさん
2007/12/16(日) 04:43:52const int&で全部糞扱いですか
0488デフォルトの名無しさん
2007/12/16(日) 05:02:460489デフォルトの名無しさん
2007/12/16(日) 06:10:360490デフォルトの名無しさん
2007/12/16(日) 08:31:35俺はローカルオブジェクトと同じ感覚でちょくちょくいじるんだけど
# f(int)をf(const int &)にするのは時期尚早な不最適化だと思う
0491デフォルトの名無しさん
2007/12/16(日) 08:32:56�@「関数の引数には値渡し、参照渡しがどっちが効率的なのか?」
という質問に、
�A「オブジェクトを予期せずに変更してしまうのを避けるにはどうすべきか?」
という、問題が派生してしまったことにより、議論が混乱しているようなので
ここは一度問題を切り分けて、議論する必要があるね、
�@のコンセンサスにかんしては
・値渡しよりはconst参照渡しを使う。そうすれば、一般的に効率的で、スライス問題が起こらない。
・ただし、これらは、組込み型とSTLの反復子・関数オブジェクトには適用されない。これらについては、普通、値渡しが適当。
ということでny
では�Aに関して、皆さんの意見を語ってください。
0492デフォルトの名無しさん
2007/12/16(日) 09:14:31>�A「オブジェクトを予期せずに変更してしまうのを避けるにはどうすべきか?」
>という、問題が派生してしまったことにより、議論が混乱しているようなので
関数内でコールもとのオブジェクトを更新を避けたいとき、値渡しかconstの参照/ポインタを
使うことについては異論がないんじゃない?
(一部、混乱している人もいるようだけど。)
今議論していたのはインターフェース(プロトタイプ宣言)で int と引数を宣言しておいて
実装(関数定義)で const int として宣言することの是非ではなかったっけ?
0493デフォルトの名無しさん
2007/12/16(日) 09:15:44そこまで賢くない?
0494デフォルトの名無しさん
2007/12/16(日) 11:13:50インライン展開するときに実引数によっては可能だと思うよ。
0495デフォルトの名無しさん
2007/12/16(日) 11:19:12いやだから定義でも基本的に付けない。でも付けてもいいし、実際に付ける時もある。
0496デフォルトの名無しさん
2007/12/16(日) 11:19:42>492
>491 の
>�A「オブジェクトを予期せずに変更してしまうのを避けるにはどうすべきか?」
ここでいうオブジェクトはコール元ではなくて関数内でのオブジェクトだと思われ。
C++ Coding Standards では const int って宣言に書くと混乱が発生するので(このスレですら発生してるし)、「やるんだったら」定義につけろってことじゃなかったっけ?
個人的にはまず�@によって渡し方を決定、(俺はやらんけど)やりたければ値渡しでも定義側で const つければ?ぐらいの立場だな。
あと、ここまで出てなかったと思うんで挙げておくと、引数の型については Boost call_traits ってのもある。これだと const int になるみたい。
0497デフォルトの名無しさん
2007/12/16(日) 11:20:50#include <iostream>
#include <vector>
using namespace std;
typedef struct {
double x,y;
} _tBullet;
class CBullet
{
public:
void Move( _tBullet *bullet );
};
void CBullet::Move( _tBullet *bullet ) {
bullet->y -= 10.0;
}
0498デフォルトの名無しさん
2007/12/16(日) 11:21:25{
CBullet CBulletFactory;
vector<_tBullet> vBullet;
_tBullet bullet;
int i;
for( i=0; i<10; i++ )
{
double x = (double)(rand()%64)/10;
double y = (double)(rand()%64)/10;
bullet.x = x;
bullet.y = y;
vBullet.push_back(bullet);
}
vector<_tBullet>::iterator p = vBullet.begin();
while( p != vBullet.end() )
{
CBulletFactory.Move(p); // ここでエラー
p++;
}
return 0;
}
0499デフォルトの名無しさん
2007/12/16(日) 11:23:04VC++6.0 では正常にコンパイルされるのですが
VC++Express Edition では
c:\documents and settings\owner\デスクトップ\hoge2\hoge2\hoge2.cpp(43) : error C2664: 'CBullet::Move' : 1 番目の引数を 'std::_Vector_iterator<_Ty,_Alloc>' から '_tBullet *' に変換できません。(新しい機能 ; ヘルプを参照)
with
[
_Ty=_tBullet,
_Alloc=std::allocator<_tBullet>
]
この変換を実行可能なユーザー定義変換演算子がないか、または演算子を呼び出せません。
とエラーになってしまいます。
どうすればエラーを回避できるのでしょうか?
0500デフォルトの名無しさん
2007/12/16(日) 11:30:03最近ではならん。邪道かもしれんがその場しのぎならMove(&*p);
0501デフォルトの名無しさん
2007/12/16(日) 11:41:29解決しました
しかし &*p って 意味的には同じですよね
ポインタは理解しているのですが、深い部分までは理解してなかったのです。
最近はイテレータはポインタとして変換されないんですね
昔勉強した本によると イテレータはポインタの用に動くと明記されていたので
とても困っていました。
細かくはイコールではないのですね
ありがとうございます。勉強にもなりました。
0502デフォルトの名無しさん
2007/12/16(日) 12:38:15基底クラスを protected で継承して,一部だけを
public で公開したいと思っています.
基底クラスの operator== を public に宣言しなおしても
派生クラスのインスタンス同士で比較しようとすると
派生クラスのポインタから基底クラスの参照への
キャストがアクセス不能であるといわれます.
なぜでしょうか?
0503502
2007/12/16(日) 12:42:32なぜでしょうか?っていうか,それが C++ の言語仕様だから?
知らんかった.
0504デフォルトの名無しさん
2007/12/16(日) 12:45:39protected だからに決まってる。
それはそうと、
Base::operator ==;
こんな宣言通るんだな。 using ってつけないとダメかと思ってた。
0505デフォルトの名無しさん
2007/12/16(日) 12:50:04悪いことはいわん。
先頭をアンダーバーではじめるのはやめとけ。
0506デフォルトの名無しさん
2007/12/16(日) 12:51:550507502
2007/12/16(日) 12:52:12ピンポイントで
public:
Base::operator ==;
宣言しているので問題ないと思ってました.
ちなみに比較演算子ではなくて適当な関数だと
public:
Base::foo;
で派生クラスから呼び出せます.
これはよく使っていた機能なんで,比較演算子でもやってみました.
呼び出しより前にキャストが起こるからダメなのか.
0508デフォルトの名無しさん
2007/12/16(日) 12:54:02> しかし &*p って 意味的には同じですよね
違う。
> 最近はイテレータはポインタとして変換されないんですね
単に一部の古い処理系がvector<T>::iteratorをT*でtypedefしてたせいで偶然コンパイルが通っていただけ。
C++がstrong typedefを持っていないのが原因とも言える。
0509デフォルトの名無しさん
2007/12/16(日) 12:55:34public派生ではない場合、is a 関係にはならんよ。
つまり、派生型から基底型への暗黙の変換は不可。
d1 == d2 は d1.operator==(d2)の意味だけど、d2をBase型へは
変換できない。
0510デフォルトの名無しさん
2007/12/16(日) 12:57:190511502
2007/12/16(日) 12:58:30なるほど,is-a の基本を忘れていました.ちなみに
Derived d1,d2;
Base b1;
assert(d1 == b1);
は問題なく通りました.
d1.operator == (b1) だから当然ですね.
0512デフォルトの名無しさん
2007/12/16(日) 12:58:510513デフォルトの名無しさん
2007/12/16(日) 13:00:28たまにCのソース弄るせいか結構typedefしちまうんだが
なんか弊害あったっけ?
0514デフォルトの名無しさん
2007/12/16(日) 13:06:16typedef じゃなくて名無し構造体の弊害として、前方宣言が利かない、
コンストラクタ・デストラクタが書けないってのがある。
名無しじゃなくてもクラス名と typedef 名が違うと前方宣言が使いにくい。
0515デフォルトの名無しさん
2007/12/16(日) 13:12:46変数名に同じ名前が使えなくなるってのも、あるかな。使わなきゃいいんだけど。
0516デフォルトの名無しさん
2007/12/16(日) 14:09:39どの本読んで勉強したんですか?
MSDNとか?
参考までに聞かせて
0517デフォルトの名無しさん
2007/12/16(日) 14:12:10>値渡しの引数を受け取った側でいじるってやらない?
引数名が表す意味と内容が合わなくなるからやめろ
って誰かが言ってた希ガス。
0518デフォルトの名無しさん
2007/12/16(日) 14:29:32俺もその意見に同意する。後で元の値欲しくなったとき困るから
よっぽど小さい関数でもなけりゃローカル変数にコピーしてから弄る
0519デフォルトの名無しさん
2007/12/16(日) 15:05:05typedefを付けていたんだが、無駄な事だと最近になって分かった
C++歴半年の俺
0520デフォルトの名無しさん
2007/12/16(日) 15:56:43Exceptional C++ に const int& でのパラメータ私を推奨する記述はなかった
ちなみに、あれは良書
当時、例外安全をあんなに大きく正しく取り扱った本は少なかった
今でも少ないか
古い本なので、今では陳腐化した情報もあるだろうけど
0521デフォルトの名無しさん
2007/12/16(日) 16:27:380522デフォルトの名無しさん
2007/12/16(日) 16:43:00環境依存で拾えるかもしれないが、環境書いてないしスレ違い。
0523デフォルトの名無しさん
2007/12/16(日) 16:47:34って配布中止になったんですか?
C++を始めようと思い解説サイトでおすすめ
していたので導入しようとおもったんですが
0524デフォルトの名無しさん
2007/12/16(日) 16:50:24おk
セグメント違反やアドレス例外が拾えたらラッキーだと思ったんだけど
少なくとも尋常な手段ではそういうOSがらみの例外は拾えないのね。
0525デフォルトの名無しさん
2007/12/16(日) 17:18:01signalでSIGSEGVをキャッチすればいけるんじゃね?
0526デフォルトの名無しさん
2007/12/16(日) 17:25:21代わりといっては何だけど
ttp://www.hi-ho.ne.jp/jun_miura/bccdev.htm
0527デフォルトの名無しさん
2007/12/16(日) 17:48:03公式BBSになんかのってるらしいと聞いた
0528デフォルトの名無しさん
2007/12/16(日) 18:18:050529502
2007/12/16(日) 18:19:370530デフォルトの名無しさん
2007/12/16(日) 18:41:310531デフォルトの名無しさん
2007/12/16(日) 19:20:46>>527
どうもです。
早速導入してみます。
0532デフォルトの名無しさん
2007/12/16(日) 19:31:2511.3 Access declarations やね。using ができる前のやつなんで deprecated になってる。
0534デフォルトの名無しさん
2007/12/17(月) 00:55:310535デフォルトの名無しさん
2007/12/17(月) 01:04:16まぁクラス定義をtypedefありで書かないことを考えれば当然とも言える。
ところで、typedef class X_ { ... } X; はコンパイル通るんだっけ?w
0536デフォルトの名無しさん
2007/12/17(月) 01:09:02せっかく処理系が面倒見てくれてる(struct省略できる)のに
わざわざ旧来の書き方をするのは無駄なんじゃね。
0537デフォルトの名無しさん
2007/12/17(月) 01:09:55構造体とクラスの区別が付きにくくなるから、ってのもある
>>535
出来る
0538デフォルトの名無しさん
2007/12/17(月) 01:50:560539デフォルトの名無しさん
2007/12/17(月) 01:56:32ランダムにソートさせて、
取得したカード2枚を比較するロジックを作って、
一致したら配列のカードが格納されていたところを空にして、
カードがなくなるまでゲームを続ければいけるんじゃね?
0540デフォルトの名無しさん
2007/12/17(月) 02:12:08なんとなく分かったんですが、
一致しなかった場合に裏返すっていうことできませんよね?
違った場合に裏返すってことをしたいんですが・・・
0541デフォルトの名無しさん
2007/12/17(月) 02:14:39できるじゃん
最初から裏返しにしておいて、
カードをめくるってアクションのときだけ、
配列にアクセスして、指定されたカードの情報をとって、
それを元にそのカードを表示させる
違ったら、その表示を非表示に変えればいいだけのこと
というか、俺はもう寝る
おやすみ
0542デフォルトの名無しさん
2007/12/17(月) 02:18:08↓行け。
スレ立てるまでもない質問はここで 87匹目
http://pc11.2ch.net/test/read.cgi/tech/1196509846/
0543デフォルトの名無しさん
2007/12/17(月) 09:10:24それともヴァージョンが違うだけでほとんど同じクラスだから、一つにまとめたほうがいいんでしょうか?
0544デフォルトの名無しさん
2007/12/17(月) 09:21:51なぜ同じ名前にするのかじっくり考える。
0545デフォルトの名無しさん
2007/12/17(月) 11:33:10できる
0546デフォルトの名無しさん
2007/12/17(月) 11:56:10状況による。
1.そもそもなぜ同じ名前のクラスがでてくるのか
2.1.が問題ないなら、片方のバージョンを保存しておく必要があるのか(後で使うことがあるのかなど)
0547デフォルトの名無しさん
2007/12/17(月) 16:07:46レスさんくすです。
結局そのクラスは機種依存だったので、一つに纏まりました。
しかし、C++って便利ですね。勉強になりました。
0548デフォルトの名無しさん
2007/12/17(月) 22:28:59それにあたって、学習に良いと思われる(書き方がやアルゴリズム良い)
オープンソースのプログラムが何かあれば教えていただきたいです。
今はJavaを主に使っているので、オブジェクト指向も理解してますし、
Cも昔やったのでポインタも問題ないです。
本でC++の文法も少しかじり、あとは生きたコードを見たいのですが、
よいものはありますでしょうか?
0549デフォルトの名無しさん
2007/12/17(月) 22:30:190550デフォルトの名無しさん
2007/12/17(月) 22:37:52オープンソースと呼んでいいか分からないが、ソフトバンク・パブリッシングのZIP/LHA本の
ソースコードはキレイだった。
0551デフォルトの名無しさん
2007/12/17(月) 22:58:55char a[len];
のようなコードは、C++の言語規格に準拠していますか?
C99だと問題ないらしいですが、C++は?
0552デフォルトの名無しさん
2007/12/17(月) 23:01:210553デフォルトの名無しさん
2007/12/17(月) 23:04:010554デフォルトの名無しさん
2007/12/17(月) 23:05:04boost ならお手本にしてもいいと思う
C++の最先端の1つでもある
でも初心者には厳しすぎるか
でも、array なんかはシンプルなのですぐに読める
あと、rational も簡単
変態的なものもあるが簡単なものもあるので、簡単なのから読んでいけば大丈夫だと思う
いちおう世界中で使われてる生きたライブラリ
0555デフォルトの名無しさん
2007/12/17(月) 23:05:09g++はいまでも通るんだけど。
0556デフォルトの名無しさん
2007/12/17(月) 23:07:28どうやって解決してるんだろ…
0557デフォルトの名無しさん
2007/12/17(月) 23:09:05または昔のCやC++でalloca使ってもいい。
0558557
2007/12/17(月) 23:12:54subl $48, %esp
みたいな、即値によるスタックポインタ移動が
movl %eax, 引数で渡された数
subl %eax, %esp
とかになるだけ。
0559デフォルトの名無しさん
2007/12/17(月) 23:17:49C++0xではC99が取り込まれる予定とか。
0560デフォルトの名無しさん
2007/12/17(月) 23:18:59しかし引数が原因でスタックオーバーフローで落ちるのはなんかデバッグが嫌だな
0561デフォルトの名無しさん
2007/12/17(月) 23:20:07レスありがとうございます。
今GCCを落としてみているところです。
boostについても調べてみます。
0562デフォルトの名無しさん
2007/12/17(月) 23:21:50VLAは0xでも採り入れられない予定だとおもった
0563デフォルトの名無しさん
2007/12/17(月) 23:26:19あんまり取り入れて欲しくないなあ。
C++はどこまでも静的であって欲しい
0564デフォルトの名無しさん
2007/12/17(月) 23:28:14soudane.
http://udrepper.livejournal.com/2006/05/25/ こういうことが起きるからなw
0565デフォルトの名無しさん
2007/12/17(月) 23:48:04最大値で確保しておく必要がなくなるから無駄が省けてる感がいい
0566デフォルトの名無しさん
2007/12/17(月) 23:50:010567デフォルトの名無しさん
2007/12/17(月) 23:50:350568デフォルトの名無しさん
2007/12/17(月) 23:54:22>>567
イラネ。erlangならやるかも。
0569デフォルトの名無しさん
2007/12/17(月) 23:59:18あれに全員が乗り換える未来は想像したくない。
Dなら良い
0570デフォルトの名無しさん
2007/12/18(火) 00:03:01なんでC++はコンパイラの実装のしやすさは放置してしまったのか。
なんで?
0571デフォルトの名無しさん
2007/12/18(火) 00:04:22お前の主観には答えられるのはお前だけ
0572デフォルトの名無しさん
2007/12/18(火) 00:07:250573デフォルトの名無しさん
2007/12/18(火) 00:08:080574デフォルトの名無しさん
2007/12/18(火) 00:08:400575デフォルトの名無しさん
2007/12/18(火) 00:27:49allocaはもうMSにも捨てられてるよ
安全でないというより遅いから
0576デフォルトの名無しさん
2007/12/18(火) 00:29:39何と比べて遅いんだ?
マシン語命令1-2個で実装される関数もどきが遅くなるはずないんだが。
スタック溢れの判定入れても10命令いかないだろう。
0577デフォルトの名無しさん
2007/12/18(火) 00:35:31Cの良いところってなんだ?
悪いところは結構思いつくが
0578デフォルトの名無しさん
2007/12/18(火) 00:38:09>>571
0579デフォルトの名無しさん
2007/12/18(火) 00:44:020580デフォルトの名無しさん
2007/12/18(火) 00:49:13void* から安全にキャストする方法って存在します?
void*だとdynamic_castは効かないし……static_castはミスると未定義だし……
0581デフォルトの名無しさん
2007/12/18(火) 00:52:09ない。void*の指し先の先頭1バイトに適当なタグを書いておくくらいか?気休めだが。
boostのanyを使って、void*をエミュレートするといい。
0582デフォルトの名無しさん
2007/12/18(火) 00:58:24アドレスってどれでも32bit何じゃないの?
0583デフォルトの名無しさん
2007/12/18(火) 01:01:18void*がstruct Xを指しているのに、誤ってstruct Y*にキャストして使ってしまったらまずかろうよ。
0584デフォルトの名無しさん
2007/12/18(火) 01:04:29void *p; として、(int) pとキャストしても、指すアドレスは変化しないと思うんだけど
コンパイル時に型として通るかどうかだけ何じゃないの?
0585デフォルトの名無しさん
2007/12/18(火) 01:08:24日本語でどうぞ
0586デフォルトの名無しさん
2007/12/18(火) 01:09:11それならコード書いてる時点で良く確認すればよい
0587デフォルトの名無しさん
2007/12/18(火) 01:09:42アドレスは変わらないが、XオブジェクトをYオブジェクトとして
アクセスしてしまう。
0588デフォルトの名無しさん
2007/12/18(火) 01:13:07その理屈だとdynamic_castもassertもいらないな。
コンパイラの警告もいらないし、デバッガも不要だし、OSのメモリ保護ももしかしたらいらないかもしれないな。
・・・お前限定で。
0589デフォルトの名無しさん
2007/12/18(火) 01:14:53お前は根本的に問題が分かっていない。
>>580はむしろ方が違う場合、実行時に例外でも何でもいいから知らせてくれってタイプだ。
やはり>>581しかないな。
ただし1バイトだと、アラインメントの問題があるから、
たとえば4バイトとか、環境に応じて適切にしたほうがいい。
Boost.Anyを使うならば、なお良い。
0590デフォルトの名無しさん
2007/12/18(火) 01:15:14MFCのうんこコールバックとか使ったこと無いのか?MFCに限らずコールバック関係は
void*が結構使われたりする。
0591デフォルトの名無しさん
2007/12/18(火) 01:16:280592デフォルトの名無しさん
2007/12/18(火) 01:17:27なんの疑いもしないバグは探すのが困難
0593デフォルトの名無しさん
2007/12/18(火) 01:40:17実行環境が自動で疑ってくれるほうが楽だとは思わんかね?
0594580
2007/12/18(火) 01:50:40やっぱり無いか……
実はboost::anyでこういうのをやろうとしたんだけど上手くいかなかったんで、
なんか回避策は無いかな、と探していたところでした……
class A {};
class AA : public A{};
int main() {
AA aa;
boost::any testAA(&aa);
if (boost::any_cast<A*>(&testAA)) {
std::cout << "testAA* == A*" << std::endl;
}
}
anyからアップキャストしたポインタ or 参照を取り出したい、というのが希望です。
anyの実装見る限りは出来そうに無いのですが……
0595デフォルトの名無しさん
2007/12/18(火) 01:56:06boostスレで効いたら?
0596デフォルトの名無しさん
2007/12/18(火) 02:00:02アドレスと型をもつクラスでも作れ
0597デフォルトの名無しさん
2007/12/18(火) 08:43:40なんでもかんでも入れちゃうはしたない言語なんだろ?C++は。
0598デフォルトの名無しさん
2007/12/18(火) 08:57:460599デフォルトの名無しさん
2007/12/18(火) 09:25:37多くのCPUでコンパイル可能な言語なんて今さら作れないんじゃないかな。
だからC/C++は高級アセンブラとしてずっと残るように思う。
0600デフォルトの名無しさん
2007/12/18(火) 15:33:070601デフォルトの名無しさん
2007/12/18(火) 17:37:44boost::any testAA(static_cast<A*>(&aa));
という手もあるが、今度はAA*として取り出せなくなる罠。
0602デフォルトの名無しさん
2007/12/18(火) 17:39:42新機能の搭載も、まずは C との互換が大前提。
逆に、搭載されていないものは C のシンタックスを破壊するものらしい。
0603デフォルトの名無しさん
2007/12/18(火) 18:27:25の意見に補足すると、C++のコードは一旦Cのコードに変換される
C++の前進が、C with ClassesとBjarne Stroustrupに命名された由縁である
0604デフォルトの名無しさん
2007/12/18(火) 18:57:36仕様変更で古いコードがコンパイル不能にならないように、
あるいは、なったとしてもほとんど無視できる程度になるように配慮している。
以前はCに変換してたけど、今は直接オブジェクト・コードを吐いてるはず。実装依存かな。
0605デフォルトの名無しさん
2007/12/18(火) 20:00:220606デフォルトの名無しさん
2007/12/18(火) 23:18:130607デフォルトの名無しさん
2007/12/18(火) 23:31:47特に効率も落ちないかもしれないし
0608デフォルトの名無しさん
2007/12/18(火) 23:44:040609デフォルトの名無しさん
2007/12/19(水) 00:04:210610デフォルトの名無しさん
2007/12/19(水) 07:56:21読んだ記憶がある。
0611デフォルトの名無しさん
2007/12/19(水) 14:49:22させたいのですが可能でしょうか?
内部で自分が最前面化したウィンドウを覚えておくのではなく、
最前面化されているかどうかを取得できればいいのですが。
0612デフォルトの名無しさん
2007/12/19(水) 17:26:010613デフォルトの名無しさん
2007/12/19(水) 18:06:160614デフォルトの名無しさん
2007/12/19(水) 18:42:380615デフォルトの名無しさん
2007/12/19(水) 18:43:390616611
2007/12/19(水) 19:47:59Win32APIいってきます
0617デフォルトの名無しさん
2007/12/19(水) 21:53:54配列を初期化する場合、コンストラクタの初期化子では初期化できないのでしょうか?
初期化したい内容(値)が決まっていればいいのですが、配列の生成時には決まっていないので
とりあえず、配列の個数だけ""で初期化したいのですが?
具体的には
buff[] = {"","",""};
このような事を、コンストラクタの初期化子で行いたいのですが
0618デフォルトの名無しさん
2007/12/19(水) 22:10:390619デフォルトの名無しさん
2007/12/19(水) 22:17:10617です
そうですか、あきらめました
0620デフォルトの名無しさん
2007/12/19(水) 22:59:49出来るからw
0621デフォルトの名無しさん
2007/12/19(水) 23:02:06というのは、
クラス::メソッド
と思っていいの?
0622デフォルトの名無しさん
2007/12/19(水) 23:08:420623デフォルトの名無しさん
2007/12/19(水) 23:10:03名前空間::型名 かも
0624デフォルトの名無しさん
2007/12/19(水) 23:14:290625デフォルトの名無しさん
2007/12/19(水) 23:37:260626デフォルトの名無しさん
2007/12/19(水) 23:57:13そうなのか、どうやって書いたらええの?
教えてくれろ
0628621
2007/12/20(木) 00:01:090629624
2007/12/20(木) 00:01:18C++にはメソッドなんてものはないのだ
0630621
2007/12/20(木) 00:08:07名前空間::クラス::メソッド
って感じなんでしょうか?それを
public:
やら
private:
の下に書くと、中のメンバを隠したりできて・・・合ってます?
他にCとの重要な違いとかあったら教えてください。
>>629
マジっすか!
動作がメソッドだ。ってC++の入門書にまことしやかに書いてあるけどなぁ。。
厳密に言うと、「 」と呼ぶ、みたいなこと?
0631デフォルトの名無しさん
2007/12/20(木) 00:09:0510行程度で
意味のある説明が
もらえると
考えてる奴には
とうてい
習得不可能な
言語。
あきらめろ。
0632621
2007/12/20(木) 00:13:170633デフォルトの名無しさん
2007/12/20(木) 00:14:42それを記すにはこの余白は
あまりにも狭すぎる
0634デフォルトの名無しさん
2007/12/20(木) 00:18:19+ some improvements
+ // comments
+ clases
+ template meta programming
+ STL
あと3行は任せた
0635デフォルトの名無しさん
2007/12/20(木) 00:20:10>他にCとの重要な違いとかあったら教えてください。
入門書を読んでいるなら、Cとの違いとか書いてないの?
Cと比較して説明していない本だとしても、Cを理解しているなら自分で違いが分かるだろ。
この手の掲示板は、やる気や向上心ののある人に対しては教えたがりの人があれこれ構ってくれるが、
楽したい、自分で調べる気はない、なんて奴は相手にされない。
いいから、まずお前が持ってる入門書とやらをちゃんと嫁。
それで分からないところがあれば聞きに来い。
>動作がメソッドだ。ってC++の入門書にまことしやかに書いてあるけどなぁ。
オブジェクト指向の言語で一般的にメソッドと呼ばれているものは、C++では関数だ。
C++の規格としては、メソッドと呼ばれるものは存在しない。
0636デフォルトの名無しさん
2007/12/20(木) 00:23:52+ exceptions
0637デフォルトの名無しさん
2007/12/20(木) 00:27:17C++が継承・包含しているもののほうに「メソッド」は
定義されていると見た方が良い。
0638621
2007/12/20(木) 00:31:54>>635
Cとの違いというか、C++だけの大きな特徴というか・・・
Cを覚えるのだけで疲弊しきってしまってC++を覚えるパワーが・・・・
パワーを蓄えてからまた来ます。失礼しました。
0639デフォルトの名無しさん
2007/12/20(木) 01:16:06パクリかよw
ダセ
0640デフォルトの名無しさん
2007/12/20(木) 01:29:47そう、パクリ。
でもいろんな面でほどほどにオリジナル (C)と似ているところもあったから、
付いてくる人間がいた。
ださくても、下手な言語よりはよっぽどましに使える。
0641デフォルトの名無しさん
2007/12/20(木) 02:06:18挙げた例がパクリかと
0642デフォルトの名無しさん
2007/12/20(木) 02:12:17+ハゲ
+ヒゲ
さいごの一行を誰か頼む。
0643デフォルトの名無しさん
2007/12/20(木) 02:18:00スレの情報密度が下がる。自重汁
0644デフォルトの名無しさん
2007/12/20(木) 05:43:58自分のレスの情報量と質はどのくらいに見積もってる?
0645デフォルトの名無しさん
2007/12/20(木) 10:08:15オブジェクト指向言語でメソッドと呼ばれるものは、
C++では「メンバ関数」って言われてる。
0646デフォルトの名無しさん
2007/12/20(木) 10:31:170647デフォルトの名無しさん
2007/12/20(木) 10:52:26…風雲黙示録を思いだしたよ。懐かしいなぁ。
0648谷
2007/12/20(木) 13:26:200649デフォルトの名無しさん
2007/12/20(木) 16:11:480650デフォルトの名無しさん
2007/12/23(日) 17:52:39のように関数テンプレートについても短いエイリアスを付ける方法はないでしょうか?
typedef並にスマートな方法を教えてください。
0651デフォルトの名無しさん
2007/12/23(日) 17:58:48関数テンプレートの呼び出しは、普通はコンパイラによる型の推測(deduction)があるから
typedef的なものは不要なわけで、>>650がどう困っているのかその特殊ケースを晒さない
ことには答えにくい。
0652650
2007/12/23(日) 18:03:29template <bool b, typename T> T func(T a){} これを
typedef func<true, char> myalias; こんな感じにしたいです。
0653デフォルトの名無しさん
2007/12/23(日) 18:05:16(1) いまはそれをどう呼んでいるんだ?
(2) func()は特殊化する予定?しない予定?
0654650
2007/12/23(日) 18:10:18(1) char r = func<true, char>('a'); こんな感じです。
(2) 特殊化する予定は有りません。特殊化するかどうかによって事情が変わってきます?
0655デフォルトの名無しさん
2007/12/23(日) 18:11:02inline T myalias(T a){
return func<true, char>(a);
}
0656デフォルトの名無しさん
2007/12/23(日) 18:14:06{ return func<true,>(a); }
0657デフォルトの名無しさん
2007/12/23(日) 18:16:37char r = func<true>('a'); と、Tは省略できる。それで我慢したらどうよ。
0658デフォルトの名無しさん
2007/12/23(日) 18:28:07回答ありがとうございます。やはりtypedefのようにはいかないみたいですね。
ラッパー関数を作るか、#define の使用も検討してみます。
0659デフォルトの名無しさん
2007/12/23(日) 18:54:270660デフォルトの名無しさん
2007/12/23(日) 19:27:06void JicharaMove(int movable){
}
のようなときなんですけれど…
0661デフォルトの名無しさん
2007/12/23(日) 19:28:32よくわからんな。そのままだろ。
自分でどうやって、期待した結果と何が違ったのか書いてみれ。
0662デフォルトの名無しさん
2007/12/23(日) 19:30:35とヘッダーでプロトタイプ宣言しているのですが、
Error: 外部シンボル 'JicharaMove()' が未解決
とでてしまうのです
0663デフォルトの名無しさん
2007/12/23(日) 19:53:110664デフォルトの名無しさん
2007/12/23(日) 19:56:430665デフォルトの名無しさん
2007/12/23(日) 19:59:060666デフォルトの名無しさん
2007/12/23(日) 20:08:270667デフォルトの名無しさん
2007/12/23(日) 23:58:42for ( counter=counter1=1 ; ; counter++) {
....
}
何者ですか、これは・・・・Orz ここで何が起こってるんですか・・・
0668デフォルトの名無しさん
2007/12/24(月) 00:01:44常に真として扱われる。
0669デフォルトの名無しさん
2007/12/24(月) 00:09:07counter = (counter1 = 1)
ってだけだから
0670デフォルトの名無しさん
2007/12/24(月) 00:11:35for ( int counter=1,int counter1=1 ; counter=1,counter1=1 ; counter++) {
....
}
てな意味でしょうか??(あてずっぽうで書いてます)
0671デフォルトの名無しさん
2007/12/24(月) 00:12:23for ( counter=counter1=1 ; true; counter++)
0672デフォルトの名無しさん
2007/12/24(月) 00:14:49すみません、これ↓
counter=counter1=1
が既に分からないです。
counter にも、counter1 にも 1 を代入してるってことでしょうか?
これは C++?
0673デフォルトの名無しさん
2007/12/24(月) 00:18:01int counter1 = 1:
int counter = counter1;
をまとめたもの。
代入文は代入された値として評価されるから、
printf( "%d\n", ( i = 5 ) );
だと 5 が表示される。
0674デフォルトの名無しさん
2007/12/24(月) 00:25:18あ、なるほど・・
最初に counter1 に 1 が入って、その counter1 を counter に代入して、、って感じですね。
for ( counter=counter1=1 ; true; counter++)
だと、counter の値は回を重ねるごとにどう変化していき、いつ、この for文は終わるんでしょうか?
0675デフォルトの名無しさん
2007/12/24(月) 00:30:080676デフォルトの名無しさん
2007/12/24(月) 00:34:530677デフォルトの名無しさん
2007/12/24(月) 00:39:21counter1 はずっと 1 のままで、counter だけ永遠に 1 足されて表示
されるんですね。どうもありがとうございました。
0678デフォルトの名無しさん
2007/12/24(月) 02:28:21ついでに言うと、counterとcounter1は前に宣言されているのを流用している。
……こりゃあ、あんまり良いコードじゃないな。
コードの意図が判らんと何とも言えんけど、
- counterとcounter1はループの外で代入した方がいい。
- counterのインクリメントはループのブロックに取り込んだ方が良い。
だとオモ
0679デフォルトの名無しさん
2007/12/24(月) 03:46:56・正の整数値を読み込みその桁数を出力する
・1からnまでの和をfor文で求める
この2つがわかりません;;教えてください;;
0680デフォルトの名無しさん
2007/12/24(月) 04:27:18下、動作未確認。
#include<iostream>
int main(void){
int n;
std::cin >> n;
int sum = 0;
for(int i = 1; i <= n; i++){
sum+=i;
}
std::cout<<sum;
return 0;
}
0681デフォルトの名無しさん
2007/12/24(月) 04:29:24上、動作未確認。
#include<iostream>
int main(void){
int n;
std::cin >> n;
int digit = 0;
for(;n>0;n/=10){
digit++;
}
std::cout<<digit;
return 0;
}
0682デフォルトの名無しさん
2007/12/24(月) 09:52:45unsigned nofdigit(unsigned foo) {return unsigned(log(double(foo)) / log(10.)) + 1;}
template<int N>sum1() {return (N + 1) * N / 2;}
つーか、スレ違い。宿題なら宿題スレへ、そうでないなら初心者スレへ。
0683デフォルトの名無しさん
2007/12/24(月) 13:05:21int sum( int n ) {
for(;n;) {
return n + sum( n-1 );
}
return 0;
}
0684デフォルトの名無しさん
2007/12/24(月) 13:29:04struct A {};
struct AA : public A {
void test() { std::cout << "Test " << std::endl; };
};
struct Base {
virtual A& data() { static A a; return a; };
};
struct Derived : public Base {
virtual AA& data() { static AA aa; return aa; };
};
int main() {
Derived d;
d.data().test();
Base* pb(&d);
//pb->data().test(); // コンパイルエラー
static_cast<Derived*>(pb)->data().test();
};
ということで、多態して使おうとするとエラーになってしまいます。
こういう使い方はNGなのでしょうか?
0685デフォルトの名無しさん
2007/12/24(月) 13:33:540686デフォルトの名無しさん
2007/12/24(月) 13:36:01pb->data()が返す型は、あくまでBase::dataで宣言されたA&。
だからAAのメンバは使えない。
0687デフォルトの名無しさん
2007/12/24(月) 14:11:460688デフォルトの名無しさん
2007/12/24(月) 20:32:59(つまり最初にコンストラクタが呼び出される前に)
静的変数の初期化をしたいよ・・・
0689デフォルトの名無しさん
2007/12/24(月) 20:37:44typeid は演算子なのに,その返り値のクラスは
#include <typeinfo> で定義されてるんですよね.
まぁそれって sizeof 演算子の戻り値が size_t なのと
似ているのかもしれないけど,それもなんか気持ち悪い気が
するのは俺だけ?
0690デフォルトの名無しさん
2007/12/24(月) 20:41:23現状でもその要件は満たしているようだが、何が不満なのかね?
0691デフォルトの名無しさん
2007/12/24(月) 20:48:08Java の静的初期化子のようなものを想定していました
0692デフォルトの名無しさん
2007/12/24(月) 21:28:210693デフォルトの名無しさん
2007/12/24(月) 21:42:35(1)シングルトンパターンを使う
(2)Schwarzカウンタを使う
0694デフォルトの名無しさん
2007/12/24(月) 21:47:060695デフォルトの名無しさん
2007/12/24(月) 22:19:33誰か教えてお願い
0696デフォルトの名無しさん
2007/12/24(月) 22:40:380697デフォルトの名無しさん
2007/12/24(月) 23:18:32struct hoge {};
struct hogehoge : virtual hoge {};
ってな書き方してあるんだけど、どういう意味?
継承するときに使えるアクセス指定子は、
public, protected, private
のみだと認識してたんだが
0698デフォルトの名無しさん
2007/12/24(月) 23:19:380700デフォルトの名無しさん
2007/12/25(火) 00:36:12(main等は省略)
01 class Test{
02 int *p;
03 unsigned int m;
04 public:
05 Test(unsigned int mm){
06 int (*pp)=new int[mm]; //配列ppを生成
07 p=pp;
08 m=mm;
09 for(unsigned int i=0;i<m;i++)p[i]=0; //テキトーに値を代入
10 };
11 ~Test(void){
12 delete[]p; //配列ppを削除(できてるのか心配)
13 };
14 }x(10);
0701デフォルトの名無しさん
2007/12/25(火) 00:41:11その一部分を見た限りではメモリリークはしないと思うけど?
0702デフォルトの名無しさん
2007/12/25(火) 01:07:17コピコンと代入演算子がないのでメモリリークする。
0703デフォルトの名無しさん
2007/12/25(火) 01:31:230704デフォルトの名無しさん
2007/12/25(火) 01:37:27メモリリーク+二重解放だな。
してなければメモリリークしないが。
0705デフォルトの名無しさん
2007/12/25(火) 01:46:50いまどき見ないソースだな
0706デフォルトの名無しさん
2007/12/25(火) 01:51:010707デフォルトの名無しさん
2007/12/25(火) 02:39:02ども、ありがとございます。
自分で考えたのでこんなソースは見ないと思う。
vectorは勉強してないからわからないんだ。
0708デフォルトの名無しさん
2007/12/25(火) 03:09:23安心しろ。>700みたいな心配する暇でvectorくらい使えるようになるから。
0709デフォルトの名無しさん
2007/12/25(火) 03:33:50STLとかBoostとかの仕様をパッとみると、
スクリプトのようにお手軽でしかも美しいコードが
ネイティブコードでコンパイルできちゃうという
夢のような話に思えてくるんですが、
実際のところどうなんでしょうか。
0710デフォルトの名無しさん
2007/12/25(火) 07:43:10気が付くと、これなんかのスクリプティング言語だろ、と思いたくなるコードになっていることはある。
話は逸れるけど、VC++で#importを使うときもVBS、JSみたいなノリだなあと思う。
0711デフォルトの名無しさん
2007/12/25(火) 10:04:37「評価」されて順番が変わったり無くなったりするわけで。
つまりあらゆる言語はスクリプトなんだよ
0712デフォルトの名無しさん
2007/12/25(火) 10:11:000713デフォルトの名無しさん
2007/12/25(火) 13:17:32「基底クラスBaseから派生するクラス全て」という条件で特殊化するにはどうしたら良いでしょうか。
今は派生するクラス全てに対して一つ一つ特殊化しているので一般化したいのです。
サンプル
#include <iostream>
using namespace std;
class Base {
};
class Sub: public Base {
};
template<typename T>
void test(T* tp) {
cout << "T" << endl;
}
template<>
void test(Base* bp) {
cout << "Base" << endl;
}
int main(int argc, char* argv[]) {
test(new Base());// Base
test(new Sub());// T (ここをBaseにしたい)
return 0;
}
0714デフォルトの名無しさん
2007/12/25(火) 13:33:49そういう特殊化はできないような覚えがあるんだけど、
> void test(Base* bp) {
こいつをテンプレートにしなけりゃやりたいことはできるんじゃね?
0715デフォルトの名無しさん
2007/12/25(火) 13:47:39boost::mplとboost::type_tritsを使うと簡潔
#include <boost/type_traits/is_base_of.hpp>
#include <boost/mpl/if.hpp>
#include <iostream>
struct Base {};
struct Sub:public Base{};
struct Another{};
struct tag_specialized{};
template <typename T> void test_() {
std::cout << "T" << std::endl;
}
template <> void test_<tag_specialized>() {
std::cout << "Base" << std::endl;
}
template <typename T> void test(T*) {
test_< typename boost::mpl::if_< boost::is_base_of<Base,T>, tag_specialized, T >::type >();
}
int main() {
test(new Base);
test(new Sub);
test(new Another);
}
0716デフォルトの名無しさん
2007/12/25(火) 23:06:46すぐに加速しちゃうのは嫌いなので、>>714 さんを参考に地道に書いてみました。
#include <iostream>
using namespace std;
struct Another { void foo() { cout << "Another::foo invoked." << endl; } };
struct Base { virtual void bar() { cout << "Base::bar invoked." << endl; } };
struct Sub: Base { void bar() { cout << "Sub::bar invoked." << endl; } };
template <typename Lhs, typename Rhs> struct IsBaseOf {
struct True {};
struct False { int i; };
static const bool result = sizeof(testAssignable(static_cast<Rhs*>(0))) == sizeof(True);
static True testAssignable(Lhs*);
static False testAssignable(...);
};
template <bool Cond, typename Then, typename Else> struct If;
template <typename Then, typename Else> struct If<true, Then, Else> { typedef Then result; };
template <typename Then, typename Else> struct If<false, Then, Else> { typedef Else result; };
template <typename T> void test_(T* p) { p->foo(); }
template<> void test_<Base>(Base* p) { p->bar(); }
template <typename T> void test(T* p) { test_< typename If<IsBaseOf<Base, T>::result, Base, T>::result >(p); }
int main() {
test(new Base());
test(new Sub());
test(new Another());
}
0717713
2007/12/25(火) 23:15:11ありがとうございます。
とても参考になりました。
複雑なtemplateは書いたことがなかったのですがこれを期に学習します。
0718デフォルトの名無しさん
2007/12/26(水) 00:01:43X86においてネイティブは存在しない(全てInterpretative)という意味では概ね同意する。
0719デフォルトの名無しさん
2007/12/26(水) 06:49:21左右が反転しているだけで他は同じ処理をする木構造のコードを、
今までは関数へのポインタを使って一つにまとめていました。
get_right( p ){ return p ? p->r : NULL; } /* 右枝 */
get_left( p ){ return p ? p->l : NULL; } /* 左枝 */
hogehoge( p, get_right, get_left ); /* 左側 */
hogehoge( p, get_left, get_right ); /* 右側 */
hogehoge( p, right, left ) {
return left( right( p ) );
}
このコードの
left( right( p ) );
という内から外へ読まなければならない部分が個人的には嫌いでした。
最近C++を習い始めて、テンプレートや演算子定義などを使えば
p->right()->left();
のように左から右に読めるコードが書けるのではないかと思うようになりました。
・左から右に読めるようにする。
旧 get_right()/get_left() を CNode のメンバ関数にした。
・関数内の左右の意味を反転させる。
関数テンプレートとファンクタで出来た。
というところまでは試してみたのですが、最後に2つを1つにまとめるところで苦労しています。
どのような解決方法があるでしょうか。
どうぞよろしくお願いします。
0720デフォルトの名無しさん
2007/12/26(水) 06:55:14単純に
p->get(right)->get(left);
とすればできる。
別にCでも書ける。
p->get(p, right)->get(p, left);
ほら。
0721デフォルトの名無しさん
2007/12/26(水) 10:21:53typedef Node* (Node::*getNode)();
Node* hogehoge(Node* n, getNode left, getNode right){
return n->*left->*right;
}
まあleftとrightの2種類しかないなら、定数で指定でもさせた方が楽だとは思うけど
0722デフォルトの名無しさん
2007/12/26(水) 10:25:31typedef Node* (Node::*getNode)();
Node* hogehoge(Node* n, getNode left, getNode right){
return ((n->*left)()->*right)();
}
確かに括弧が多くて嫌だなこれ
0723デフォルトの名無しさん
2007/12/26(水) 13:49:38Cだと、、、たぶん綺麗には不可能だな。
C++:
Node *&get(bool left){return left ? m_l: m_r;}
p->get(1)->get(0) = q->get(1);
// O.K.!! p->left->right = q->left; と同じ!
C:
node_t *get(node_t *p, bool bleft){return bleft ? p->right: p->right;}
p->get(p,1)->get(p,0) = q->get(q,1);
/* p->left->right = q->left; の意味だができない、、、 */
0724デフォルトの名無しさん
2007/12/26(水) 17:52:56Null Object で解決できそうだが。
0725デフォルトの名無しさん
2007/12/26(水) 18:41:03どうにも説明しにくいので、(1)〜(3)については次レスに具体的なコードを載せておきます。
コンパイラはbccです。
(1)
template <int N> void operator ()(int x);
上記のような引数による推論ができないタイプのテンプレートオペレータの場合、
どのようにテンプレート引数を指定すればいいのでしょうか。
とりあえずは(3)に示すようなやり方でできるにはできたのですが、もっと自然な記法は無いでしょうか。
(2)
(1)に関して、とりあえず
(object.*(&Class::operator()<5>))(4);のように呼び出したら、
"このコンテキストではオーバーロードの意味が曖昧"と怒られました
どのような状況と曖昧でしょうか?
(3)
最終的にキャストすることでテンプレート引数を指定しつつ呼び出すことはできました。
typedef void (Class::&CP)(int);
(object.*(CP)(&Class::operator()<5>))(4);
が、どういうわけかこれを続けて呼び出すと前のテンプレート引数を引きずってしまいます。
(分かりにくいと思うのでコードを見てください)
何故でしょうか。
(4)
メンバ関数ポインタを宣言する際、
void (Class::*p)(int);のようにやりますが、()よりも::の方が優先順位が高いのだから、
void Class::(*p)(int);とやっても大丈夫かと思ったのですが、ダメでした。
何故でしょうか?
0726725
2007/12/26(水) 18:43:28using namespace std;
class Foo{
public:
template <int N> void func(int n){
cout << N+n << endl;
}
template <int N> void operator()(int n){
cout << N*n << endl;
}
};
typedef void (Foo::*FP)(int);
int main(){
Foo f;
f.func<6>(8); //14
f.func<9>(2); //11
// f<7>(5); ERROR
// f(5)<7>; ERROR "一致するものが見つからない"
// f(<7>5); ERROR "構文エラー"
// (f.*((&Foo::operator()<3>)))(9); ERROR "曖昧"
(f.*((FP)(&Foo::operator()<3>)))(9); //27
(f.*((FP)(&Foo::operator()<7>)))(12); //36(84と出て欲しい)
return 0;
}
お願いします
0727725
2007/12/26(水) 18:45:53::よりも()の方が優先順位が上ですね
0728デフォルトの名無しさん
2007/12/26(水) 19:06:14f.operator()<6>(8);
とかじゃ嫌?
0729725
2007/12/26(水) 19:10:28あ、そんなやり方できたんですね……
何でわざわざメンバ関数ポインタにしたりしてたんだろorz
ありがとうございます。
>>725の(2)と(3)については引き続きお願いします。
0730725
2007/12/26(水) 19:28:28>>726に示したような状況特有の問題かと思ったんですが、もうちょっと簡単な例でも起こりました。
#include <iostream>
using namespace std;
class Foo{
public:
template <int N> void func(int n){
cout << N << ',' << n << endl;
}
template <int N> void operator()(int n){
cout << N << "." << n << endl;
}
};
typedef void (Foo::*FP)(int);
int main(){
Foo f;
f.func<6>(8); //6,8
f.func<9>(2); //9,2
f.operator()<2>(9); //2.9
f.operator()<10>(-1); //2.-1
f.operator()<100>(3); //2.3
return 0;
}
このように、オペレータに限り最初のテンプレートを引きずってしまいます。
bccのバグでしょうか?
0731デフォルトの名無しさん
2007/12/26(水) 19:31:590732デフォルトの名無しさん
2007/12/26(水) 19:32:430733725
2007/12/26(水) 20:31:52#include <iostream>
#include <vector>
using namespace std;
template <template <class> class T>
class Foo{
public:
template <class T> void func(const T &x){
std::cout << typeid(T).name() << std::endl;
}
};
template <class> class Hoge{};
int main(){
Foo<vector> f; //int
f.func(1); //int
f.func(2.8); //int
f.func<double>((double)4.889); //int
Foo<Hoge> f2;
f2.func(1); //int
f2.func(2.8); //double
f2.func<double>((double)4.889); //double
return 0;
}
何故か自作クラスではOK
他にdeque,list,stack等で確認
0734725
2007/12/26(水) 20:33:170735デフォルトの名無しさん
2007/12/26(水) 21:36:06それでもgcc3.4とvc8ではちゃんとにi,d,d,i,d,dになっとりました
多分にバグですね
0736デフォルトの名無しさん
2007/12/26(水) 21:45:25とでも思ってたほうがいいんでないの。
0737デフォルトの名無しさん
2007/12/26(水) 22:02:490738デフォルトの名無しさん
2007/12/27(木) 00:25:440740デフォルトの名無しさん
2007/12/27(木) 05:05:25古いCでは proc() と proc(void) とでは意味が違ったのですが、C++では同じ意味なのでしょうか?
また、皆さんは実際に自分では何れのスタイルで書いていますか?
style A:
Class();
~Class();
style B:
Class(void);
~Class();
style C:
Class();
~Class(void);
style D:
Class(void);
~Class(void);
0741デフォルトの名無しさん
2007/12/27(木) 05:11:59C++ では同じ。だから (void) は面倒なだけで書かないほうが多い。
最新の C でも () は (...) と同じだから (void) と書かないといけない。
同じ意味の2つを混ぜるのはありえないので style A がいい。
0742デフォルトの名無しさん
2007/12/27(木) 07:00:520743デフォルトの名無しさん
2007/12/27(木) 10:23:15うわーん。気になって眠れないよぉ。
0744デフォルトの名無しさん
2007/12/27(木) 12:30:450745デフォルトの名無しさん
2007/12/27(木) 13:52:50dynamic_castがよく分かりません。
dynamic_castは実行時に型を調べて変換できるときだけ変換する物、と思っていたのですが、
型を覚えているならvoid*型からだって変換できるはずじゃありませんか?
何故できないんでしょうか。
#include <iostream>
class Base {public:virtual ~Base(){}};
class Derived : public Base {};
class Foo : public Base {};
int main(){
Base *p[2] = {new Derived, new Foo};
for(int i=0; i<2; ++i){
if(dynamic_cast<Derived*>(p[i]) == NULL)std::cout << i <<":FAILED\n";
else std::cout << i <<":SUCCEEDED\n";
}
void *q = new Derived;
// ↓ERROR 'void' 型は仮想関数をもつクラスとして定義されていない
// if(dynamic_cast<Derived*>(q) == NULL)std::cout << "void*:FAILED\n";
// else std::cout << "void*:SUCCEEDED\n";
return 0;
}
dynamic_castは仮想関数を含む物にしか使えない仕様だから、と言われればそれまでなんですが、
型を覚えていることができるなら、このようなvoid*型からのキャストを安全に行うキャストが存在しうると思うんですが、どうなんでしょうか。
それともそもそも「型を覚えている」わけじゃないんでしょうか?
0746デフォルトの名無しさん
2007/12/27(木) 14:26:47変換元の型が仮想関数を持つ場合は、仮想関数テーブルの引き方がわかるので大丈夫だが、
void*では仮想関数テーブルがあるのかないのかはっきりしない
もし、本当はない型(例えばint)なのに、あると仮定してアクセスすると、アクセス違反で落ちるかもしれん
そのvoid*がBase*だとわかってるなら dynamic_cast<Derived*>(static_cast<Base*>(q)) とすればいいだろうけど
それすらも不明な状況では無理
0747デフォルトの名無しさん
2007/12/27(木) 14:28:46#include <iostream>
#include <typeinfo>
int main(){
int x;
const type_info& info = typeid(x);
std::cout << info.name() << std::endl;
return 0;
}
>エラー E2304 test.c 6: <定数> 変数 'type_info' には初期化が必要(関数 main() )
お願いします。
0748デフォルトの名無しさん
2007/12/27(木) 14:33:500749デフォルトの名無しさん
2007/12/27(木) 14:34:22なるほど、仮想関数テーブルが型情報を調べるキーになるわけですね……ありがとうございます。
ということは>>745みたいな感じでvoid*を通してあらゆるポインタを画一的に扱うには、
typeidを保持しておくvoid*ラッパーでも作ればいいんでしょうか……。
ということで誰か>>747もお願いします。
0750デフォルトの名無しさん
2007/12/27(木) 14:35:08それだ! できました、ありがとうございます!
こんな簡単なことで悩んでたとは……orz
0751デフォルトの名無しさん
2007/12/27(木) 15:05:24そんなあなたに boost::any
0752デフォルトの名無しさん
2007/12/27(木) 15:13:36#include <iostream>
struct Hoge{};
struct Foo{
template <typename T> T print();
};
template <typename T> T Foo::print(){
std::cout << "print function." << std::endl;return T();
}
//↓ERROR 'print<Hoge>()' は 'Foo' のメンバーではない
//template <> int Foo::print<Hoge>(){
// std::cout << "print function. parameter is Hoge. return int." << std::endl;
// return 1;
//}
template <> Hoge Foo::print<Hoge>(){
std::cout << "print function. parameter is Hoge." << std::endl;
return Hoge();
}
int main(){
Foo f;
f.print<int>();
f.print<Hoge>();
return 0;
}
>>751
調べてみます。
ありがとうございます。
0753デフォルトの名無しさん
2007/12/27(木) 15:37:13なんでもかんでも関数テンプレートでする必要はないんだよ?
オーバーロードなどと使い分けろ
boost::typeみたいな型を使ってオーバーロードすればやりたいことはできる。
struct Foo{
template <typename T> T print(boost::type<T>);
int print(boost::type<Hoge>);
};
template <typename T> T Foo::print(boost::type<T>){
(略)
}
int Foo::print(boost::type<Hoge>){
(略)
}
int main(){
Foo f;
f.print(boost::type<int>());
f.print(boost::type<Hoge>());
return 0;
}
戻り値の型をtypename boost::mpl::if_<boost::is_same<T, Hoge>, int, T>::type見たいにすれば特殊化でも戻り値の型を変えられたっけ?
試してないけど
0754デフォルトの名無しさん
2007/12/27(木) 15:55:46template <typename T> T print();
って宣言されてんだから、どう考えても
(T=intの場合) int print<int>()
か
(T=Hogeの場合) Hoge print<Hoge>()
にしかならない
もう1個テンプレートクラスかませて
template <typename T> PrintReturn<T>::type print();
として
template<T> class PrintReturn { public: typedef T type; };
template<> class PrintReturn<Hoge> { public: typedef int type; };
とすればいいんじゃないかな
そしたら
(T=intの場合) PrintReturn<int>::type print<int>() → int print<int>()
(T=Hogeの場合) PrintReturn<Hoge>::type print<Hoge>() → int print<Hoge>()
になると思う
0755デフォルトの名無しさん
2007/12/27(木) 16:09:34そうです、725=752です。
とにかく特殊化では戻り値の型は変えられないってことですね?
boostは全くわからないんですが、ぼちぼち手をつけてみようと思います。
ありがとうございます。
>>754
おお、そんなテクニックが……本当に面白いですねテンプレートは。
ありがとうございます、参考になります。
ついでに質問なんですが、>>752とは違い引数から推論可能なタイプの関数テンプレートで、
ある型について特別バージョンを作りたい時に特殊化を用いるのとオーバーロードを用いることの違いは、
戻り値の型を変えられる、ということ以外には何があるでしょうか?
0756デフォルトの名無しさん
2007/12/27(木) 17:22:100757デフォルトの名無しさん
2007/12/27(木) 17:27:26・メンバ関数テンプレートの特殊化はクラス定義内に書けない(ただしVC++では独自仕様でできる)
・関数ポインタを取得する時
たとえば
template<typename T> void func(T);
があってfunc<Hoge>を特殊化した場合は&func<Hoge>としたときに、特殊化版のアドレスが取れる。
一方オーバーロードの場合は常にテンプレート版のアドレスが取れる。
オーバーロード版のアドレスをとりたい場合はstatic_cast<void(*)(Hoge)>(&func)する。
0758デフォルトの名無しさん
2007/12/27(木) 18:17:57ありがとうございます。
勉強になります
0759デフォルトの名無しさん
2007/12/27(木) 19:26:51どうも、ある一つのメソッドだけABCでそれぞれ引数の数が異なる事になりそうです。
こういう場合どのようなインターフェイスを設計すべきでしょうか?
可変長引数を使うか
引数用構造体を用意してその構造体を適切な形にダウンキャストするか
と言う方法を考えてみたのですが、可変長引数もダウンキャストもあまり好ましくないと言う話も聞きます
なにか良い方法があるのでしょうか?
0760デフォルトの名無しさん
2007/12/27(木) 19:30:200761デフォルトの名無しさん
2007/12/27(木) 19:35:40かっこいいとでも思ってるの?
0762デフォルトの名無しさん
2007/12/27(木) 19:36:33最大数が決まっていれば必要な物以外にはデフォルト引数を使えば良いのでしょうが・・・
0763デフォルトの名無しさん
2007/12/27(木) 19:42:59引き数の個数の上限設けるのも難だし、構造体でお茶濁すのが無難じゃないかな。
0764デフォルトの名無しさん
2007/12/27(木) 19:54:50インターフェースを使うって事は、ABCどのインスタンスか意識せずに
共通の方法で扱いたいってことだろ?
でも引数の数が異なるってことは、そのメソッドはABCの違いを意識しないとダメなんだろ?
ならABCそれぞれで定義すべきじゃないか?
0765デフォルトの名無しさん
2007/12/27(木) 19:57:58戻り値の型を指定してはいけないだろ
voidであってもエラー
0766デフォルトの名無しさん
2007/12/27(木) 21:31:05デストラクタに virtual を付けるのにはもの凄く意味がある。
それが分からないのは読んだ本が悪かったんだろうな。
0767デフォルトの名無しさん
2007/12/27(木) 21:40:30こういうのでどう
class MyInterface {
public:
virtual void setSomethingParameter(const char *name, const char *value);
virtual void doSomething();
};
各派生クラスはnameを見てvalueを好きに解釈する
その設定内容をメンバに保存しておいて、doSomethingで使う
0768デフォルトの名無しさん
2007/12/27(木) 21:45:58呼び出し引数が違う
→呼び出し側でそれぞれの子クラスを区別する必要がある
→区別できるなら安全にキャストできる
→インターフェース側で対応する必要は無く、ただABCでそれぞれメンバ関数を持てばいい
だろ?
0769デフォルトの名無しさん
2007/12/27(木) 21:46:190770デフォルトの名無しさん
2007/12/27(木) 21:59:10インタフェイス側で対応すべきものではないな。
0771デフォルトの名無しさん
2007/12/27(木) 22:39:20とは言えない。
0772デフォルトの名無しさん
2007/12/27(木) 23:42:49それは
無限には存在しないメモリの犯罪
0773デフォルトの名無しさん
2007/12/28(金) 00:12:560774デフォルトの名無しさん
2007/12/28(金) 00:25:29メモリというより実行速度の問題な気がするが。
継承しない事が分かっていて、頻繁にオブジェクトが生成/破棄されるクラスのデストラクタはvirtualにしないこともある。その他virtualにしない理由ってあるかな?
0775デフォルトの名無しさん
2007/12/28(金) 00:31:580776デフォルトの名無しさん
2007/12/28(金) 00:47:58ほとんどの場合、しっかり作りこまれたクラス階層を作るでもなければそっちの方が多いんじゃないか?
でもまぁ、しっかり作りこむつもりのクラス階層に属するクラスならvirtualメンバ関数にはしとくよな。
個人的にはさらにそこでvirtual継承も薦めたいところだが。
0777デフォルトの名無しさん
2007/12/28(金) 01:35:04ポリモルフィックに使いたくない(使われたくない)
基底クラスのデストラクタはprotectedでvirtualではない
デストラクタにすればいいらしい。
基底クラスのポインタにdeleteされるのを防ぐため。
0778デフォルトの名無しさん
2007/12/28(金) 06:12:41デストラクタを public 以外にするのは >>777 のようなケース?
というか,そもそもデストラクタって勝手に呼び出されるから
アクセス指定という概念がなかった.
0779デフォルトの名無しさん
2007/12/28(金) 07:55:170780デフォルトの名無しさん
2007/12/28(金) 16:49:32かっこいいとでも思ってるの?
0781デフォルトの名無しさん
2007/12/28(金) 18:17:01問題ある
virtualは今現在の生成物に影響をもたらすトークンであって
今後の設計の遷移の方針を示唆するコメントではない
0782デフォルトの名無しさん
2007/12/28(金) 18:35:39パフォーマンスなんて大したことなんだし、迷ったら付けとくぐらいで問題ない。
0783デフォルトの名無しさん
2007/12/28(金) 19:56:24>今後の設計の方針を示唆することにも使える
使えないよ
だって今後じゃなくて今かもしれないんだし
0784デフォルトの名無しさん
2007/12/28(金) 20:22:16一長一短あるんじゃないか?
0785デフォルトの名無しさん
2007/12/28(金) 20:59:38?
0786デフォルトの名無しさん
2007/12/28(金) 22:38:23仮想関数だと分かりやすいという利点と、
別にオーバーライドであることを保証してくれないから
typo してもコンパイルエラーが出る訳じゃないから
紛らわしいこともあるという欠点があるな。
0787デフォルトの名無しさん
2007/12/28(金) 22:43:24あと
struct A { virtual void f(); }
struct B : A { void f(); }
struct C : B { void f(); }
とかなってるときにリファクタリングの結果Aを削除したときなんかは
virtual つけてないと意味がかわるし
0788デフォルトの名無しさん
2007/12/28(金) 22:46:290789デフォルトの名無しさん
2007/12/29(土) 00:01:20意味はわかったけど、どういう場面で使うべきなのか
イメージがわきません。
0790デフォルトの名無しさん
2007/12/29(土) 00:13:03ttp://www.techscore.com/tech/DesignPattern/TemplateMethod.html
ここでも眺めてみるといいよ。
ttp://www.techscore.com/tech/DesignPattern/
0791デフォルトの名無しさん
2007/12/29(土) 01:47:42基底クラスのコンストラクタが呼ばれるのが邪魔な場合がある。
そういう時、基底クラスに何もしない protected なコンストラクタを用意して、
派生クラスではその何もしないコンストラクタを呼ぶようにするといいのではと思った。
こういう手はよく使われるのだろうか?
0792デフォルトの名無しさん
2007/12/29(土) 01:53:080793デフォルトの名無しさん
2007/12/29(土) 01:55:12まあ当たり前の動作なんだが、コンストラクタの処理を変更したい時には困る。
0794デフォルトの名無しさん
2007/12/29(土) 08:48:50オブジェクトを生成されたくないなら
protectedにするのはコンストラクタではなく
デストラクタでいいだろ
0795デフォルトの名無しさん
2007/12/29(土) 08:53:020796デフォルトの名無しさん
2007/12/29(土) 09:04:23チガウチガウ。
クラス A と、そのバージョンアップ版 A2 を作りたい時の話ネ。
0797デフォルトの名無しさん
2007/12/29(土) 09:57:06環境はlinux上のg++です。
0798デフォルトの名無しさん
2007/12/29(土) 11:21:54,を\0に置換してる
0799デフォルトの名無しさん
2007/12/29(土) 11:46:35痴漢すると何かいいことがありますか?
0800デフォルトの名無しさん
2007/12/29(土) 11:49:070801デフォルトの名無しさん
2007/12/29(土) 11:49:02CSVをパース出来ます
0802デフォルトの名無しさん
2007/12/29(土) 11:58:100803デフォルトの名無しさん
2007/12/29(土) 12:28:21ダメっていう言語仕様にしてほしかった・・・・・
0804デフォルトの名無しさん
2007/12/29(土) 13:44:47その仕様はダメ。
関数名を typo しても通るから。
override ってのを付けさせる言語があるけど、
そういう奴の方が安全。
0805デフォルトの名無しさん
2007/12/29(土) 15:23:00使ったことないけど
0806デフォルトの名無しさん
2007/12/29(土) 15:46:540807デフォルトの名無しさん
2007/12/29(土) 15:48:17newしたらdeleteするのは当然
そしてdeleteでコンパイルエラー
もしdeleteを忘れたなら別次元の致命的エラー
>>796
そういう話ね
0808デフォルトの名無しさん
2007/12/29(土) 15:49:31オライリーの本読んだだけだけど
.NetやるならC++/CLIよりははるかに使いやすい
と思った
0809デフォルトの名無しさん
2007/12/29(土) 15:50:20言語的にはいいけど、ネイティブじゃないからなあ。
まあ、そのあたりはトレードオフなところもあるから仕方が無いが。
0810デフォルトの名無しさん
2007/12/29(土) 17:39:46そっか、言語の素性はいいのか
windows環境なら別に.netだからと困ることもないし(´-`)
要は使い分けってこった
0811デフォルトの名無しさん
2007/12/29(土) 17:44:24ネイティブじゃないと何か困ることはあるのかと言えば
速度以外にほとんど無いからね
ちゃんと作れば普通に速いし、ほんとに遅くて困った時
ボトルネックなとこだけ何とか出来るように設計すればいい
0812デフォルトの名無しさん
2007/12/29(土) 17:52:032.0 で良くなった。
0813デフォルトの名無しさん
2007/12/29(土) 18:45:07あとは見栄え良くアプリにするチームが C# でアプリにしてる.
0814デフォルトの名無しさん
2007/12/29(土) 19:00:260815デフォルトの名無しさん
2007/12/30(日) 00:40:03std::vector<CPoint> p;
pDC->Polyline(p.begin(), p.size());
0816デフォルトの名無しさん
2007/12/30(日) 00:44:25↓
&p.begin()[0]
0817デフォルトの名無しさん
2007/12/30(日) 00:49:23&p[0]
&p.at(0)
&p.front()
0818デフォルトの名無しさん
2007/12/30(日) 07:44:14struct List{
char c_Data[100];
double *d_Value;
int i_Priority;
struct List *next;
struct List *prev;
};
******* C++ ソースコード *****************************
bool AddFunction(struct List *pt_List, int i_AddSum, double *pd_AddData)
{
int i_Cnt;
unsigned long ul_ErrorNo;
try
{
if(pt_List->prev->prev == NULL || pt_List->prev == NULL)
{
// err
return false;
}
}
}
ここで、if(pt_List->prev->prev == NULL || pt_List->prev == NULL)が分からないのですが。
ポインタ2つをたどって行った先がnullかどうか、又はprevがnullかどうかを判断しているので
しょうか。
0819デフォルトの名無しさん
2007/12/30(日) 08:39:56そうだと思うよ。でもそのコードだと後ろの(pt_List->prev == NULL)の意味がない。
もし必要なら逆にしないと。
if(pt_List->prev == NULL || pt_List->prev->prev == NULL)
0820デフォルトの名無しさん
2007/12/30(日) 11:38:30delphiがそれだね。間違いがなくなって楽。
あと、delphiのinheritedで派生もとのメソッドを呼べるのも間違いがなくなって便利だ。C++で似たようなことができる技ってないかな。
>>806
C#はネイティブコード出力で、Windows以外でもサポートされるようになったら使いたいな。
0821デフォルトの名無しさん
2007/12/30(日) 13:23:12自分でtypedef 親クラス inherited;とでも書けばいいから、
C++には要らないというのが委員会の結論。
D&E 13.6 Inherited::
0822デフォルトの名無しさん
2007/12/30(日) 13:40:04おお、その通りだ。早速使わせてもらうよ。
0823デフォルトの名無しさん
2007/12/30(日) 13:45:41typedefする箇所で自分の親を知っていないとダメ。
0824デフォルトの名無しさん
2007/12/30(日) 14:00:570825デフォルトの名無しさん
2007/12/30(日) 14:17:46テンプレートを使う側に、inheritedを定義しておけと要求しておけばいい。
0826デフォルトの名無しさん
2007/12/30(日) 14:22:43でも、C++ は多重継承ができるから inherited を言語仕様に入れるのは無理だと思う。
0827デフォルトの名無しさん
2007/12/30(日) 14:23:55とりあえず、親クラスを変更したときに修正を忘れないように、一番先頭で宣言することにするかな。
privateで宣言しておけば余計な副作用もないかな。
言語仕様に含まれてるのが一番楽とはおもうけど。
0828デフォルトの名無しさん
2007/12/30(日) 15:04:300829デフォルトの名無しさん
2007/12/30(日) 15:12:16提案では、inheritedを使うと曖昧になるときはコンパイルエラーだった。
D&Eに載っていた例。
struct A { virtual void handle(int); };
struct B { virtual void handle(int); };
struct D : A, B { void handle(int); };
void D::handle(int i)
{
A::handle(i); //曖昧でない
inherited::handle(i); // 曖昧
}
0830デフォルトの名無しさん
2007/12/30(日) 16:04:460831デフォルトの名無しさん
2007/12/30(日) 16:44:16typedef hogehogehogehogeho Base;
とかする方がいいと思うな.
とりあえず auto 早く来〜い
0832デフォルトの名無しさん
2007/12/30(日) 17:17:500833デフォルトの名無しさん
2007/12/30(日) 18:58:25そのprintfをなくすとハンドルされてないエラーとかでてくるのはなんででしょうか?
しかも書き込む文字列を変化させてもエラーがでます・・・
0834デフォルトの名無しさん
2007/12/30(日) 19:00:55MOCで処理するけどな
0835デフォルトの名無しさん
2007/12/30(日) 19:15:41サンプルコードぷりーず
0836833
2007/12/30(日) 19:42:15ただ今度はオブジェクトをdeleteするとエラーが・・・
ソースは長いのですこしはしょります↓
〜
for(){
〜
MIntegralImage *img = new IntegralImage(src_img);
//imgを用いた処理
delete img;
〜
}
5回目でなぜかエラーになります。
0837デフォルトの名無しさん
2007/12/30(日) 19:42:21お!それは便利だ。でもMS仕様か残念。
最低限gccとintelC+で使えれば良いのにな。
0838デフォルトの名無しさん
2007/12/30(日) 19:47:53スレ違い。初心者スレにでもどうぞ。
0839デフォルトの名無しさん
2007/12/30(日) 21:25:07コードを見ないとはっきりしたことはいえないけど
多分スタックを破壊している
0840デフォルトの名無しさん
2007/12/30(日) 21:43:59deleteが原因ではないと思うです。
VCでdebugビルドなら、newされたオブジェクトのメモリをダンプしながら実行して、オブジェクトの前後のパディングされてるのが壊されてないか見ると良いです。
0841833
2007/12/30(日) 21:53:23とりあえずオブジェクトの処理のほうを見直してみます。
0842833
2007/12/30(日) 21:56:44デバッグ情報のほうはなんとかなりましたので、メモリのほうを確認してみます。
0843デフォルトの名無しさん
2007/12/30(日) 22:39:39とりあえず、環境をプリーズ
0844デフォルトの名無しさん
2007/12/30(日) 22:42:440845デフォルトの名無しさん
2007/12/31(月) 08:49:10なるほろ。それならいけるね。
0846デフォルトの名無しさん
2007/12/31(月) 15:00:05/* in X.cpp global namespace */
namespace B { namespace C { namespace D { /* 変更不可能 */
struct type_t;
}}}
namespace A { /* 変更可能*/
using ::B::C::D::type_t;
type_t *func( type_t * );
}
namespace A { /* 変更不可能 */
/*
ここに名前 func は導入したいが、名前 type_t は導入したくない。
つまり明示的に ::B::C::D::type_t と指定させたい。
*/
}
/* End of X.cpp */
0847846
2007/12/31(月) 15:06:28namespace B { namespace C { namespace D { namespace {
}}}}
namespace A { namespace {
}}
namespace A { namespace {
}}
です。
0848デフォルトの名無しさん
2007/12/31(月) 15:56:180849デフォルトの名無しさん
2007/12/31(月) 16:08:000850デフォルトの名無しさん
2007/12/31(月) 16:29:28これをなくせばいいだけ?
> using ::B::C::D::type_t;
0851846
2007/12/31(月) 17:04:21実際には、
namespace A1 { /* 変更可能*/
using ::B::C::D::type1_t;
using ::B::C::D::type2_t;
……以下略……
type1_t *func_1( type1_t *, type2_t * );
type3_t *func_2( type3_t *, type4_t * );
……以下略……
}
namespace A2 { /* 変更可能*/
using ::B::E::F::type1_t;
using ::B::E::F::type2_t;
……以下略……
type1_t *func_1( type1_t *, type2_t * );
type3_t *func_2( type3_t *, type4_t * );
……以下略……
}
……以下略……
みたいに長めのコードになるので、できれば using 宣言を使いたいのです。
自分は幾つかのサブシステムのうちの一つのサブシステムにある数百のファイルのうちの幾つかを扱っています。
自分の扱っている範囲だけで解決できるような策を探しています。
0852デフォルトの名無しさん
2007/12/31(月) 22:59:11namespace BCD = ::B::C::D;
namespace BEF = ::B::E::F;
みたいな感じでお茶を濁せる気がしないでもないですな
0853デフォルトの名無しさん
2008/01/01(火) 00:13:02今年最初の質問をさせていただきます。
ostrstreamをwchar_tで使いたいと思っているのですが、どうしたらいいでしょうか?
要するに、ostrstreamのwchar_t版みたいなクラスがあればいいと思っています。
環境はVC2005、WinXP Proです。
よろしくお願いします。
0854デフォルトの名無しさん
2008/01/01(火) 00:19:49ただし、どのくらい真面目に実装されてるかどうかは知らん。
0855デフォルトの名無しさん
2008/01/01(火) 00:43:41じゃあusingせずにtypedefで短い名前に
0856デフォルトの名無しさん
2008/01/01(火) 00:48:36どうもです。それを使ってみます。
0857デフォルトの名無しさん
2008/01/01(火) 02:01:41すいません、今MSDNを漁ってみたのですが、wostrstream が見つけられませんでした。
もう少し、詳しく教えてください。というか、これでぐぐっても一件しか出てこないのですが……
0859デフォルトの名無しさん
2008/01/01(火) 02:11:020860デフォルトの名無しさん
2008/01/01(火) 03:04:02つーか、そいつは deprecated だから ostringstream 使おうぜ。
0861デフォルトの名無しさん
2008/01/01(火) 06:29:49(実際のソースはdequeコンテナに色々値を挿入する処理とかがあるのですが、省略しました。)
#include <iostream>
#include <deque>
#include <algorithm>
#include <cmath>
using namespace std;
int main()
{
deque<double> radians, sines;
transform(radians.begin(), radians.end(), sines.begin(), sin);
return 0;
}
コンパイルエラーは以下です。
$ g++ transform.cpp -lm
transform.cpp: In function 'int main()':
transform.cpp:9: error: no matching function for call to 'transform(std::_Deque_iterator<double,
double&, double*>, std::_Deque_iterator<double, double&, double*>, std::_Deque_iterator<double,
double&, double*>, <unresolved overloaded function type>)'
でも、sinをsin<int>とするとコンパイルが通るのですが、sin<double>としてもダメです。
sin<int>で問題なく動作するのですが、なぜこう書けば動くのかわからないです。
どうかよろしくお願いします。
環境はg++ 4.2.1でlinuxです。
0862デフォルトの名無しさん
2008/01/01(火) 06:53:54しかし気がつけばもう2008年か。こんな時間にtransformか、オレ。
0863デフォルトの名無しさん
2008/01/01(火) 07:18:27テンプレート引数をとるsinって何?
complexの奴? それとも使ってるSTLは、C関数によく似たテンプレート版のsinでも提供しているわけ?
VCの場合で答えるけど、VCの標準Cライブラリでは、sin関数が、floatとdoubleを取るように、オーバーロードされている。
それで、曖昧になって、コンパイルできない。
曖昧にならないようにするには。
std::transform( radians.begin(), radians.end(), sines.begin(), static_cast< double (*)(double) >( &sin ) ) ;
0864デフォルトの名無しさん
2008/01/01(火) 07:28:01struct SinFuncObj
{
template < typename T >
T operator () (T arg)
{ return sin(arg) ; }
} ;
std::transform( radians.begin(), radians.end(), sines.begin(), SinFuncObj() ) ;
0865デフォルトの名無しさん
2008/01/01(火) 08:04:56std::sin<int>はdouble sin(int)みたいなのとしてインスタンス化されるから通るようだ
でsin<double>だとダメなのはこのtemplate functionの戻り値の定義が
enable_if<double, is_integer<T>::value>::type
のようなのになってて、T=doubleだと(略)::typeによってsin<double>が未定義とみなされ
故に<unresolved overloaded function type>と
しかしtransformのエラーだけ見せられてもなんのこっちゃわからん罠
0866デフォルトの名無しさん
2008/01/01(火) 11:06:15865が言っているのは下記の部分についてですか?
自分でも読んでみようと思ったのですが、
__enable_ifがわからん(泣)
googleしても出てきません。
using ::sin;
inline float
sin(float __x)
{ return __builtin_sinf(__x); }
inline long double
sin(long double __x)
{ return __builtin_sinl(__x); }
template<typename _Tp>
inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
double>::__type
sin(_Tp __x)
{ return __builtin_sin(__x); }
0867デフォルトの名無しさん
2008/01/01(火) 11:51:40boostにそっくり。
メタプログラムみたいだね。
想像だけど
__is_integer<_Tp>は_Tpがintegral型だとtrueで、そうでなければfalseになる
として、__gnu_cxx::__enable_if<__is_integer<_Tp>::__value, double>::__type はテンプレートの第一引数型パラメータがfalseに対して
は__typeをtypedefしてない(故意に)からインスタンス化に失敗してエラーと
なってるんじゃないか。trueの場合はdoubleと評価される。
sin<int>だと
__is_integer<int>::__valueがtrue、sin<double>だと__is_integer<double>::__valueがfalse。
0868デフォルトの名無しさん
2008/01/01(火) 12:46:50アルゴリズムに関数テンプレートを渡すのって
標準に関して言えば違反してるんじゃなかったっけ。
0869デフォルトの名無しさん
2008/01/01(火) 12:48:06明示的に型引数与えてコンパイルが通ったとしても。
0870デフォルトの名無しさん
2008/01/01(火) 13:24:11_Tpとか__nとかもうちっと気の利いた変数名をつけようとは思わないんだろうか
それに改行の位置やインデントもバラバラに見えるし
なんか規則があるんだろうけど一般とは全然違うよね
なんでこんなわかりづらいコードなの?
0871デフォルトの名無しさん
2008/01/01(火) 13:34:55Boostが読みにくいと思ったことはないな。
ソースコードが変態であることには同意するが。
0872デフォルトの名無しさん
2008/01/01(火) 13:37:460873デフォルトの名無しさん
2008/01/01(火) 13:41:480874デフォルトの名無しさん
2008/01/01(火) 13:45:310875デフォルトの名無しさん
2008/01/01(火) 14:09:11kwsk
0876デフォルトの名無しさん
2008/01/01(火) 14:29:51先頭に _ のついた識別子は処理系やライブラリ用の予約語だから、
衝突するしないだけで言えばそれで _ つけるだけで十分だな。
(本当はもうちょっと複雑なルールなんだけど簡単のため割愛)
0877デフォルトの名無しさん
2008/01/01(火) 14:39:240878デフォルトの名無しさん
2008/01/01(火) 14:45:210879デフォルトの名無しさん
2008/01/01(火) 15:18:32簡単なら割愛しないで教えてくれよw
0880デフォルトの名無しさん
2008/01/01(火) 15:23:100881デフォルトの名無しさん
2008/01/01(火) 15:32:45C90 および C99 規格では、次の名前が実装系のために予約されています。
* グローバル スコープを持ち、_ で始まる名前
* _ で始まり、その次が大文字の名前
* __ で始まる名前
C++ 規格では、次の名前が実装系のために予約されています。
* グローバル スコープを持ち、_ で始まる名前
* _ で始まり、その次が大文字の名前
* __ を含む名前
(C++ の規定の方が予約名の範囲が大きく、2 連のアンダースコア文字が名前の先頭だけでなくどこにあっても予約名になる。)
コードの規格への準拠と移植性を最大限に保つため、自分のプログラムでこのような名前を定義することは避けてください。
この規定を覚えやすくするため、2 連のアンダースコア文字と先頭のアンダースコア文字は言語やスコープに関係なく常に避けるのがよいでしょう。
0882デフォルトの名無しさん
2008/01/01(火) 15:41:07メイヤーズのSTLの46項に書いてあるけど、
同じ数の型パラメータをとるプライマリテン
プレートのオーバーロード解決ができないみたい。
コンパイラによってはコンパイルできるらしい。
以下はVC++ 2008ではambiguousでエラーだった。
template<typename T>
void func(T t);
template<typename T>
void func(T* t);
int main()
{
int a[] = { 1,2,3 };
for_each(a, a+3, func<int>);
return 0;
}
0883デフォルトの名無しさん
2008/01/01(火) 15:47:28説明不測だった。以下はVCでもコンパイルできる。
メイヤーズの本では以下も標準では違反してる
らしいと言ってる。とオレは理解した。
template<typename T>
void func(T t);
int main()
{
int a[] = { 1,2,3 };
for_each(a, a+3, func<int>);
return 0;
}
0884デフォルトの名無しさん
2008/01/01(火) 15:48:43関数オブジェクト使えばいいから。
0885デフォルトの名無しさん
2008/01/01(火) 15:48:52それだと greater とか使えんことになるけど。
0886デフォルトの名無しさん
2008/01/01(火) 15:59:56greaterは関数テンプレートではなくて
クラス(構造体だけど)テンプレートでしょ
0887デフォルトの名無しさん
2008/01/01(火) 16:02:24お前の使ってるコンパイラのSTLは、greaterをテンプレート関数で実装してんの?
でも、まさかテンプレート関数を渡せないってことは・・・調べるか。
0888デフォルトの名無しさん
2008/01/01(火) 16:05:26面倒くさがりの皆のために頼む。
0889デフォルトの名無しさん
2008/01/01(火) 16:33:15メイヤーズの本を読んだことがないんだけど、
それは単にArgument Deductionが曖昧になる場合があるって話じゃないの。
テンプレート関数をアルゴリズムに渡すのが規格違反ってことは、
テンプレート関数のポインタが取れないってことになると思うんだけど。
0890デフォルトの名無しさん
2008/01/01(火) 16:48:54>それは単にArgument Deductionが曖昧になる場合があるって話じゃないの。
そう。メイヤーズの本では、この可能性があるから標準では禁止しているよう
だと書いてある(とオレは理解した)。すまんが原書は読んでいない。
ただ、webで標準のアルゴリズムの章をざっと見たけど何も制限らしいことは
書いていなかった。
実際はどうなんだろ。
0891デフォルトの名無しさん
2008/01/01(火) 16:57:51ああ、クラステンプレートならおkってことか。
0892デフォルトの名無しさん
2008/01/01(火) 18:09:05芋焼酎を飲んで適当にトランプとかやってるうちに、
どんどん高度な(少なくともオレには)書き込みが。。。
みんな今日は1月1日なんだよ、どうしてんだよ
0893デフォルトの名無しさん
2008/01/01(火) 18:27:130895デフォルトの名無しさん
2008/01/02(水) 14:02:10Foo.hppで定義したclass Fooのインラインメソッドhoge()があった時に
クラスFooのインライン以外の実装をFoo.cppで記述してFoo.oを作成したとします。
この時に、Foo::hoge()を呼び出すclass Barの実装を定義したbar.cppでFoo.hppをインクルードするわけですが、
bar.oを作成するときにFoo::hoge()はインライン展開されるのでしょうか?
ここでFoo::hoge()はトリビアルな関数とします
0896デフォルトの名無しさん
2008/01/02(水) 14:05:260897デフォルトの名無しさん
2008/01/02(水) 16:15:43ま、gccやMSVC++ではインライン展開されるよ。ちゃんと。
なにが疑問なんだ。
0898デフォルトの名無しさん
2008/01/02(水) 16:19:010899デフォルトの名無しさん
2008/01/02(水) 16:19:20ひとえに処理系の裁量に委ねられる。規格には、こういう
コードならインラインせねばならない、というような強行規定は
存在しなかったはず。
0900デフォルトの名無しさん
2008/01/02(水) 16:21:450901デフォルトの名無しさん
2008/01/02(水) 16:22:53それぞれで展開され、リンカが、適切に多重存在する実装を纏める、
という処理系がほとんどではないか。
0902デフォルトの名無しさん
2008/01/02(水) 16:30:27使っているすべてのオブジェクトファイルにコード吐いて、
リンク時に重複を削除とかじゃないのかな。
0903デフォルトの名無しさん
2008/01/02(水) 16:40:56C++はその例外処理対策をしてないソースばっかり見かける。
Cのmalloc使った時は、アフォみたいにNULLと比べて
しっかり作ってたんだけど、そこら辺をしてないのはどうしてですか?
0904デフォルトの名無しさん
2008/01/02(水) 16:42:40そりゃ、実際にはメモリ確保できなかったときに対応する必要はあるんだろうけど。
ほとんど、そんなケースは起こらないから、考えてないだけじゃね?
0905デフォルトの名無しさん
2008/01/02(水) 16:45:42どこかでcatchしてるからじゃないか?
0906デフォルトの名無しさん
2008/01/02(水) 16:46:41・例外キャッチだけじゃどうせ片手落ちだから何もしない
・例外キャッチしてもterminateくらいしかすることないから何もしない
のどちらかまたは両方。
0907デフォルトの名無しさん
2008/01/02(水) 16:47:40学生の頃 3次元モデルのシュミレーションやるのに
1000x1000x1000 の double 配列持ったクラスを
new しようとして「実行できない!」ってわめいてた
後輩がいたな…
# おまえそれでも工学部かと(ry
0908デフォルトの名無しさん
2008/01/02(水) 16:47:400909デフォルトの名無しさん
2008/01/02(水) 16:48:41例外でスコープ飛び出しても、しっかりデストラクタが呼ばれるなど、ある程度コンパイラが自動的に解決してくれてるからとか。
それですまない部分だけ、キャッチするようにしてるんじゃないかな。
0910デフォルトの名無しさん
2008/01/02(水) 16:48:530911デフォルトの名無しさん
2008/01/02(水) 16:49:150912デフォルトの名無しさん
2008/01/02(水) 16:49:31まず、
どういうときに例外がスローされると思っているか
例外がスローされなかったら何が保証されていると思っているか
を聞こうか。
0913デフォルトの名無しさん
2008/01/02(水) 16:50:030914デフォルトの名無しさん
2008/01/02(水) 16:51:06You too!
0915デフォルトの名無しさん
2008/01/02(水) 16:53:02bad_allocをご存知か?
0916デフォルトの名無しさん
2008/01/02(水) 16:59:13二択なら、別にどっちでも良いんじゃないの。
そりゃ、メモリが足りないなりにリカバリにつとめるとか
保護違反例外がなくて、NULL触っても動き続ける環境とかなら
話は別だけど。
0917デフォルトの名無しさん
2008/01/02(水) 17:00:43newがNULLで戻ることは無い(except 馬鹿コンパイラsuch as VC)。
903のOSは何だ?どうすべきかはOSとOSの設定によるだろう。
0918デフォルトの名無しさん
2008/01/02(水) 17:01:520919916
2008/01/02(水) 17:02:41そこは、
>Cのmalloc使った時は、アフォみたいにNULLと比べて
>しっかり作ってたんだけど
に対して、別にNULLチェックも要らないといえば要らない、ってはなし。
0920デフォルトの名無しさん
2008/01/02(水) 17:05:270921デフォルトの名無しさん
2008/01/02(水) 17:05:28if(void *m = malloc(size) ){return m;}
else { perror("memory allocation error"); exit(1);}
}
みたいなコードでお茶を濁すのがよくある話。
0922デフォルトの名無しさん
2008/01/02(水) 17:11:10触ることが多いから、mallocよりは結果のチェックのしがいがあるかもしれんな。
俺はしてないけど。
0923デフォルトの名無しさん
2008/01/02(水) 17:15:498GB確保か。32bit OSじゃ無理だが、64bitだったらもうすぐご家庭レベルでも現実的になるかも名w。
メモリ暴落してるし。
0924デフォルトの名無しさん
2008/01/02(水) 18:29:110925デフォルトの名無しさん
2008/01/03(木) 09:09:52そして、スマートポインタを使え
0926デフォルトの名無しさん
2008/01/03(木) 09:26:100927デフォルトの名無しさん
2008/01/03(木) 09:39:48コンストラクタで、投げると、デストラクタが呼ばれない。中途半端なつくりかけオブジェクトが残される。
0928デフォルトの名無しさん
2008/01/03(木) 10:06:29初心者にありがちな誤解だね
0929デフォルトの名無しさん
2008/01/03(木) 10:12:26後始末が必要なことは初期化リストですればいいし
コンストラクタのボディ部分では強い例外保障をすればいいと思う
0930デフォルトの名無しさん
2008/01/03(木) 10:22:43struct A {};
struct B : A
{
std::auto_ptr<int> a, b, c;
B() : a(new int(1)), b(new int(2)), c(new int(3)) {}
};
B* p = new B;
例えばnew int(3)で例外が投げられても、構築済みのメンバa, bと基本クラスAのデストラクタが呼ばれ
Bの為に確保されたメモリも解放される。
0931929
2008/01/03(木) 10:33:17それを言ったつもりだったけど
端折り過ぎたか
別の話になるけど
auto_ptrをメンバに持つのは、例外指定関連でまずかったような気が
メイヤーズかサッターが言ってたと思う
0932デフォルトの名無しさん
2008/01/03(木) 11:08:42その場合、a,b,cのデストラクタは呼ばれて、Bのメモリは開放されるのはわかるが、Bのデストラクタは呼ばれるの?
0933デフォルトの名無しさん
2008/01/03(木) 11:25:22呼ばれないよ。だってBのコンストラクタは完了して無いもん。
0934デフォルトの名無しさん
2008/01/03(木) 11:30:19すると生成済みのクラスのデストラクタしか呼ばれない。ってことでOK?
生成中のクラスの後始末は、プログラマがするってことかな。
0935デフォルトの名無しさん
2008/01/03(木) 11:31:35呼ばれないし、呼ばれる必要も無い。
必要なのはスタックの巻き戻しによる
構築済みオブジェクトの解放と
operator delete()によるメモリ解放。
0936デフォルトの名無しさん
2008/01/03(木) 11:40:210937デフォルトの名無しさん
2008/01/03(木) 13:35:010938デフォルトの名無しさん
2008/01/03(木) 13:38:210939デフォルトの名無しさん
2008/01/03(木) 13:40:140940デフォルトの名無しさん
2008/01/03(木) 13:41:470941デフォルトの名無しさん
2008/01/03(木) 13:46:370942デフォルトの名無しさん
2008/01/03(木) 13:50:130943デフォルトの名無しさん
2008/01/03(木) 13:51:270944デフォルトの名無しさん
2008/01/03(木) 15:23:230945デフォルトの名無しさん
2008/01/03(木) 15:34:48C++0xでrangeやlambdaが入ってきたらalgorithm使いまくりになると思うけど。
0946デフォルトの名無しさん
2008/01/03(木) 15:38:30C++0xでlambdaが入ったら、for_eachと組み合わせて
使いまくると思う。あれは凄い便利だから。
0947デフォルトの名無しさん
2008/01/03(木) 15:42:580948デフォルトの名無しさん
2008/01/03(木) 15:57:04否定はしないんだが, c++ って末尾再帰をまともに扱うような
言語仕様になってないじゃん!
g++ あたりだと, 限られた範囲では末尾再帰を繰り返しに
展開するみたいだが…
0949デフォルトの名無しさん
2008/01/03(木) 16:02:05clですか?
g++ですか?
0950デフォルトの名無しさん
2008/01/03(木) 16:06:330951デフォルトの名無しさん
2008/01/03(木) 16:32:33モダンなコンパイラなら、末尾再帰ぐらい普通に最適化するだろ。
VCもするし。
0952デフォルトの名無しさん
2008/01/03(木) 16:35:37相互末尾再帰も最適化してくれる?
0953デフォルトの名無しさん
2008/01/03(木) 16:50:05clのまま、最適化で対応します。
0954デフォルトの名無しさん
2008/01/03(木) 16:55:37しかし、cygwinがお荷物になる。
0955デフォルトの名無しさん
2008/01/03(木) 17:24:10C++一辺倒なので相互再帰でしかも末尾再帰なんてコードに価値があることすら知らなかった。
試してみたら、VC9では、無理だった。
でも、C++じゃあまり見ないコードだよね。
0956デフォルトの名無しさん
2008/01/03(木) 17:33:28現状TR1には入ってないから無理かな。
0957デフォルトの名無しさん
2008/01/03(木) 17:39:21Boost.Lambdaも面白いけど、とてもアレを実際に使いたいとは思わん。
0958デフォルトの名無しさん
2008/01/03(木) 18:46:05VC++は相互だとダメだと思うが、普通の末尾再帰の最適化ならやってくれるよ。
/CLRは知らんけど。
0959デフォルトの名無しさん
2008/01/03(木) 18:51:110960デフォルトの名無しさん
2008/01/03(木) 18:58:380961デフォルトの名無しさん
2008/01/03(木) 19:18:28VC7.1だけど
int f(x) {
if (x) return f(x - 1) + x;
else return x;
}
_f PROC NEAR
; File c:\tmp\x.c
; Line 3
push ebp
mov ebp, esp
; Line 4
cmp DWORD PTR _x$[ebp], 0
je SHORT $L794
mov eax, DWORD PTR _x$[ebp]
sub eax, 1
push eax
call _f
add esp, 4
add eax, DWORD PTR _x$[ebp]
jmp SHORT $L793
$L794:
; Line 5
mov eax, DWORD PTR _x$[ebp]
$L793:
; Line 6
pop ebp
ret 0
_f ENDP
0962デフォルトの名無しさん
2008/01/03(木) 19:20:33int add_r(int sum, int i) { if (i<1) return sum; sum += i; return add_r(sum, i-1);}
int add(int i) { int sum = 0; return add_r(sum, i); }
int main(){ printf("%d\n", add(100000)); return 0; }
とりあえず作ってみた。 CL hoge.cpp でコンパイルするとスタックオーバーフロー。
CL /O2 hoge.cppでコンパイルすると結果が出た。
スタックオーバーフローでなにもメッセージが出ないのは何とかならんのでしょうか?
0963デフォルトの名無しさん
2008/01/03(木) 19:22:41> if (x) return f(x - 1) + x;
それ + x がスタックに積まれるから末尾になってない
0964947
2008/01/03(木) 19:38:50言語仕様を変える方のラムダも0xには入らないよ。
0965デフォルトの名無しさん
2008/01/03(木) 19:41:48int SumZ1(int x,int y)
{
if(x>0)
{
return SumZ1(x-1,y+x);
}
else
{
return y;
}
}
がこうなった。
00401000 mov ecx,dword ptr [esp+4]
00401004 mov eax,dword ptr [esp+8]
00401008 add eax,ecx
0040100A add ecx,0FFFFFFFFh
0040100D test ecx,ecx
0040100F jle SumZ1+1Eh (40101Eh)
00401011 mov dword ptr [esp+8],eax
00401015 mov dword ptr [esp+4],ecx
00401019 jmp SumZ1 (401000h)
0966デフォルトの名無しさん
2008/01/03(木) 19:49:02static int f_(int x, int a) {
if (x) return f(x-1, x+a);
else return a;
}
int f(int x) { return f_(x,0); }
のように、引数を追加して末尾再帰に変換して実験しないといかんよ。
0967デフォルトの名無しさん
2008/01/03(木) 19:49:350968デフォルトの名無しさん
2008/01/03(木) 19:53:030969デフォルトの名無しさん
2008/01/03(木) 19:58:04自分で展開って具体的にはどうしていたんだ?
辞令教えて。
0970デフォルトの名無しさん
2008/01/03(木) 20:20:38bool odd(int i);
bool even(int i) { return (i==0) ? true : odd(i-1); }
bool odd(int i) { return (i==0) ? false : even(i-1); }
0971970
2008/01/03(木) 20:23:26VC++6は× でした。
0972デフォルトの名無しさん
2008/01/03(木) 20:40:59末尾再帰はループぶん回すだけだよ
複雑なのになると、ボトムアップとトップダウンで展開して、
ループに置換できないか考える
再帰の除去とかでぐぐるとよろし
0973955
2008/01/03(木) 23:57:02もう一度試してみたら、
相互再帰の末尾再帰は、VC9で最適化された。
そもそも、最適化できなかったのが不思議だったんだよね。
MSほどのコンパイラが最適化できないとは思わなかったから。
VC8以前は試すのが面倒。誰かまかせた。
0974デフォルトの名無しさん
2008/01/06(日) 18:54:19namespace type {
typedef type TYPE;
}
using namespace type;
TYPE f( void );
}
と
namespace func {
typedef type TYPE;
TYPE f( void );
}
は何か違いがありますか?
また、長期的に考えて安全そうなのはどちらだと思いますか?
0975デフォルトの名無しさん
2008/01/06(日) 19:22:53どちらがいいかなんてその時の状況による。
0976デフォルトの名無しさん
2008/01/06(日) 19:32:100977デフォルトの名無しさん
2008/01/06(日) 19:33:49namespace type {
typedef type1 TYPE1;
typedef type2 TYPE2; // 新しく型が追加された場合
}
namespace func2 {
using namespace func::type; // <= 前者+using 指令の場合は 自動的に TYPE2 が取り込まれる。
// using func::TYPE1;
// using func::TYPE2; <= 後者+using 宣言だと、この行を追加するまで追加されない。
}
0978デフォルトの名無しさん
2008/01/06(日) 19:37:40仮に *.h で >>974 の using namespace をしたとして何が問題になる?
0979デフォルトの名無しさん
2008/01/06(日) 19:45:00hoge.h(仮)をインクルードしたファイル(又はhoge.h自身)のnamespace func内でTYPE型を宣言したときにぶつかる。
0980デフォルトの名無しさん
2008/01/06(日) 19:49:57>>974 は using namespace しない場合は namespace func に直に TYPE 型を宣言するって言ってるんだから、どっちにしろぶつかると思うが。
0981デフォルトの名無しさん
2008/01/06(日) 19:54:29974のコードと混ざってるからか意味がわからん。
using namespace func::type; // <= 前者+using 指令の場合は 自動的に TYPE2 が取り込まれる。
何でTYPE2が取り込まれるの?取り込まれるのは、func::type::TYPEでないの?
// using func::TYPE1;
// using func::TYPE2; <= 後者+using 宣言だと、この行を追加するまで追加されない。
名前空間funcにTYPE1やTYPE2は無いと思うんだけど。
0982デフォルトの名無しさん
2008/01/06(日) 19:54:53namespace func内にTYPE型を宣言する場合は、TYPEは funcの物になる。func内に他の型を宣言する時はfunc内の名称とぶつからないようにするだけ。
typeの持ち物であるTYPEを*.hのnamespace func内でusingするのは問題。
とはいえ、殺すは言い過ぎた。すまんかった。
0983デフォルトの名無しさん
2008/01/06(日) 19:55:330984デフォルトの名無しさん
2008/01/06(日) 20:03:20>名前空間funcにTYPE1やTYPE2は無いと思うんだけど。
説明不足ですまん。TYPE1は旧・TYPEのつもりね。
typedef type2 TYPE2; // 新しく型が追加された場合
namespace func2 {
using namespace func::type; // <= 前者+using 指令の場合は 自動的に TYPE2 が取り込まれる。
using func::TYPE;
using func::TYPE2; <= 後者+using 宣言だと、この行を追加するまで追加されない。
}
0985デフォルトの名無しさん
2008/01/06(日) 20:26:42取り込めるってことね。
0986デフォルトの名無しさん
2008/01/07(月) 09:50:17がコンパイルできるのは正しいことですか?
0987デフォルトの名無しさん
2008/01/07(月) 10:09:180988デフォルトの名無しさん
2008/01/07(月) 10:24:20これが通れば template 書くのが楽そうなんだが。
0989デフォルトの名無しさん
2008/01/07(月) 14:48:21定義できなだろ
0990デフォルトの名無しさん
2008/01/07(月) 20:04:580991デフォルトの名無しさん
2008/01/07(月) 20:10:380992デフォルトの名無しさん
2008/01/07(月) 20:17:100993デフォルトの名無しさん
2008/01/07(月) 20:58:590994デフォルトの名無しさん
2008/01/08(火) 04:24:23static_cast<void>( huga );
return ;
と書くのと同じ。
0995デフォルトの名無しさん
2008/01/08(火) 15:47:34template<typename X>
typename X::result_type hoge( X x ) { return x(); }
で、result_type が void の場合にコンパイルエラーしないために、
void 型の戻り値は許されてる。
レス数が950を超えています。1000を超えると書き込みができなくなります。