C++相談室 part49
レス数が1000を超えています。これ以上書き込みはできません。
0001v(^・^)v
2006/04/28(金) 09:52:50ただし質問の前にはFAQに一通り目を通してください。
IDE(VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
→ テンプレその他 >>1-15 付近参照 ←
前スレ
C++相談室 part48
http://pc8.2ch.net/test/read.cgi/tech/1142423595/
0002v(^・^)v
2006/04/28(金) 09:54:572 http://pc.2ch.net/tech/kako/996/996640937.html
3 http://pc.2ch.net/tech/kako/1003/10038/1003832761.html
4 http://pc.2ch.net/tech/kako/1009/10090/1009071535.html
5 http://pc.2ch.net/tech/kako/1014/10142/1014217496.html
6 http://pc.2ch.net/tech/kako/1018/10184/1018454705.html
7 http://pc.2ch.net/tech/kako/1021/10217/1021787032.html
8 http://pc3.2ch.net/tech/kako/1025/10250/1025010364.html
9 http://pc3.2ch.net/tech/kako/1027/10273/1027347982.html
10 http://pc3.2ch.net/tech/kako/1029/10293/1029315669.html
11 http://pc3.2ch.net/tech/kako/1032/10323/1032345774.html
12 http://pc3.2ch.net/tech/kako/1035/10350/1035005882.html
13 http://pc3.2ch.net/tech/kako/1038/10380/1038031395.html
14 http://pc5.2ch.net/tech/kako/1041/10413/1041328679.html
15 http://pc5.2ch.net/tech/kako/1043/10436/1043605481.html
0003v(^・^)v
2006/04/28(金) 09:55:2917 http://pc5.2ch.net/tech/kako/1047/10475/1047560042.html
18 http://pc5.2ch.net/tech/kako/1050/10501/1050177746.html
19 http://pc5.2ch.net/tech/kako/1052/10526/1052625846.html
20 http://pc5.2ch.net/tech/kako/1055/10551/1055162298.html
21 http://pc5.2ch.net/tech/kako/1057/10575/1057580107.html
22 http://pc5.2ch.net/tech/kako/1060/10603/1060361082.html
23 http://pc5.2ch.net/tech/kako/1062/10626/1062690663.html
24 http://pc5.2ch.net/tech/kako/1066/10665/1066546387.html
25 http://pc5.2ch.net/tech/kako/1067/10679/1067949669.html
26 http://pc5.2ch.net/test/read.cgi/tech/1070164402/ (迷子)
27 http://pc5.2ch.net/test/read.cgi/tech/1074454641/ (迷子)
28 http://pc5.2ch.net/test/read.cgi/tech/1077985164/
29 http://pc5.2ch.net/test/read.cgi/tech/1082047479/
30 http://pc5.2ch.net/test/read.cgi/tech/1084030770/
0004v(^・^)v
2006/04/28(金) 09:57:3532 http://pc5.2ch.net/test/read.cgi/tech/1088236078/
33 http://pc5.2ch.net/test/read.cgi/tech/1090180012/
34 http://pc5.2ch.net/test/read.cgi/tech/1092018643/
35 http://pc5.2ch.net/test/read.cgi/tech/1093958200/
36 http://pc5.2ch.net/test/read.cgi/tech/1096304546/
37 http://pc5.2ch.net/test/read.cgi/tech/1098543578/
38 http://pc5.2ch.net/test/read.cgi/tech/1101473340/
39 http://pc5.2ch.net/test/read.cgi/tech/1106466303/
39(実質40) http://pc8.2ch.net/test/read.cgi/tech/1106527792/
40(実質41) http://pc8.2ch.net/test/read.cgi/tech/1113408957/
41(実質42) http://pc8.2ch.net/test/read.cgi/tech/1120190961/
43 http://pc8.2ch.net/test/read.cgi/tech/1124113879/
44 http://pc8.2ch.net/test/read.cgi/tech/1128512737/
45 http://pc8.2ch.net/test/read.cgi/tech/1133007604/
46 ttp://pc8.2ch.net/test/read.cgi/tech/1136690107/
47 ttp://pc8.2ch.net/test/read.cgi/tech/1139931895/
48 ttp://pc8.2ch.net/test/read.cgi/tech/1142423595/
0005v(^・^)v
2006/04/28(金) 09:58:14[C++ FAQ]
http://www.parashift.com/c++-faq-lite/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
Cとその仕様を比較しながらの解説なので分かりやすい。
***** 質問の前に必ずこの二つに目を通してください *****
[禿 Stroustrup]
http://public.research.att.com/~bs/
[C++ International Standard]
http://www.kuzbass.ru/docs/isocpp/
http://www.kuzbass.ru/docs/ansi_iso_iec_14882_1998.pdf
http://www.iso.org/iso/en/CatalogueDetailPage.CatalogueDetail?CSNUMBER=38110&ICS1=35&ICS2=60&ICS3=
[JTC1/SC22/WG21 - C++]
http://www.open-std.org/jtc1/sc22/wg21/
[C/C++ Users Journal]
http://www.cuj.com/
[cppll (ML)]
http://www.trickpalace.net/cppll/ (日本語)
0006v(^・^)v
2006/04/28(金) 09:59:04amazon.com C,C++関連書籍
http://www.amazon.com/exec/obidos/tg/browse/-/3956/ref=br_bx_c_1_3/
The C++ Programming Language
ttp://www.amazon.com/exec/obidos/ASIN/0201700735/
ttp://www.amazon.co.jp/exec/obidos/ASIN/475611895X/ (翻訳)
C++ Primer (3rd Edition)
ttp://www.amazon.com/exec/obidos/ASIN/0201824701/
ttp://www.amazon.co.jp/exec/obidos/ASIN/4756140068/ (翻訳)
The C++ Standard Library
ttp://www.amazon.com/exec/obidos/ASIN/0201379260/
ttp://www.amazon.co.jp/exec/obidos/ASIN/4756137156/ (翻訳)
Effective C++
ttp://www.amazon.com/exec/obidos/ASIN/0201924889/
ttp://www.amazon.co.jp/exec/obidos/ASIN/4756118089/ (翻訳)
More Effective C++
ttp://www.amazon.com/exec/obidos/ASIN/020163371X/
ttp://www.amazon.co.jp/exec/obidos/ASIN/4756118534/ (翻訳)
Exceptional C++
ttp://www.amazon.com/exec/obidos/ASIN/0201615622/
ttp://www.amazon.co.jp/exec/obidos/ASIN/4894712709/ (翻訳)
More Exceptional C++
ttp://www.amazon.com/exec/obidos/ASIN/020170434X/
Exceptional C++ Style
ttp://www.amazon.com/exec/obidos/ASIN/0201760428/
C++ Coding Standards
ttp://www.amazon.co.jp/exec/obidos/ASIN/0321113586/
ttp://www.amazon.co.jp/exec/obidos/ASIN/4894716860/ (翻訳)
0007v(^・^)v
2006/04/28(金) 09:59:53Effective 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/
0008v(^・^)v
2006/04/28(金) 10:00:52[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
0009v(^・^)v
2006/04/28(金) 10:04:03【初心者歓迎】C/C++室 Ver.26【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1143601166/
【C++】STL(Standard Template Library)相談室 5
http://pc8.2ch.net/test/read.cgi/tech/1143608073/
C/C++の宿題を片付けます 63代目
http://pc8.2ch.net/test/read.cgi/tech/1143405137/
C/C++でのWindowsPrograming議論スレ(質問お断り)
http://pc8.2ch.net/test/read.cgi/tech/1049790146/
managed C++ やろうぜ!! 002
http://pc8.2ch.net/test/read.cgi/tech/1139043535/
C++/CLI について語ろうぜ Part2
http://pc8.2ch.net/test/read.cgi/tech/1142147319/
くだすれC++/CLI(初心者用)
http://pc8.2ch.net/test/read.cgi/tech/1142144110/
ATL/WTL Part4
http://pc8.2ch.net/test/read.cgi/tech/1134388951/
【雑談】C/C++【その1】
http://pc8.2ch.net/test/read.cgi/tech/1098817686/
0010v(^・^)v
2006/04/28(金) 10:07:38>>10
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
>>11
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後死ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
0011v(^・^)v
2006/04/28(金) 10:13:17ぜひ教えてください。
D&Eも書いておくか。
The Design and Evolution of C++
http://www.amazon.co.jp/exec/obidos/ASIN/0201543303/
C++の設計と進化
http://www.amazon.co.jp/exec/obidos/ASIN/4797328541/ (翻訳)
0012デフォルトの名無しさん
2006/04/28(金) 10:15:46http://www.amazon.com/gp/product/0201543303/102-8306451-1796138?n=283155
0013デフォルトの名無しさん
2006/04/28(金) 11:29:410014デフォルトの名無しさん
2006/04/28(金) 12:26:030015デフォルトの名無しさん
2006/04/28(金) 17:59:090016デフォルトの名無しさん
2006/04/28(金) 18:05:55Effective with the March 2006 issue, the C/C++ Users Journal has merged with Dr. Dobb's Journal, which will now feature expanded C and C++ coverage.
ってことで、CUJはDr. Dobb's Journalと合併
>>5のリンクも修正した方がいいんじゃないの、ということ
次スレで修正だな
0017デフォルトの名無しさん
2006/04/28(金) 22:09:10typedef std::map<std::string, Function> _map;
このようにして、std::string型をキーとして引数を取らないvoid型の関数を格納できますが
ここで、格納したい関数の戻り値がそれぞれ違うものであったり
引数の個数や型がバラバラの場合でも同じmapに格納する方法がありましたら教えて頂きたいです
0018デフォルトの名無しさん
2006/04/28(金) 22:25:42関数オブジェクト
0019デフォルトの名無しさん
2006/04/28(金) 22:26:430020デフォルトの名無しさん
2006/04/28(金) 22:27:43関数呼び出し式の形が同じにできるのであればboost::functionが使える。
0021デフォルトの名無しさん
2006/04/28(金) 22:28:450022デフォルトの名無しさん
2006/04/29(土) 09:01:37それ、取り出したときにどうやって使うの?
0023デフォルトの名無しさん
2006/04/29(土) 17:29:54これだけではあれなので、詳細を書かせて頂きたいと思います。
>>22さんの鋭い質問で深く考えさせられました。取り出すというか、引数がバラバラなのにどうやって使うんだ、と。
結果的に、考え付いたのが
CApp p; std::map< std::string, boost::function0< void > > map;
map["aaa"] = boost::bind(&CApp::FuncA, &p, "aiueo");
このようにすることで、どんな引数の数、内容でもキー毎に固定できれば
map["aaa"](); と同じ呼び出し式を使う事ができ、>>17の目的は達成されました。boostすげえ。
では、長文すいませんでした。
0024デフォルトの名無しさん
2006/04/29(土) 20:55:300025デフォルトの名無しさん
2006/04/29(土) 20:56:250027デフォルトの名無しさん
2006/04/30(日) 01:21:08いやまてw 初心者スレで聞いてもまったく同じ答えだぞw
0029デフォルトの名無しさん
2006/04/30(日) 02:46:57srand((unsigned)time(NULL));
のことだと予言。
0030デフォルトの名無しさん
2006/04/30(日) 03:03:52俺のエスパー能力だと、
0から99まで、100個の、重複しないランダムな乱数列が欲しいんじゃないかと。
0031デフォルトの名無しさん
2006/04/30(日) 03:09:560032デフォルトの名無しさん
2006/04/30(日) 03:11:08なるほど。そっちの方があってそうだな。
0〜99までの値をランダムシャッフルでおkだな。
ランダムシャッフルのアルゴリズムは定番のがあるから
ググれば出てくるだろう。
0033デフォルトの名無しさん
2006/04/30(日) 03:16:170034デフォルトの名無しさん
2006/04/30(日) 03:35:55003524
2006/04/30(日) 03:37:29srand((unsigned)time(NULL)); は使っています。
配列ですね。
分かりました。
皆さんスレ違いなのにどうもありがとうございました。
0036デフォルトの名無しさん
2006/04/30(日) 03:41:19本当に質問したいことをはっきりさせるべきだと思われ。
003724
2006/04/30(日) 03:51:45そうですね。
確かに説明不足で何が知りたいか分からない文章でした。
乱数 配列とランダムシャッフルでググったら両方知りたいソースコードが見つかりました。
本当にありがとうございました。
0038デフォルトの名無しさん
2006/04/30(日) 11:12:08ものすごく不思議だ。
教育され損なうって恐ろしいことだな。
0039デフォルトの名無しさん
2006/04/30(日) 11:57:530040デフォルトの名無しさん
2006/04/30(日) 12:01:07それはクライアントに恵まれていないのです、オー人事でも無理です。
だけど実際にそういう目に遭うことはたまにあります orz
0041デフォルトの名無しさん
2006/04/30(日) 12:15:40それは運がいいだけです。現実は、そんなクライアントばかりです。
0042デフォルトの名無しさん
2006/04/30(日) 14:19:41例
4.9->5
6.2->6
0043デフォルトの名無しさん
2006/04/30(日) 14:23:55int answer = (int)(value + 0.5);
0044デフォルトの名無しさん
2006/04/30(日) 15:19:01http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#566
0045デフォルトの名無しさん
2006/04/30(日) 15:26:29言葉のあやを挙げられても……。
0046デフォルトの名無しさん
2006/04/30(日) 15:30:530047デフォルトの名無しさん
2006/04/30(日) 16:11:00素直に知っとけばいいじゃないか >>45-46
0048デフォルトの名無しさん
2006/04/30(日) 23:21:53using namespace std;
template <typename T>
bool less(const T &ref1, const T &ref2) {
return ref1<ref2;
}
int main()
{
cout << less<char>('A', 'B') <<endl;
}
これをg++でコンパイルすると、less undeclared (first use this function)
とエラーになってしまいます。どこがいけないんでしょうか?
0049デフォルトの名無しさん
2006/04/30(日) 23:29:30lessは標準ライブラリに定義されている(std::less)。
多重定義エラー。
0050デフォルトの名無しさん
2006/04/30(日) 23:30:51四捨五入って言葉を知らないの?
それとも敢えて使ってないの?
0051デフォルトの名無しさん
2006/04/30(日) 23:32:360052デフォルトの名無しさん
2006/04/30(日) 23:48:170053デフォルトの名無しさん
2006/05/01(月) 00:24:55g++は知らないけど'A'とか'B'とかをint型と認識してるのかな?
C++では文字定数はcharのはずなんだけど…。
VC++6ではちゃんとコンパイルできて動くね。
>>49
less undeclared(lessは宣言されていない)って書いてるじゃん。
多重定義エラーってのはなかろ。
0054デフォルトの名無しさん
2006/05/01(月) 00:26:39とりあえず
-less<char>('A', 'B')
+less('A', 'B')
でも通らないか?
005548
2006/05/01(月) 00:37:01また、::less() とスコープ演算子を付けてみたら通り、動きました。
うーん、やはり多重定義エラーなんでしょうか?
このスコープ演算子をつけた場合、どちらのlessを見に行ってる
のかなと悩んでいたんですが、自作の方のless()を見に行っている
ようです。うーん。
005648
2006/05/01(月) 00:42:19そのように書き直してコンパイルしてみたらどちらも
no matching function for call to 'std::less<char>::less(char, char)'
といわれますた。
0057デフォルトの名無しさん
2006/05/01(月) 00:57:15005848
2006/05/01(月) 01:06:47正しくは、
cout << less<char>('A', 'B') <<endl;
これを
cout << -less<char>('A', 'B') << endl;
cout << +less('A','B') << endl;
の各々でやった場合、どちらも
'less' undeclared (first use this function)
と怒られますた。
おとなしくテンプレート関数名を変えときますです。
ありがとうございました。
0059デフォルトの名無しさん
2006/05/01(月) 01:22:060060デフォルトの名無しさん
2006/05/01(月) 01:39:090061デフォルトの名無しさん
2006/05/01(月) 01:57:39using namespace N;
int f();
int main() { return f(); }
これでも
:4: error: `f' undeclared (first use this function)
だと。
ちなみに cygwin の gcc 3.4.4 ね。
エラーになるのはいいんだが、このエラーメッセージはひどい。
0062デフォルトの名無しさん
2006/05/01(月) 02:12:080063デフォルトの名無しさん
2006/05/01(月) 07:09:31G++の3.4.6, 4.0.3は、
foo.c: In function `int main()':
foo.c:4: error: use of `f' is ambiguous
foo.c:3: error: first declared as `int f()' here
foo.c:1: error: also declared as `struct N::f' here
foo.c:4: error: `f' was not declared in this scope
0064デフォルトの名無しさん
2006/05/01(月) 07:14:010065デフォルトの名無しさん
2006/05/01(月) 07:18:13なんか最後に余計なのが残ってるな。
0066デフォルトの名無しさん
2006/05/01(月) 09:24:06no suitable `%s' in this scope
にするといい具合いだと思われ。
0067デフォルトの名無しさん
2006/05/01(月) 09:30:390068デフォルトの名無しさん
2006/05/01(月) 23:26:29一年ちょっと前にC言語の本を読んでプログラムの勉強を初めて、自分でコードを書いて、
その次にアルゴリズム本等を読んで、またコードを書いて、
今はC++の勉強に取り組みつつコードを書いているという段階なんですが
次に買う本について相談があります。
標準ライブラリの使い方や、基礎的なアルゴリズムを解説している本ではなく、
クラスの上手な作り方、C++プログラミングの常識を勉強できるような本を探しています。
そこで C++ FAQ と Effective C++ に目をつけたのですが、まずどちらを買うべきか迷っています。
自分の希望としては、(どちらも難しい本だろうけれども)少しでも読みやすい方を買いたいのですが
何かアドバイスして頂けないでしょうか
0069デフォルトの名無しさん
2006/05/01(月) 23:29:120070デフォルトの名無しさん
2006/05/01(月) 23:36:330071デフォルトの名無しさん
2006/05/01(月) 23:45:24Effective C++を買うか、これの3rdの日本語版(もうすぐ出る?)
が出るまで待つか。C++ Coding Standardもなかなか良い。
0072デフォルトの名無しさん
2006/05/01(月) 23:56:41CエキスパートがC++を業務で使い始めて半年間で蓄積したノウハウが全てEffectiveC++に書かれていた。
つまり、EffectiveC++はその位有用だと言うことだ。
007368
2006/05/02(火) 00:23:05ぐぐって調べてみました。
Effective C++ 第三版 もう出てるみたいです。amazon に今日付けのレビューが一件だけ入ってました。
他の本にも興味はありますが、悩んでも仕方ないし
何か縁を感じたのでとりあえず Effective C++ にしておきます
0074デフォルトの名無しさん
2006/05/02(火) 00:28:53明日でもちょっくら立ち読みして、良さそうだったら買ってくるか。
誰か既に突撃した人いる?
0075デフォルトの名無しさん
2006/05/02(火) 00:42:21まぁ俺は改訂二版が手元にあるから第三版は買ってないので断言はできないが
0076デフォルトの名無しさん
2006/05/02(火) 01:12:570077デフォルトの名無しさん
2006/05/02(火) 01:21:060078デフォルトの名無しさん
2006/05/02(火) 01:26:03禿本を活用できるレベルの人は既に禿本を読んでいる
禿本を活用できるレベルでない人には、もっと適した本が一杯ある
0079デフォルトの名無しさん
2006/05/02(火) 01:55:45EffectiveC++が有名すぎて。
0080デフォルトの名無しさん
2006/05/02(火) 02:32:380081デフォルトの名無しさん
2006/05/02(火) 03:07:27最新C++ではないけれど、設計の考え方が参考になる。
0082デフォルトの名無しさん
2006/05/02(火) 10:31:30俺はその本で、引数付きマニピュレータの定義の仕方を初めて知った。
それから、テンプレートと関数オブジェクトの組み合わせとか、ぱっと見
は簡単そうだが、じっくり読むと深い内容まで突っ込んだ事が書いて
あるね。
0083デフォルトの名無しさん
2006/05/02(火) 11:27:21それぞれCFrontのテスタ、マネージャ。
初期のC++設計&処理系開発の中心にいた人たち。
「C++の設計と進化」のKoenigの登場回数と言ったら…
禿の次くらいにC++設計への貢献が大きいんじゃないか?
0084デフォルトの名無しさん
2006/05/02(火) 12:05:57Exceptional C++ の sutter 氏と、Modern C++ Design の Andrei 氏が
さまざまな書籍から要点をピックアップしてくれていて、読みやすい。
一通り読んだあとで、Effective や、Exceptional を読むとより分かりやすいし。
0085デフォルトの名無しさん
2006/05/02(火) 12:16:51あれ説明がないから、最初は辛い。
0086デフォルトの名無しさん
2006/05/02(火) 13:00:420087デフォルトの名無しさん
2006/05/02(火) 15:48:01Effective C++ 第三版は今回はアスキーではなくてピアソンだそうだ。
http://www.amazon.co.jp/exec/obidos/ASIN/4894714515/qid=1146552307/sr=1-4/ref=sr_1_10_4/249-1722344-5945958
来週頭から本屋に配送予定だと。もちろん予約してきた。
0088デフォルトの名無しさん
2006/05/02(火) 16:57:14中が2色刷りなのにびっくり
高いだけある(のか?)
0089デフォルトの名無しさん
2006/05/02(火) 17:13:13同意。
0090デフォルトの名無しさん
2006/05/02(火) 18:19:414月29日発売とは言っても、東京の問屋に卸すのが29日の場合は今日書棚にあるとは限らない、
GW明けまでずれこむ恐れもある、と言われたよ
梅田まで出て行ったら見つかったけど
0091デフォルトの名無しさん
2006/05/02(火) 19:12:420092デフォルトの名無しさん
2006/05/02(火) 19:42:07同じ書名で版が違うだけなのに内容がかなり違うとかなんか本として微妙。
0093デフォルトの名無しさん
2006/05/02(火) 19:48:41俺もそこが知りたい。
改訂前の第一版を持ってる俺としては。
0094シャビ
2006/05/02(火) 21:38:22ファイルからデータ読み込んだ時に、仮想関数テーブルポインタが壊れないようにしたいのですが…
各メンバ別個に読み書きしたり、メンバを構造体にするのはなるべく避けたいので、何か良い方法があれば教えて下さい。
0095デフォルトの名無しさん
2006/05/02(火) 21:40:21構造体にしたほうがわかりやすいんじゃないかなあ。利用側としては。
0096デフォルトの名無しさん
2006/05/02(火) 22:28:49Boost.Serializationはだめか?
0097デフォルトの名無しさん
2006/05/02(火) 22:53:22とかした場合、buf[1]〜buf[9]まで0で初期化される保証はあったっけ?
構造体の場合と同様に、初期値の指定が無い残りの部分は0で埋められると考えていいのかな?
0098デフォルトの名無しさん
2006/05/02(火) 23:01:33その保障はある。
足りないところは0初期化される。
0099シャビ
2006/05/02(火) 23:23:15サンクス!
Serializationについて調べてみる事にします。
普通は構造体にするのかな?
0100デフォルトの名無しさん
2006/05/02(火) 23:48:12fprintfの値渡し書きして、scanfのパラメータ&の参照渡し機能使って読むって手もあるが、
環境が分からないから何出せばいいか分からないけど、シリアライズオブジェクト使うのがいいと思う。
0101デフォルトの名無しさん
2006/05/03(水) 00:07:010102シャビ
2006/05/03(水) 00:38:23確かにfread、fwriteよりはずっと楽ですねー
0103デフォルトの名無しさん
2006/05/03(水) 01:05:53rdbuf()からいろいろいじってみたんだけど、頭は指定できてもケツが決まらくて難航中。
具体的な状況としては、複数のファイルがその行数と共に詰まってるアーカイブもどきから
一つのファイル分だけ取り出して、パーサーに渡そうとしている所。
0104デフォルトの名無しさん
2006/05/03(水) 03:01:07http://f42.aaa.livedoor.jp/~imawaka/imgboardphp/src/1146577850180.jpg
のエラーが出るんですが、
ダイアログに「ActiveXコントロールの挿入」をした際に出ます。
なぜでしょうか?
0105デフォルトの名無しさん
2006/05/03(水) 03:05:16スレ違い。
以下、スレ名検索だけで誘導。
MFCではじめるActiveXプログラミング
http://pc8.2ch.net/test/read.cgi/tech/1143185353/
■MFC相談室 mfc16d.dll■
http://pc8.2ch.net/test/read.cgi/tech/1146117893/
0106デフォルトの名無しさん
2006/05/03(水) 03:08:42行数で決まるんだろ。普通に書けるじゃないか。何が不満だ?
0107デフォルトの名無しさん
2006/05/04(木) 00:00:24普通にといわれてもなぁ。
0108デフォルトの名無しさん
2006/05/04(木) 01:16:460109デフォルトの名無しさん
2006/05/04(木) 22:19:06例えば、ですけど、
std::getlineの引数にはどんな型が来て、戻り値の型がこうで・・・
みたいなことが知りたいんです。
Cのときはmanを参考にしたりしていたんですが、
何かリファレンス本を買った方が良いですかね?
0110デフォルトの名無しさん
2006/05/04(木) 22:24:04規格票
0111デフォルトの名無しさん
2006/05/04(木) 22:25:53この当たりでもいいかもしれんな。
http://volga.eng.toyama-u.ac.jp/~mii/lab/manual/fujitsu/C++/
0112デフォルトの名無しさん
2006/05/04(木) 22:37:10勘弁してくださいorz
>>111
ありがとうございました。
いまこんなの見つけたんですが、
ちょっとこれを参考にしてみようと思います。
さっき結構探したのになんでここが見落としてたんだろう・・・すみません。
http://web.archive.org/web/20050227093643/http://www.shibu.jp/cppreference/all_cpp.html
いまはwww.shibu.jpが落ちてるのか、
直接はアクセスできないみたいですけど。
0113デフォルトの名無しさん
2006/05/04(木) 22:43:49libstdc++のmanをインストールして、
$ man 3 std::iostream
doxygenで生成しているからhtml版もあるよ。
0114デフォルトの名無しさん
2006/05/04(木) 22:46:03おなじサーバで運用中(?)の swig.jp とか unittest.org もずっと死んだままス。つд`)
なんか渋チン、社会人になってからサーバのメンテを放棄してる?
0115デフォルトの名無しさん
2006/05/05(金) 00:18:07どうもありがとう!
インストールってどうやったらいいのかよく分かんなかったので、
適当にlibstdc++-man-20051007.tar.bz2をDLしてきて
中身を既存のman3にコピーしたら
なんかうまく行ったっぽいです。
>>114
できたら復帰して欲しいですね。
さしあたって
http://www.shibu.jp/cppreference/cppreference.zip
がArchive.orgにあったら良かったんだけどそれも無いし・・・
0116デフォルトの名無しさん
2006/05/05(金) 00:32:21捨てメアドでも晒してくれたメールで送るよ。
0117デフォルトの名無しさん
2006/05/05(金) 00:39:36#include <iostream>
using namespace std;
int sub( int* p_num )
{
p_num = new int;
*p_num = 10;
cout << *p_num << endl;
return 0;
}
int main()
{
int* p_num = 0;
sub( p_num );
cout << *p_num << endl; // * を外してアドレスを表示すると 0 となる
delete p_num;
return 0;
}
最初はどこで引っかかっているのか判りませんでしたが、今はとりあえず
呼び出し側の main 関数に p_num = new int; が反映されておらず
存在しないものを delete しようとしているからエラーが起きることが判りました。
しかし sub 関数の側では 10 という値が確かに表示されているし
なぜポインタで渡してるのに呼び出し元に 10 が伝わってこないのかが判りません。
new 演算子で用意したメモリは delete で明示的に捨てるまで確保されたままだと思っていたのですが
もしかしてこれが勘違いだったのでしょうか
0118デフォルトの名無しさん
2006/05/05(金) 00:41:35ポインタを勉強しる
0119デフォルトの名無しさん
2006/05/05(金) 00:50:300120デフォルトの名無しさん
2006/05/05(金) 00:52:37趣旨が真逆だけどこれでも読んで勉強しれ。
http://www.01-tec.com/document/without_pointer.html
0121デフォルトの名無しさん
2006/05/05(金) 00:53:42>>117
>なぜポインタで渡してるのに呼び出し元に 10 が伝わってこないのかが判りません。
なぜ渡されたポインタを new で潰してるのかが判りません。
0122デフォルトの名無しさん
2006/05/05(金) 01:00:01自分が分かった部分だけだけど、欠陥が2箇所見つかった。
>int* p_num = 0;
&p_numに0x00000000が入ってしまっている。
intprep=0;
int* p_num = &prep;
こうダミーを使ってやれば解決する。
>int sub( int* p_num )
>{
>p_num = new int;
これは是非、デバッガを使って、intの前にブレークポイント置いて、ステップオーバでp_numの値に注目してもらいたいのだけど、
この関数は参照で、int*p_numでアドレスを受け取っている。
次にnewして新たにp_numにアドレスを割り当てている。この時点で受け取ったアドレスと内容はゴミとしてメモリ上に浮くことになる。
そして、main側(sub( p_num );を発した側)はアドレスが変わったことを知るすべもなし、ゴミのアドレスと値を参照することになる(元々の値)。
実行時、エラーがでなくとも、たまたま短かっただけで、新たなスタックがそこに侵食してくると、もしp_numアドレス参照すると、
AccessViolationかMemoryAssertionかなんらかのエラーがでると思う。
0123デフォルトの名無しさん
2006/05/05(金) 01:02:40うまくいかなかったとき、デバッガなしだと、脳内妄想で終わってしまう。
自分もうやむやのまま進んで、何度も初歩に戻ったしなあ。
0124デフォルトの名無しさん
2006/05/05(金) 01:03:17まじですか!お言葉に甘えていいですかね?
[email protected]
よろしくお願いします。
0125デフォルトの名無しさん
2006/05/05(金) 01:09:17std::strlen等と、strlen等は同じなんですか?
#include <iostream>としておけば、
Cだとそれぞれ別にヘッダファイルをincludeしておかないと使えない関数も含め、
ほとんどのCの標準ライブラリ関数が使えるようですが・・・
std名前空間のメンバである
Cの標準ライブラリ関数と同じ名前の関数は、
Cの標準ライブラリ関数とまったく同じものだと考えて良いんですか?
std::strlenと書いても、ただstrlenと書いても同じように動作するわけですが、
これはどういうことなんでしょうか?
あと、試してみた中では数学関数はstd空間にないみたいで、
これはmath.hをincludeしないと使えないようですが、
なんでこんな風になってるんですかね?
0126デフォルトの名無しさん
2006/05/05(金) 01:12:32送ったお。
0127デフォルトの名無しさん
2006/05/05(金) 01:15:24コンパイラ書けよ。俺のコンパイラの挙動と違うぞ。俺のはVC8ね。
0128デフォルトの名無しさん
2006/05/05(金) 01:17:23届きました。
本当にありがとうございました!
0129125
2006/05/05(金) 01:21:13すんません、gcc(g++)使ってまして、
gcc_selectの結果は
Current default compiler:
gcc version 4.0.0 20041026 (Apple Computer, Inc. build 4061)
なんですが。
0130デフォルトの名無しさん
2006/05/05(金) 01:25:48#include <cmath> だろ。
0132125
2006/05/05(金) 01:32:03自分の環境では#include <cstring>等々することなく
std::strlenとか単にstrlenと言った風に使えてしまうんですが、
これは問題でしょうか?ちゃんと#include <cstring>とすべきですか?
また、std::strlenという風に使うのと、単にstrlenという風に使うのとでは、
まったく同じことだと思っていいのかどうなのか分からないんですが、
その点についてはどうなんでしょうか?
0133デフォルトの名無しさん
2006/05/05(金) 01:40:49あーそれどっかで問題になってたな。
std付けないと見えないはずなのに、見えてしまうという問題。
どこでだっけ・・・
0134デフォルトの名無しさん
2006/05/05(金) 01:41:32>#include <iostream>としておけば、
>Cだとそれぞれ別にヘッダファイルをincludeしておかないと使えない関数も含め、
>ほとんどのCの標準ライブラリ関数が使えるようですが・・・
たまたま<iostream>内で間接的に#includeしてるだけで
使いたい関数があったらちゃんと対応するヘッダを#includeすべき。
0135デフォルトの名無しさん
2006/05/05(金) 01:45:240136125
2006/05/05(金) 01:47:26ありがとうございます。
ということは、
使いたい関数があるときは
#include <cmath>なり、#include <cstring>なり、
きちんとincludeして、std::〜という形で使うのが正解、
ということですね?
ちなみに、includeするときにcmathとかcstringとか
頭にcが付いているってことは、
その動作はCの標準ライブラリ関数とまったく同じと考えても良いんですよね?
0137デフォルトの名無しさん
2006/05/05(金) 01:49:090138125
2006/05/05(金) 01:51:450139デフォルトの名無しさん
2006/05/05(金) 01:55:430140デフォルトの名無しさん
2006/05/05(金) 01:56:30おまえ、あれはコンパイラを作るヤツやC++の解説書を書くヤツなんかの為にあるもんだぞw
0141126
2006/05/05(金) 02:00:20そういえばミラーがあったの忘れてたw
0142デフォルトの名無しさん
2006/05/05(金) 02:32:40「規格読め」はそもそも言った本人が読んだことなくて
しかも質問にきちんと答えられないときに使うセリフなんで
真に受けちゃダメよ
0143デフォルトの名無しさん
2006/05/05(金) 02:39:44言われて悔しい思いをした経験がおありで?
0144140
2006/05/05(金) 02:54:30コンパイラ云々ではなくC++の仕様的にどうなのかって質問なら「規格嫁」が正論だろ。
コンパイラの挙動ではなくC++の厳密な仕様を気にするぐらいなら規格票を購入すべき。
規格票も持たず、基本的な仕様すら規格上でどうなってるかも知らないのに
部分的な仕様だけを知ろうとするのはナンセンス。
0145デフォルトの名無しさん
2006/05/05(金) 03:08:22コピペして、簡単な説明を付けろって事だな。
著作権の問題とかはどうなるのかはよくわからないが、少なくとも、
貼り付けた本人が「実は質問に答えられないのでただ言ってみた」
わけではない事がわかるだろう。
0146デフォルトの名無しさん
2006/05/05(金) 08:10:360147デフォルトの名無しさん
2006/05/05(金) 10:58:17libstdc++もmanあるのね知らんかった
Thanks!
0148デフォルトの名無しさん
2006/05/05(金) 12:19:01このスレでされたことは一度もないぞ
0149デフォルトの名無しさん
2006/05/05(金) 12:22:42ウソつくな。そんな質問いくつもされてきたぞ。
で、そのたびに「スレ違い」というレスが返されてきた。
0150デフォルトの名無しさん
2006/05/05(金) 15:56:58それが本当に試される状況は怖いから避けたい人、
そういう人種が「そのくせ偉そうにしたい」時には便利ですよね<○○読め
0151デフォルトの名無しさん
2006/05/05(金) 16:03:07>>145
0152113
2006/05/05(金) 16:21:19「規格票読め」もあながち外した答えとは言えないような…
まずは>>113や>>141でいいと思うけどね。他にいいのある?
ちなみに>>113のHTML版公開しているのは↓ここ。
http://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-3.4/index.html
http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/index.html
http://gcc.gnu.org/onlinedocs/libstdc++/documentation.html より
俺は自宅のマシンで全文検索エンジンでインデックス作ってる。boostも。
0153デフォルトの名無しさん
2006/05/05(金) 16:33:30サードパーティのは利用せず(?)に、標準のもので実現したいのですが。
0154デフォルトの名無しさん
2006/05/05(金) 16:37:11boost::regexが次の標準に入る奴に近い。
0155デフォルトの名無しさん
2006/05/05(金) 16:37:13boost ならここやね。
http://boost.cppll.jp/HEAD/
http://boost.cppll.jp/HEAD/libs/libraries.htm
>>153
boost::regex じゃだめ?
boost はまだ準標準というべきものだが。
0156153
2006/05/05(金) 16:46:58今
http://www.s34.co.jp/cpptechdoc/article/regexpp/
を見ているのですが、スキルが足りないためぱっと見理解できないです。
サンプルのとおりにやってみようと思います・・
0157デフォルトの名無しさん
2006/05/05(金) 16:47:55とりあえず触って覚えろ。
0158153
2006/05/05(金) 18:37:08動かしたいと課題を出した人が言うと思うので、自分で書こうと思います。
あとインストールに時間がかかるというのと、いくつかインストール方法の載ってる
サイトを検索したけども、そこにある用語すら分からず正常にインストールできている
か不明のため
0159デフォルトの名無しさん
2006/05/05(金) 18:42:22余計なもの入れなければ
ヘッダだけあれば動くんじゃないの?
0160デフォルトの名無しさん
2006/05/05(金) 18:42:39他のPCでも動くと思うが。。。
0161デフォルトの名無しさん
2006/05/05(金) 18:42:52自分でパーサを書くという意味?それは無茶があると思う。
boost を用いたプログラムを書いても、特別な dll 等は必要ないし
そのままやった方が早いかと。
0162デフォルトの名無しさん
2006/05/05(金) 18:49:35得体の知れないモノなわけで、そんなモノに頼りたくないって気持ちは
わかるが騙されたと思って boost 使っとけ。
0163デフォルトの名無しさん
2006/05/05(金) 19:10:050164デフォルトの名無しさん
2006/05/05(金) 19:31:21環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
0165デフォルトの名無しさん
2006/05/05(金) 19:37:09すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
0166デフォルトの名無しさん
2006/05/05(金) 19:40:550167デフォルトの名無しさん
2006/05/05(金) 19:48:250168デフォルトの名無しさん
2006/05/05(金) 20:29:320169側近中の側近 ◆0351148456
2006/05/05(金) 20:30:23(っ´▽`)っ
ついでに赤くなるんだよな?
0170デフォルトの名無しさん
2006/05/05(金) 21:33:210171デフォルトの名無しさん
2006/05/05(金) 21:45:09君に取って置きの秘策をお教えしよう。
パ ソ コ ン グ レ ー ド ア ッ プ。
0172デフォルトの名無しさん
2006/05/05(金) 22:02:490173デフォルトの名無しさん
2006/05/05(金) 22:06:130174デフォルトの名無しさん
2006/05/05(金) 22:07:580175デフォルトの名無しさん
2006/05/05(金) 22:10:54まあ、ソースが全部ヘッダに含まれてるわけだからな・・・。
早く export 実装しろよー。
0176デフォルトの名無しさん
2006/05/05(金) 22:27:250177デフォルトの名無しさん
2006/05/06(土) 02:49:55なんか変な流れでかわいそうなのでwマジレスしておくと
静的リンクしておけばDLLはいらんし、そもそもヘッダインクルードだけで使えるライブラリも多い。
ダイナミックリンクにしてもDLLを一緒に配ればすむ話だ。
0178デフォルトの名無しさん
2006/05/06(土) 09:59:410179デフォルトの名無しさん
2006/05/06(土) 11:40:08unix系ならdistccもおすすめ
0180デフォルトの名無しさん
2006/05/07(日) 02:30:200181デフォルトの名無しさん
2006/05/07(日) 09:41:16同名でconst、非constなメソッドがあったとして、
そのメソッドを非constなオブジェクトから呼んだ場合、
どちらのメソッドが呼ばれるのでしょうか?
具体的には下記のようなコードで、func2の中のa.hoge()は
const、非constどちらのメソッドが呼ばれるのか?
とりあえずvc7だと非constメソッドが呼ばれるようですが、
これってどの処理系でも必ず保障されます?
class A {
public:
void hoge() const {
cout << "const" << endl;
}
void hoge() {
cout << "not const" << endl;
}
};
viod func1(const A &a) {
a.hoge() // => const
}
viod func2(A &a) {
a.hoge() // => not const ?
}
0182デフォルトの名無しさん
2006/05/07(日) 09:49:10constの意味を理解してから書けボケ
0183デフォルトの名無しさん
2006/05/07(日) 09:50:19Overload Resolutionのルールによって、保障されている。
詳しく説明すると長くなるけど、
staticでないメンバ関数は、thisを隠れた引数として取るが、
このthisも、オーバーロードされている際のbest candidateを決定するにあたって考慮される。
さらに、thisはcv-qualifiersの影響を受けるので、constなメンバ関数では、thisはconst修飾される。
constなオブジェクトから呼び出した場合は、constなメンバ関数、
constでないオブジェクトから呼び出した場合は、constでないメンバ関数のほうが、
よりbest candidateになる。
0184デフォルトの名無しさん
2006/05/07(日) 10:07:45○保証
0185デフォルトの名無しさん
2006/05/07(日) 10:09:09const なオブジェクトから呼び出した場合は const でないメンバ関数は
candidate にもならないんじゃないか?
0188デフォルトの名無しさん
2006/05/07(日) 10:20:12あまり深く勉強しても、実際に役に立つことは少ないと思うけど。
こんなに複雑なのも、人間にとってより自然な挙動にしようと議論された結果だし。
//! boostのtype traitsを実装しようというなら、話は別だけど。
0189デフォルトの名無しさん
2006/05/07(日) 14:43:24constの意味とか、この質問にはまるで関係ないじゃんw
あとあとまともな回答があっただけに、大恥さらしちゃったねww
0190デフォルトの名無しさん
2006/05/07(日) 14:55:51189 名前: デフォルトの名無しさん [sage] 投稿日: 2006/05/07(日) 14:43:24
>>182
constの意味とか、この質問にはまるで関係ないじゃんw
あとあとまともな回答があっただけに、大恥さらしちゃったねww
0191デフォルトの名無しさん
2006/05/07(日) 20:13:400192デフォルトの名無しさん
2006/05/07(日) 20:20:08途中でconst外されちゃまいっちんぐ
というルールなわけだし
0193デフォルトの名無しさん
2006/05/07(日) 20:24:30非 const なオブジェクトなら const メンバ関数も、非 const メンバ関数も安全に呼び出せる。
どっちでもよさそうだが、その場合にどっちになるのか?という質問だ。
const の意味は十分理解しているものと思われる。
0194デフォルトの名無しさん
2006/05/07(日) 21:17:220195デフォルトの名無しさん
2006/05/07(日) 21:49:47*c = '\0';
と、
char *c = NULL;
って同じ意味?
0196デフォルトの名無しさん
2006/05/07(日) 21:51:590197デフォルトの名無しさん
2006/05/07(日) 21:53:46必ずしも違うとは言い切れない気もしてきた
0198デフォルトの名無しさん
2006/05/07(日) 21:54:59どう考えたら同じだと思えるの?
0199デフォルトの名無しさん
2006/05/07(日) 21:55:43文字コードにASCIIを使っている場合。
0200デフォルトの名無しさん
2006/05/07(日) 21:58:43もしかしてNULLと'\0'の違いがどーとか考えてないか?
char *c;
c = 0;
と、
char *c = NULL;
ならお前の悩みも解らなくもないが・・・
0201200
2006/05/07(日) 22:00:15誤
char *c;
c = 0
正
char *c;
c = (char *)0;
0202デフォルトの名無しさん
2006/05/07(日) 22:03:560203デフォルトの名無しさん
2006/05/07(日) 22:04:24その前提で、もうちょっと変形すれば動作が同じになると思えなくも無いが、
やっぱり意味はぜんぜん違う。
0204デフォルトの名無しさん
2006/05/07(日) 22:08:19みなさんミスしないでやれるんですか?
ポインタ勉強したいけど怖くて・・・><
0205デフォルトの名無しさん
2006/05/07(日) 22:16:46まともなOSが走っているマシンで実行するなら大丈夫。
安心してポインタいじれ。
0206デフォルトの名無しさん
2006/05/07(日) 22:17:52そんなうんこは死ねばいいと思うよ
0207デフォルトの名無しさん
2006/05/07(日) 22:19:382.例外逃すとプロセスがぼよよーん
3.最悪はシステム(OS)が凍てつく
0208デフォルトの名無しさん
2006/05/07(日) 22:23:05それ、まともじゃないOSの話だろ。
0209デフォルトの名無しさん
2006/05/07(日) 22:33:440210デフォルトの名無しさん
2006/05/07(日) 22:37:230211デフォルトの名無しさん
2006/05/07(日) 22:46:380212デフォルトの名無しさん
2006/05/07(日) 22:53:380213デフォルトの名無しさん
2006/05/07(日) 23:07:52コアを吐く Unix/Linux のヘタレっぷりを初めて知った時にはワロタ。
0214デフォルトの名無しさん
2006/05/07(日) 23:14:33catch(...) で一般保護例外を拾ってしまうのは、それはそれで問題なわけだが。
0215デフォルトの名無しさん
2006/05/07(日) 23:14:59個人的に、そういう種類の例外は、環境依存の方法でキャッチすべきだと思っているんだけど。
まあ、VC++ならどういう例外が投げられてきたかを知る方法だけはあるから、まだましか。
0216デフォルトの名無しさん
2006/05/07(日) 23:20:20これができるとできないとでは大きな差があることぐらいはわかるよね?
0217デフォルトの名無しさん
2006/05/07(日) 23:25:01できるできないの問題ならいいんだが、強制されてしまうぶんには
どっちが有利ともならないなぁ。
0218デフォルトの名無しさん
2006/05/07(日) 23:38:19例外処理の使い方を考えれば強制されるという概念を持つ事は変だと思う。
が、その「強制された」としてなんか困ることや嫌なことが具体的にあるの?
俺はこの件に関しては Unix/Linux はダメダメと結論している( もちろん
そんな一点の問題で Unix/Linux 自身がダメダメと結論づけるようなつもりは
毛頭無い。 )が、そうでない意見があるなら聞いておきたい。
0219デフォルトの名無しさん
2006/05/07(日) 23:51:59「C++の例外処理」「unixのsignal」「WindowsのSEH」を混同してませんか?
C++の例外風に処理を記述できるWindowsのSEHは便利だよね、というだけの話。
まぁSEHには「知識や権限に関わらず、早く例外を捕まえた人が処理できてしまう」
という問題があるため結局VEHが導入されたわけだが。
0220デフォルトの名無しさん
2006/05/08(月) 00:01:19よく知らないんだが throw() と考えられる関数からも一般保護例外は飛んでくるよね?
ちゃんとそれ考慮して、スタックの巻き戻しができるようにコード生成してくれるの?
try{
std::auto_ptr<T> p(new T);
strcpy(0,0);
}catch(...){
// ここにくるまでに p の delete は行われるの?
}
行われるとしたら、とても非効率なコードが生成されてしまいそうなんだけど。
0221デフォルトの名無しさん
2006/05/08(月) 00:01:45一応知ってはいるが、混同はあるかも知れん。が、結局どこがどう問題なの?
自分が知っている例外についてはそれぞれ型を明記してそれぞれに合わせた処理をして、
その他の例外がきたらまとめて処理する。この「その他の例外」に「unixのsignal」 or
「WindowsのSEH」が含まれることは全然welcomeだと思うんだが。
0222デフォルトの名無しさん
2006/05/08(月) 00:04:32それはダブルフォールトになって落ちる。
これはまた別の問題だと思う。
0223222
2006/05/08(月) 00:05:26ダブルフォールトじゃなかったかも。
とにかく落ちる。
0224デフォルトの名無しさん
2006/05/08(月) 00:30:19#include <cstdio>
int main()
{
try{
struct T { ~T(){ puts("~T()"); } } x;
puts("causing access violation");
char* p = 0;
*p = 0;
}catch(...){
puts("catch(...)");
}
}
0225デフォルトの名無しさん
2006/05/08(月) 00:33:270226デフォルトの名無しさん
2006/05/08(月) 00:33:50VC++なら_set_se_translator()使わないと自分で throw した例外以外
( 一般保護例外,ゼロ除算,等々 )は catch(...) でも拾えずに
Dr.WatsonをよぶWindows のヘタレっぷりを初めて知った時にはワロタ。
0227デフォルトの名無しさん
2006/05/08(月) 00:35:490228デフォルトの名無しさん
2006/05/08(月) 00:39:00コンパイルオプションを調べれ。
>>226がなんか言ってるけど、そんなことしなくても拾える。
( まぁ、明示的か裏でやってくれるかの違いでしかないかもしれんが。 )
0229デフォルトの名無しさん
2006/05/08(月) 00:42:34何をやっても拾えない Unix/Linux はヘタレ以下ってことでおk?
0230224
2006/05/08(月) 00:43:36/EHa にしたらキャッチできた。 ~T() も呼ばれたみたい。
でもデフォルトじゃないってことは、やっぱり何か問題があったっぽいな。
0231デフォルトの名無しさん
2006/05/08(月) 00:45:34というわけで、強制じゃないってことだな。
それなら便利に使えることもあるだろう。
0232デフォルトの名無しさん
2006/05/08(月) 00:49:06問題と言っても Unix/Linux で動かした時と同じ挙動にさせたいとか
そーゆー互換性の類の問題かも。本当のとこはどーなのか知らんけど。
0233デフォルトの名無しさん
2006/05/08(月) 00:55:08VC7.1だと、/EHsでもキャッチできてしまう。
問題だったんだろうな。
0234デフォルトの名無しさん
2006/05/08(月) 00:55:46本当に何をやっても拾えないの?
0235デフォルトの名無しさん
2006/05/08(月) 00:56:14SEHに対応してなかった頃のプログラムの挙動を変えないようにする為に1票。
0236デフォルトの名無しさん
2006/05/08(月) 00:56:39記述が楽なだけで、出来ることも不便なところもsignalと大差ないでそ?
VEHなら強力で応用範囲が広いので Windows マンせーもわかるけど、
高々SEHは記述がラクってだけで unix はダメ風に言うのはどうか、と言いたかった。
0238デフォルトの名無しさん
2006/05/08(月) 01:00:56知らない環境に対して口を出すなよ。
0239デフォルトの名無しさん
2006/05/08(月) 01:02:11catch(...)って記述だけで全部拾えるのは単に記述がラクって言うのとは違うとは思う。
全てのプログラマが Unix/Linux でのプログラミングに精通してるわけじゃないないんだから。
0240デフォルトの名無しさん
2006/05/08(月) 01:07:52デフォルトじゃないのは、パフォーマンスのためらしい。
http://msdn2.microsoft.com/ja-jp/library/7f10tsf4(en-us,vs.80).aspx
0241デフォルトの名無しさん
2006/05/08(月) 01:08:14確かに簡単というか難しくないアプリ開発とかならそのとおりなんだけど、
signalさえわからん奴に勝手に拾われても・・・ってな話もあると思うよ。
結局SEHではそれが問題でVEHが出てきたわけだし。
0242デフォルトの名無しさん
2006/05/08(月) 01:12:04特定の言語処理系の問題なの? それともUnix/Linuxのしくみ自体がそれを許さないってことなの?
0243デフォルトの名無しさん
2006/05/08(月) 01:17:470244デフォルトの名無しさん
2006/05/08(月) 01:20:00いや別にLinuxにもUnixにも、それを不可能とするような制限は無いよ。
例えば HP C++ なんかではSEH同様の機構が実装されている。
あんまり欲しい人がいないせいか、gccに採用されてないだけ。
0245242
2006/05/08(月) 01:25:23サンクス。よかった、そりゃそうだよね。
それじゃ、そもそも>>213は「GCC(等の対応していない処理系の)のヘタレっぷりにワロタ」ってことなのかな。
0247デフォルトの名無しさん
2006/05/08(月) 01:27:19実際はそういうことなんだろうが、 OS の優劣と混同していると思われ。
0248デフォルトの名無しさん
2006/05/08(月) 06:05:17なんかググってみたところ、SEHに対応させるパッチを作ってる人がいるみたいだけど
gcc みたいにそれなりの頻度でバージョンアップがあり且つバージョンが変わったら
ゴロっと中身が変わってしまうようなプログラムでパッチがあってもあんまりうれしくないなぁ。
0249デフォルトの名無しさん
2006/05/08(月) 06:24:51> ~T() も呼ばれたみたい。
これ、例外の種類によっては、うまくいかないことがある。
特にコンストラクタの中で例外が起きた時。
だからSEHは強い例外安全じゃない。過信は禁物。
0250デフォルトの名無しさん
2006/05/08(月) 10:58:46コンストラクタが完了しないとデストラクタは呼ばれません。基本です。
0251デフォルトの名無しさん
2006/05/08(月) 16:53:56亀レスだが、VC++6.0 を使っているなら、Greta の利用を検討してはどうか。
Boost.Expressive の作者が作ったもので、STL のアルゴリズムに似せた
デザイン。Microsoft のサイトでダウンロードできる。
http://research.microsoft.com/projects/greta/
0252デフォルトの名無しさん
2006/05/08(月) 17:07:50お前がぐれたのは、こういう物を使ったためだったのか。
0253デフォルトの名無しさん
2006/05/08(月) 17:32:40{
Damepo moudamepo;
moudamepo.mandokuse('A');
}
0254デフォルトの名無しさん
2006/05/08(月) 20:32:350255デフォルトの名無しさん
2006/05/08(月) 20:35:25. ┌┬┬┬┐
.―――――┴┴┴┴┴―――、 ______________
|| ̄ ̄ ̄||  ̄||| ̄ ̄ ̄|| | ̄ ̄ヽ /
|| アヒャヒャ| | ||| アヒャ || |_∧ ヽ / では>>254を
||(・∀・)_| |・∀||(・∀・)|| | ) [ ] < 引き取らせていただきまーす
||_ ̄ ̄_|_|_/ | ̄ ̄ ̄.|| | ̄ ̄ ̄ || \_____________
l O| ―-.|O゜| 東京精神病|.|院 ニニ .||
|_  ̄口 ̄ l_l⌒l|____|.|l⌒l_||_|__| ブロロ-‥‥
`ー' ̄ ̄ ̄`ー' `ー' `ー'
0256デフォルトの名無しさん
2006/05/08(月) 20:35:38え?>>254は標準ライブラリしかろくに扱えないの?ショボw
0257デフォルトの名無しさん
2006/05/08(月) 21:02:09いちいち他人の作ったもん探して、自分のソフトに組み込むのが嫌なんだよ
ほんとショボいなC++は。他人にだっこしながらでないと開発できないなんて
0258デフォルトの名無しさん
2006/05/08(月) 21:05:03そういう考えは捨てた方がいいよ。
0259デフォルトの名無しさん
2006/05/08(月) 21:07:160260デフォルトの名無しさん
2006/05/08(月) 21:10:12>ほんとショボいなC++は。他人にだっこしながらでないと開発できないなんて
0261デフォルトの名無しさん
2006/05/08(月) 21:15:59嫌だね。全部自分で作りたい
なんか、他人のもん使うってせこい感じで嫌
効率悪くても自分で作りたい
だからって、どのソフトでも標準である機能をわざわざ自分で作成するのも損した気がするし
やっぱ、C#かVBのほうがいいね
0262デフォルトの名無しさん
2006/05/08(月) 21:22:420263デフォルトの名無しさん
2006/05/08(月) 21:23:04で、君が使っているコンパイラは「他人のもん」ではないのか?
0264デフォルトの名無しさん
2006/05/08(月) 21:24:29>>263
そんな屁理屈でしか言い返せないわけだw
図星だったなw
0265デフォルトの名無しさん
2006/05/08(月) 21:26:490266デフォルトの名無しさん
2006/05/08(月) 21:29:56だったらコンパイラから自分で作れば?
0267デフォルトの名無しさん
2006/05/08(月) 21:30:350268デフォルトの名無しさん
2006/05/08(月) 21:31:18だからって、どのソフトでも標準である機能をわざわざ自分で作成するのも損
日本語も理解できねーのかよカス
0269デフォルトの名無しさん
2006/05/08(月) 21:33:120270デフォルトの名無しさん
2006/05/08(月) 21:34:010271デフォルトの名無しさん
2006/05/08(月) 21:34:21当たり前だろアホか
0272デフォルトの名無しさん
2006/05/08(月) 21:35:010273デフォルトの名無しさん
2006/05/08(月) 21:40:41都合の悪いこと言われるとみんな異常者か?
ほんと異常者のおまえらの思考はとんでもないなw
0274デフォルトの名無しさん
2006/05/08(月) 21:46:34FSMの練習だと思って作ればいいじゃんよ
・・ところで盲点って何?
0275デフォルトの名無しさん
2006/05/08(月) 21:46:530276デフォルトの名無しさん
2006/05/08(月) 21:52:38てか、そんなものがあるかどうか知るすべなんてないし
それに比べてVBはLIKEがある。簡単
C#ならregexがある。簡単
C++は標準ではまともな関数がない
どうやってみ探せばいいかもわからない。
説明サイトもない。書籍もない。誰が好きこのんでC++なんかやるんだよ
時代錯誤もいいところ
0277デフォルトの名無しさん
2006/05/08(月) 21:53:57なかなか正しい意見だからC#勉強したほうがいいよ。
0278デフォルトの名無しさん
2006/05/08(月) 22:00:41そのとおりだ
C#とかJavaとかオススメ
0279デフォルトの名無しさん
2006/05/08(月) 22:05:22「正規表現使いたいんなら正規表現ライブラリ使え」以上、終了。
じゃダメなんか?
0280デフォルトの名無しさん
2006/05/08(月) 22:06:360281デフォルトの名無しさん
2006/05/08(月) 22:07:37そのライブラリはどこにあるんですか?
0282デフォルトの名無しさん
2006/05/08(月) 22:08:460283デフォルトの名無しさん
2006/05/08(月) 22:09:210284デフォルトの名無しさん
2006/05/08(月) 22:09:23C++ 正規表現で検索すれば出てくるのに
0285デフォルトの名無しさん
2006/05/08(月) 22:12:57やっぱboostかよ
なんでVBに正規表現あるのに
C++にはないわけ?
C++使う奴は、VBじゃ文字列処理やポインタなど細かい処理ができないから
C++に来てるのに、正規表現もないってなんだそれ?
一体どういう奴を対象にしてんだよ!まったく
てか、どうせ、正規表現だけじゃなくて、ほかにもVBならあるのにC++にはない
関数とかが大量にあって、その度に、検索しまくって探しまくったりするんだろ?
あーめんどくせ
0286デフォルトの名無しさん
2006/05/08(月) 22:16:54愚痴ならチラシの裏かブログへ
0287デフォルトの名無しさん
2006/05/08(月) 22:21:07┏┫┃┃┃池沼と遊ぶのは ┃┃┃┣┓
┃┃┃┃┣┓ ここまで ┏┫┃┃┃┃
┃ ┃┃┏━━━┓┃┃ ┃
┃ 池沼 ┣┫ . ・∀・ ┣┫. STOP!┃
┗━━━━┛┗┳━┳┛┗━━━━┛
┏┻┓┃
┏━┛ ┣┻┓
┗━━━┫ ┗━┓
. ┗━━━┛
0288デフォルトの名無しさん
2006/05/08(月) 22:24:480289デフォルトの名無しさん
2006/05/08(月) 22:27:220290デフォルトの名無しさん
2006/05/08(月) 22:40:12ttp://pc8.2ch.net/test/read.cgi/tech/1141400056/l50
0291デフォルトの名無しさん
2006/05/09(火) 01:52:48なんで C に複素数あるのに
C++ や VB には(ry
なんで x86 マシン語にはローテートあるのに
C には(ry
まあなんつーか、これが所謂「ヴビチュウ」という生き物か。
0292デフォルトの名無しさん
2006/05/09(火) 02:03:21C++には複素数あるし、
ローテートも Intel C++ Complier とか使えば組み込み関数で提供されてるだろ。
0293デフォルトの名無しさん
2006/05/09(火) 02:15:09まあ、処理系独自に組み込み型の複素数作って、
complex はそれを inline で使ってるだけ・・・
な実装な処理系もあるけどね。
0294デフォルトの名無しさん
2006/05/09(火) 02:15:140295デフォルトの名無しさん
2006/05/09(火) 07:06:330296デフォルトの名無しさん
2006/05/09(火) 07:17:540297デフォルトの名無しさん
2006/05/09(火) 08:22:37.netの間違いじゃないか?
それならC++も同じですが
0298デフォルトの名無しさん
2006/05/09(火) 08:24:46C++ の正規表現
.NET Framework SDK で正規表現クラスを使用する
0299デフォルトの名無しさん
2006/05/09(火) 08:59:09>>281
VB や C# を話しにあげているなら、Visual Studio .NET 以降だろう。
なら、標準でついている ATL に正規表現ライブラリがくっついてる。
Microsoft 純正で、VCなら標準だ。文句ないだろ
0300デフォルトの名無しさん
2006/05/09(火) 09:40:36自分が使いたいものについてはすべて標準ってことにしちゃえばいいじゃない
0301デフォルトの名無しさん
2006/05/09(火) 14:17:45しまったC++なのに、まだ肥大化させるつもりかよ。
0302デフォルトの名無しさん
2006/05/09(火) 14:25:24基地外のように巨大に感じるだけ。
0303デフォルトの名無しさん
2006/05/09(火) 14:37:39言語仕様は大きいのはまあ大きい。
もっと大きなのもあるけど。
より良い言語を作ろうとすると
どうしても言語仕様がデカくなって、
それが為に理解できる人が減ってしまうのは
何か遣る瀬ないな。
0304デフォルトの名無しさん
2006/05/09(火) 14:38:19自己紹介乙。
0305デフォルトの名無しさん
2006/05/09(火) 14:49:38・ありきたり
という表現がぴったりくるな。
0306デフォルトの名無しさん
2006/05/09(火) 15:03:31標準化委員会の方向とは完全な逆方向だな。
0307デフォルトの名無しさん
2006/05/09(火) 15:29:27ってよく聞くけどVBやJavaってそんなに楽なのか
0308デフォルトの名無しさん
2006/05/09(火) 15:46:45文脈毎に意味が変わったりする、って点では複雑だが
まあコンパイラ開発者に比べたら利用者の流す汗と涙なんか
知れたものよね。
0309デフォルトの名無しさん
2006/05/09(火) 15:54:57・generic function系は、大抵適当な奴を選ぶ規則が複雑。
・Javaはinstance methodはvirtualのみ。
・templateの(部分)特殊化
・Cとの互換
0310デフォルトの名無しさん
2006/05/09(火) 16:30:28天才、凡人、馬鹿、すべての層の開発コストが抑えられる言語・環境ではなく、
C++では「馬鹿お断り」だった領域に、馬鹿でも加われるようになる言語・環境なんだよ。
喩えるなら、Javaの利便性は人工呼吸器みたいなもの。
それによって助かる人もいるけど、健常者なら苦もなくやれるところを手助けしてるだけ。
健常者にとっては、それ使って生活するのは何かとうざったい。
0311デフォルトの名無しさん
2006/05/09(火) 16:35:06特殊化がないのも辛い。
0312デフォルトの名無しさん
2006/05/09(火) 16:43:07それじゃVB.netはICUか。
0313デフォルトの名無しさん
2006/05/09(火) 17:31:360314デフォルトの名無しさん
2006/05/09(火) 18:36:470315デフォルトの名無しさん
2006/05/09(火) 20:15:17本格的なものをつくろうとするとそんなにラクでもない。
簡単なものを作る場合には C++ より楽なことが多い。
0316デフォルトの名無しさん
2006/05/09(火) 22:31:06C言語のstrtok()みたいなものです。C++にこのような機能を持った関数はありますか?
g++でコンパイルでき外部のライブラリは使わないという条件なのですが。
0317デフォルトの名無しさん
2006/05/09(火) 22:32:46ワイド文字へ変換してwcstokを使ったらどうか?
0318デフォルトの名無しさん
2006/05/09(火) 22:34:130319デフォルトの名無しさん
2006/05/09(火) 22:34:240320デフォルトの名無しさん
2006/05/09(火) 22:36:58ありがとうございます。それでできそうな感じです。
strtokを含めてC言語の機能みたいですがstringクラスみたいなC++クラス版は実装されてないんでしょうか?
0321デフォルトの名無しさん
2006/05/09(火) 22:38:120322デフォルトの名無しさん
2006/05/09(火) 22:41:07いろいろ手がかりができたので調べてみます。
0323デフォルトの名無しさん
2006/05/09(火) 22:42:39wstring 使うなら、
find したり substr するなりして拾う事になるかな。
俺はそうやって strtok みたいなのを自分で実装して使ってる。
0324デフォルトの名無しさん
2006/05/09(火) 22:57:01findでデリミタの場所探してsubstrでできそうですね
0325sage
2006/05/09(火) 23:06:47とっかしたパーサかけ
0326デフォルトの名無しさん
2006/05/09(火) 23:10:32スレ違い。
0327デフォルトの名無しさん
2006/05/09(火) 23:15:500328デフォルトの名無しさん
2006/05/09(火) 23:19:270329デフォルトの名無しさん
2006/05/09(火) 23:21:410330デフォルトの名無しさん
2006/05/09(火) 23:24:21VC6という糞コンパイラについて語ろうか。
0331デフォルトの名無しさん
2006/05/09(火) 23:24:24http://pc8.2ch.net/test/read.cgi/tech/1139266461/
0332デフォルトの名無しさん
2006/05/09(火) 23:25:15ちょっとビクビクしてしまう。
0333デフォルトの名無しさん
2006/05/09(火) 23:29:55まだ落ちていなかったのかw
0334デフォルトの名無しさん
2006/05/10(水) 02:25:39struct T { S* S; };
VC++ 2005 Express の cl.exe (VC8?) だと通るこのコードが、
cygwin の gcc 3.4.4 ではエラーになりました。
> 2: error: declaration of `S*T::S'
> 1: error: changes meaning of `S' from `typedef struct S S'
gcc の言ってることはわからんでもないのですが、
規格としてはどっちなんでしょうか?( ill-formed? well-fromed? )
0335デフォルトの名無しさん
2006/05/10(水) 02:34:45"AABBAAACCCCAAADDDEEAAA"
このような文字列を処理するにはistringstreamwを使用すればいいことは解ったのですが
今何文字目を処理しているかを知るには自分で数えるしかないのでしょうか?また
先を読みをしたい場合はどうすればいいのでしょうか?
0336デフォルトの名無しさん
2006/05/10(水) 02:43:13文字列を処理するには string 使えばいいと思うんだけどね。
istream について、
何文字目ってのは tellg() とか gcount() とか使う。
読み出すには read() とか operator >> とか使う。
0337334
2006/05/10(水) 02:47:41struct S;
struct T { S* S; };
としても同様の結果になりました。
ただ、実際の問題は C のソースを C++ に持ってきたときに
エラーになってしまうことがあるということなんで、ちょっと別件っぽいです。
S* S を struct S* S に変えると C でも2つの C++ コンパイラでも
どっちでも通るので、タイプ量をケチるための typedef struct S S を
辞めるべきなのかな?と迷ってます。
0338335
2006/05/10(水) 03:03:12あ〜なるほどなるほど
ファイルから読み込んで、istreamにアタッチして読み込み
判別していくという感じになるのです。解りました。
もう1つ聞きたいのですがC++でこのような文字判別を行う場合
例えば'A'を判別するケースとして
C言語のようにif文無いし関数を用いて判断するべきなのか
それともoperator >>のような新しい演算子を作るべきなのでしょうか
0339デフォルトの名無しさん
2006/05/10(水) 03:08:35S* S; の2つ目の S で問題が発生してるようだ。
何でもかんでも同じ名前にするのはやめとけ。
S* s; で通る。
0340デフォルトの名無しさん
2006/05/10(水) 03:23:16仕様を読んでみたら、typedefで意味を変えるな、とは書いてある気がする。
class Foo {} ;
typedef Foo Foo ; //OK
typedef int Foo ; //ERROR
でもこの問題は、typedefじゃない気がする。
どっちにしろ、名前がかぶるといいことはない。
Foo Foo ; //VCではOK
Foo & f = Foo ;
このコードは、VCでは、
変数 Foo と変数 fに対して、&演算子を適用し、変数 Fooを代入する意味になるらしい。
変数 Fooを参照する、Foo &型の変数 fにはならないらしい。
0341デフォルトの名無しさん
2006/05/10(水) 03:29:47string に読み込んで find() する。
0342デフォルトの名無しさん
2006/05/10(水) 03:33:36これはよく言われる事だから確実かと。
で、S* S; の2つの S は名前空間同じなんじゃないかな。
VC++ で通るのは処理系独自の拡張?
0343335
2006/05/10(水) 03:34:35字句解析を将来するための事前勉強なので
findを連発するのはふさわしくないと思うのですがどうなのでしょうか
0344デフォルトの名無しさん
2006/05/10(水) 03:39:20最初に十分な情報を出さずに質問しておいて、答えが帰ってきた後に
自分の都合を小出しにして文句を垂れる。そんな人は嫌いです。
0345335
2006/05/10(水) 03:42:240346デフォルトの名無しさん
2006/05/10(水) 03:42:40単にチェックしてないだけなんじゃないかという、
大胆な予想を思いついてしまった。
0347デフォルトの名無しさん
2006/05/10(水) 03:49:07S* S; の2つの S は名前空間違うな。
なら、通る方が正しいのか?
まあ、そう何度も同じ名前を使うべきじゃないと思うから、
S* s; の方がいいと思うがな。
0348デフォルトの名無しさん
2006/05/10(水) 03:52:150349334
2006/05/10(水) 03:59:23さらに問題のコードは移植元のソースなんであんまりいじりたくないんですけどね。
まぁ型名をそのまま変数名にしてるのが悪いのだとは思いますんで、今後気をつけることにします。
まだきっちり読みきっていませんが、こんなのを見つけました。
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#407
標準でもまだ確定していない部分に踏み込んでしまったようです。
Cとの互換性なんて初心者を釣るための餌だったのかと思えてきました。
0350デフォルトの名無しさん
2006/05/10(水) 04:54:370351デフォルトの名無しさん
2006/05/10(水) 06:16:560352デフォルトの名無しさん
2006/05/10(水) 08:45:20typedef struct S S;
struct T { ::S* S; };
0353デフォルトの名無しさん
2006/05/10(水) 08:53:280354デフォルトの名無しさん
2006/05/10(水) 09:47:420355デフォルトの名無しさん
2006/05/10(水) 10:11:37template < class T > class CMaterial {
CMaterial* NextMaterial;
public:
T* CreateNext() { return NextMaterial = new T; }
};
class CBlock : public CMaterial<CBlock> {};
/* または */
class CMaterial {
CMaterial* NextMaterial;
protected:
virtual CMaterial* Factory() const { return new CMaterial; }
public:
CMaterial* CreateNext() { return NextMaterial = Factory(); }
};
class CBlock : public CMaterial<CBlock> {
protected:
virtual CMaterial* Factory() const { return new CBlock; }
};
0356デフォルトの名無しさん
2006/05/10(水) 10:13:340357デフォルトの名無しさん
2006/05/10(水) 12:40:34ありがとう(_ _)
でもそれだと生成するオブジェクトがCMaterialならCMaterial、CBlockならCBlockしかNextMaterialに生成できないですよね?
CMaterial型のオブジェクトのNextMaterialにCBlockを生成するようなことはできないでしょうか。
0358デフォルトの名無しさん
2006/05/10(水) 13:16:12{
return new CBlock;
}
0359デフォルトの名無しさん
2006/05/11(木) 00:20:17template < class T > CMaterial* CMaterial::CreateNext() {
return NextMaterial = new T();
}
CMaterial mate;
CBlock blo = mate.CreateNext< CBlock >();
0360デフォルトの名無しさん
2006/05/11(木) 00:20:51だった
0361デフォルトの名無しさん
2006/05/11(木) 00:30:030362デフォルトの名無しさん
2006/05/11(木) 03:27:02そんな方法が!コンパイル通るならそれで行こうと思います。何度も有難う御座います。
>>361
まだ試してないのですがCMaterialの前にCBlockを先行宣言すればとおり・・・ませんか?
0363デフォルトの名無しさん
2006/05/11(木) 04:52:36を
T *ret = newT();
NextMaterial = ret;
return ret;
0364デフォルトの名無しさん
2006/05/11(木) 07:30:20C++でクラス図とコードを相互変換できるソフトとか知らないか?
できればフリーで。クラス図のモデリングが出来ればなおよし
0365デフォルトの名無しさん
2006/05/11(木) 09:38:550366デフォルトの名無しさん
2006/05/11(木) 09:49:25これは、ここらへん?
おまえらUMLのモデリングツール何つかってますか?
http://pc8.2ch.net/test/read.cgi/tech/1046441663/
0367デフォルトの名無しさん
2006/05/11(木) 14:45:44STLのVECTORを用いた構造体の配列に関するプログラムで
typedef struct{
int a1,a2,b1,b2;
}Mat;
vector<Mat> Matrix;
void func(Mat *dat){
dat->b1 = 3; dat->b2 = 5;
}
void main(void){
int i;
for(i=0;i<10;i++){
a1 = 1*i; a2 = 2*i+3;
} //--------------------------★1
for(i=0;i<10;i++){
func(&Matrix[i]);
} //--------------------------★2
return;
}
とまぁこういうプログラムがあったとして(実際はもっと複雑な事やってるのですが)
★1の時にはしっかり値をセットできているのに、
★2の時にはVECTOR配列Matrixのメンバ値全てが-8123456といったヘンな値をとるようになってしまいました。
また、関数の引数をポインタではなく構造体そのものにすると(func(Mat dat)とし、"->"の代わりに"."を使う)途中で例外エラー
hoge.exe の 0x00424dd4 でハンドルされていない例外が発生しました : 0xC0000005: 場所 0x4b55c568 を読み込み中にアクセス違反が発生しました。
が発生します。
このような時にしっかり値を構造体配列にセットするにはどう修正すべきでしょうか。
御教授下さい。
0368デフォルトの名無しさん
2006/05/11(木) 15:02:24試しにVC++7で以下のようなコードを書いてみました。
今のところエラーも出ず、きちんと動いてるように見えるのですが
こんな書き方で問題ないのでしょうか(主に、メモリリークが起きないかどうか)
class Base{};
class Advance : public Base {};
// 戻り値なし・引数ありパターン
void createv( Base* &rp_a ){
rp_a = new Advance;
}
// 戻り値あり・引数なしパターン
Base* createb(){
return ( new Advance );
}
int main()
{
// 基底クラス型ポインタ
Base* p_b1;
Base* p_b2;
// オブジェクトを生成
createv( p_b1 );
p_b2 = createb();
// オブジェクトを破棄
delete p_b1; p_b1 = 0;
delete p_b2; p_b2 = 0;
return 0;
}
0369デフォルトの名無しさん
2006/05/11(木) 15:02:40値をセットするとかそういうところの問題ではありません。
vector は明示的に要素数を指定してあげなくてはなりません。
vectror<Mat> Matrix(10) とするか、main の頭でMatrix.resize(10) としてください。
基本知識が少し不安・・・
0370デフォルトの名無しさん
2006/05/11(木) 15:04:21>実際はもっと複雑な事やってるのですが
最低再現するプログラムを貼りましょう
- Matrixのサイズは0でいいの?
- ★1のa1,a2ってなに?
0371デフォルトの名無しさん
2006/05/11(木) 15:08:54Baseのデストラクタはvirtualにした方がいいよ
Advanceがそのままメンバ変数を持たなければ問題はないだろうけど
あるいは生のポインタじゃなくてboost::shared_ptr使うとか
0372デフォルトの名無しさん
2006/05/11(木) 15:45:43vectorは動的にサイズを変更できると聞いていますが、要素数は指定しなければいけないのでしょうか。
何しろ格納するデータ数が未定なので、STLを使ってみたのです。
先ほど、要素数を vector<Mat> Matrix(0); と指定して
for(i=0;i<10;i++){
Matrix.resize(i+1);
a1 = 1*i; a2 = 2*i+3;
} //--------------------------★1
のように行っても直りませんでした。
>>370
最低再現するプログラム…
OPENCVで画像を読み込んである行列計算をしてその結果を放り込むプログラムです。
計算部分はデバッグを行い、ウォッチで値を確認して動作は確認したため貼らなかっただけです。
再現したい部分は>>367に書いた通りです。
0373デフォルトの名無しさん
2006/05/11(木) 15:49:58for(i=0;i<10;i++){
Matrix[i].a1 = 1*i; Matrix[i].a2 = 2*i+3;
}
の写し間違いだよね?
人に質問できるレベルに達してないよ・・・
0374デフォルトの名無しさん
2006/05/11(木) 15:52:51すみません、その通りです。少々慌ててました。
0375デフォルトの名無しさん
2006/05/11(木) 15:59:28あのさ、>>359でいいなら(呼び出し側がNextMaterialにセットする型が分かってるなら)
CMaterial::SetNext(CMaterial* next) {
NextMaterial = next;
}
mat.SetMaterial(new CBlock);
でいいじゃん…
0376デフォルトの名無しさん
2006/05/11(木) 16:00:32370は373と同じことを言ってるのに、372のようなレスをすることからも
かなり慌ててるのがわかる。
午後4時から研究室の発表とかいうのでなければ
まずはコーヒーでも飲んでくることをお勧めする。
0377デフォルトの名無しさん
2006/05/11(木) 16:05:080378デフォルトの名無しさん
2006/05/11(木) 16:09:29void main(void){
int cnt=0;
char buf[256];
char *tp;
FILE *fp
FolderPath1 = "csvファイル1のパス"
FolderPath2 = "画像フォルダのパス"
fp = fopen(FolderPath1,"r");
while(!feof(fp)){
Matrix.resize(i+1);
fgets(buf,sizeof(buf),fp1);
tp = strtok(buf,",");
temp = atof(tp);
Matrix[i].a1 = temp;
Matrix.resize(i+1);
fgets(buf,sizeof(buf),fp1);
tp = strtok(NULL,",");
temp = atof(tp);
Matrix[i].a2 = temp;
cnt++; //ここでデータ件数をカウントする
}
0379デフォルトの名無しさん
2006/05/11(木) 16:10:25全然気づきませんでした
それが一番スマートで楽ですね。そうします。
皆様ありがとうございました。
0380デフォルトの名無しさん
2006/05/11(木) 16:10:37//画像データを格納
char imgpath[512];//画像のパス
char tempstr[32];//画像ファイル名
for( i=0 ; i<cnt ; i++ ){
//連番ファイル名の画像ファイルパスを作成する
sprintf( tempstr, "%05d.jpg", i+1 );
strcpy( imgpath, FolderPath );
strcat( imgpath, tempstr );
//格納処理
IplImage *image = cvLoadImage( imgpath, -1 );//読み込み
SetTex(image,&Block_Mat[i]); ←この関数の定義は次に書きます(main関数の前に定義してある)
}
0381デフォルトの名無しさん
2006/05/11(木) 16:15:56{
int size = sizeof(dat->tex);//行列サイズ
size = sqrt((double)size);
CvSize r_size = cvSize( size, size );//リサイズ後の座標
IplImage *res_img = cvCreateImage( r_size, IPL_DEPTH_8U, 3 );//テクスチャ画像
cvResize( img, res_img, CV_INTER_CUBIC );
//テクスチャ作成
int w, h;
for (w=0;w<size;w++) {
for (h=0;h<size;h++) {
//青
if(0 <= res_img->imageData[h * res_img->widthStep + w * res_img->nChannels])
dat->tex[w][h][2] = (GLubyte) res_img->imageData[h * res_img->widthStep + w * res_img->nChannels];
else
dat->tex[w][h][2] = (GLubyte) (256 + res_img->imageData[h * res_img->widthStep + w * res_img->nChannels]);
//緑
if(0 <= res_img->imageData[h * res_img->widthStep + w * res_img->nChannels + 1])
dat->tex[w][h][1] = (GLubyte) res_img->imageData[h * res_img->widthStep + w * res_img->nChannels + 1];
else
dat->tex[w][h][1] = (GLubyte) (256 + res_img->imageData[h * res_img->widthStep + w * res_img->nChannels + 1]);
//赤
if(0 <= res_img->imageData[h * res_img->widthStep + w * res_img->nChannels + 2])
dat->tex[w][h][0] = (GLubyte) res_img->imageData[h * res_img->widthStep + w * res_img->nChannels + 2];
else
dat->tex[w][h][0] = (GLubyte) (256 + res_img->imageData[h * res_img->widthStep + w * res_img->nChannels + 2]);
}
}
}
0382デフォルトの名無しさん
2006/05/11(木) 16:18:30貼るのは「最低限の再現するプログラム」にしてくれよ
その最低限を探す過程で大抵は自己解決するんだからさ
0383デフォルトの名無しさん
2006/05/11(木) 16:19:36最低再現するプログラム
= コンパイルが通る完全なコードで、質問する実行時エラーが発生するコード
≠ 作成中のプログラム全体
必要十分な部分を抜き出すか、新たに同一の問題が起こるサンプルを書く。
その過程で、何が間違いか気づくことも多い。
要は、こういうことがしたいのか?
#include <iostream>
#include <vector>
struct matrix_t { int a1, a2, b1, b2; };
std::vector<matrix_t> matrixes;
void func(matrix_t& target) { target.b1 = 3; target.b2 = 5; }
int main() {
for (int i = 0; i < 10; ++i) {
matrix_t tmp;
tmp.a1 = 1*i;
tmp.a2 = 2*i+3;
matrixes.push_back(tmp);
}
for (int i = 0; i < 10; ++i) {
matrix_t& m = matrixes[i];
func(m);
std::cout << "[" << i << "] = (" << m.a1 << " " << m.a2 << " " << m.b1 << " " << m.b2 << ")" << std::endl;
}
return 0;
}
0384デフォルトの名無しさん
2006/05/11(木) 16:19:59//構造体BLOCK_IMAGE
typedef struct{
GLubyte tex[64][64][3];
double a1;
double a2;
double b1;
double b2;
}BLOCK_IMAGE;
0385367
2006/05/11(木) 16:25:34今一度頭を冷やした方がいいかもしれません。
整理して出直します…
0386デフォルトの名無しさん
2006/05/11(木) 16:32:27#include <iostream>
#include <vector>
using namespace std;
typedef struct{
int a1,a2,b1,b2;
}Mat;
void func(Mat *dat){
dat->b1 = 3; dat->b2 = 5;
}
int main(void){
int i;
vector<Mat> Matrix;
Matrix.resize(10);
for(i=0;i<10;i++){
func(&Matrix[i]);
}
for(i=0;i<10;i++){
cout << Matrix[i].b1 << Matrix[i].b2;
}
return 0;
}
0387367
2006/05/11(木) 17:46:19するとバグの起きていた場所が自分の想像していた場所とは違う場所にありました。
int size = sizeof(dat->tex);//行列サイズ
size = sqrt((double)size);
の部分で,sizeの値が構造体メンバのサイズではなく、構造体一個丸々のサイズが出力されていたことが全ての元凶でした。
間違っていると思われていた箇所は問題なく動いておりました…
自分のデバッグ力の無さを反省しながら首吊って死んできます
0388383
2006/05/11(木) 18:44:170389デフォルトの名無しさん
2006/05/11(木) 21:45:120390デフォルトの名無しさん
2006/05/11(木) 21:46:010391デフォルトの名無しさん
2006/05/11(木) 21:52:09呼び出し側が戻り値を受けとらなくても安全かも
まぁその時点でバグなんだけど
0392変なところで終わっているけど…
2006/05/11(木) 21:56:21> typedef struct S S; の2つの S は名前空間が違うから問題ない。
> これはよく言われる事だから確実かと。
間違いです。
「C++設計と進化」の名前ルックアップのところが良くまとまっていると思います。
0393デフォルトの名無しさん
2006/05/11(木) 22:13:57C だとそうだけど C++ だと違うとかいう類いのものなのかな。
0394デフォルトの名無しさん
2006/05/11(木) 22:31:020395デフォルトの名無しさん
2006/05/11(木) 22:33:41プログラムに現れた S がどっちを指すか、規格できっちり決まっていない。
っていうのが >>349 のリンク。
0396デフォルトの名無しさん
2006/05/11(木) 22:34:410397デフォルトの名無しさん
2006/05/11(木) 23:32:28なぜだろう、ここで晒される本は全部持ってる。
0398デフォルトの名無しさん
2006/05/11(木) 23:49:08手垢がついてボロボロになる位にまで読まなきゃ。
0399デフォルトの名無しさん
2006/05/11(木) 23:53:440400デフォルトの名無しさん
2006/05/12(金) 00:25:390401デフォルトの名無しさん
2006/05/12(金) 01:18:04違うぞ。
>>334のケースは決まってる。駄目。
name lookupのthe reevaluation ruleってやつだ。
Mike Millerは、その新しいやり方(this approach)にしても、
やっぱり駄目じゃん(but doesn't eliminate the incompatibility with C)と言っている。
0402デフォルトの名無しさん
2006/05/12(金) 01:23:14間違ってたら「ボケ」って言ってくれるよ。
正解は教えてくんないけどな
0403395
2006/05/12(金) 01:57:39俺は >>334 が well-formed だなんて言ってないよ。
決まってないのは typedef struct S S の後に現れる S が
クラス名なのか typedef 名なのかってところ。
0404335
2006/05/12(金) 02:05:08char *buf = data + 3;
char *result = new char[4];
memcpy(resutl, buf, 4);
こうすると、EHOGがresultにコピーされますがこのようなデータを
<list>や<vector>内に格納してitするのはまずいですよね?
;
0405デフォルトの名無しさん
2006/05/12(金) 02:07:12「このようなデータ」「itする」の意味がわからない。
0406デフォルトの名無しさん
2006/05/12(金) 02:08:24学習しない人も嫌いです。
0407デフォルトの名無しさん
2006/05/12(金) 03:39:420409デフォルトの名無しさん
2006/05/12(金) 09:00:15何を言ってるのかさっぱりわからん。研究室の先輩にでも聞いたらどうだ?
memcpyの第一引数のスペルミスといい、お前本当にサンプルコードで試してるのか?
0410デフォルトの名無しさん
2006/05/12(金) 09:03:52それなら問題はない。ただし、delete[]を忘れないこと。
0411デフォルトの名無しさん
2006/05/12(金) 14:16:07std::list<int> li;
li.push_back(0);
std::list<int>::const_iterator it(li.end());
++it; // ここで例外を投げてほしい
0412デフォルトの名無しさん
2006/05/12(金) 15:00:54li.push_back(0);
std::list<int>::const_iterator it(li.end());
*it; // end()ならここで投げる予感
++it;
0413デフォルトの名無しさん
2006/05/12(金) 15:36:55あんまりうれしい処理じゃないな。
++it;
if (it == li.end()) throw XXX;
とでも書けばいいんじゃないの。
0414デフォルトの名無しさん
2006/05/12(金) 16:02:57昔のプログラミング言語CLUみたいだな。
boost::iterator::iterator_facadeで、
std::list<int>::const_iteratorから生成すれば?
void increment()の中でcheckしてthrowするようにすればいい。
20行くらいで書ける。
0415411
2006/05/12(金) 18:46:03例えば三個先の値を見て分岐する場合
std::list<T> li;
std::list<T>::const_iterator it(li.begin());
...
if (boost::next(it, 3)->getHoge() == ...) { // 3個先の要素のgetHoge()の値で分岐させたい
}
else {
}
こんな感じになるわけですが、boost::nextでイテレータが三回インクリメント
されるときに、[li.begin(), li.end())を超えてしまうと未定義の動作になってしまいます。
かといって、
if (++it != li.end() && ++it != end() && ++it != end() && it->getHoge() == ....) { ... } // �@
とするのはソースが読みにくくなり、また書くのも面倒でしかも使いにくいと思ったわけです。
インクリメントごとに境界チェックするのは>>413さんと同じようにうれしくはないのですが、
�@のコードよりはマシかなと思った次第です。他に方法があればいいのですが・・・
0416デフォルトの名無しさん
2006/05/12(金) 18:48:30ループ内で list<T>::iterator::next(3) なんてするくらいなら、
見た目は悪いけど 3つ先のiteratorも作って一緒に回した方が良いよ。
0417デフォルトの名無しさん
2006/05/12(金) 18:49:07ループじゃないんですね。
0418デフォルトの名無しさん
2006/05/12(金) 19:03:58正常動作中でも比較的頻繁に発生しそうじゃないか。
イテレータを3個進める関数を作るのが一番無難な希ガス。
#その関数の中は>415の(1)みたくなっちゃうけど。
0419デフォルトの名無しさん
2006/05/12(金) 21:20:31参照とポインタの大きな違いは何ですか?
というか、参照>ポインタ なメリットってなんですか?
ポインタのように振舞える?ってことはポインタで十分補えるってことですよね?
使いどころがよくわかりません。
見た目の違い・・・?
0420デフォルトの名無しさん
2006/05/12(金) 21:23:470421デフォルトの名無しさん
2006/05/12(金) 21:41:47歴史的に言えば、演算子オーバーロードをスマートに書くために実装された。
例えばユーザ定義クラスHoge同士を
Hoge a, b, c;
c = a + b;
と書けるようにするには
operator+(Hoge& lhs, Hoge& rhs);
が必要になる。
これをポインタでやろうとすると、
(つまり operator+(Hoge
0422デフォルトの名無しさん
2006/05/12(金) 21:43:08operator+(Hoge *lhs, Hoge *rhs)
と実装してしまうと、
c = &a + &b;
と書かなければいけなくなるけれど、
Cでは &a + &b はポインタの加算であって、演算子オーバーロードと意味が被ってしまう。
0423デフォルトの名無しさん
2006/05/12(金) 21:53:33じゃぁ、オブジェクト指向にするために実装されたわけか・・・。
苦し紛れの friend 制約と似てる気がする。
ま、使っても使わなくてもどっちでもいいってことか。
データベースはちょっと作る機会が当分なさそうですな・・。
0424デフォルトの名無しさん
2006/05/12(金) 21:56:08メリットどうこうよりも、
中身が絶対無いとダメな場合は参照。
中身が無い事(NULL)もありうる場合はポインタ。
この2つで使い分けると良い。
とりあえずconst参照渡しから使い始めてみるのがいいかと。
ポインタを使う場合よりスッキリ書ける。
0425デフォルトの名無しさん
2006/05/12(金) 21:56:56その後色々使い方が出てきたけれどね。
例えば、「参照は必ず初期化されなければならない」という制約があるから、
引数のNULLチェックが必要なくなる。
void foo(int *p)
{
if (p == 0) return; // 必要
*p = 10;
}
void foo(int &p)
{
p = 10; // 特殊な例外を除いて、NULLではない
}
など。
参照をムリに使う必要もないし、ポインタだけで済ませることもできるけど
オーバーロードの例のように、ポインタであることを意識させたくない場合や
参照を使った方が便利になる場合は参照を使えばいいかと。
0426デフォルトの名無しさん
2006/05/12(金) 21:58:17>じゃぁ、オブジェクト指向にするために実装されたわけか・・・。
オブジェクト指向とオペレーターオーバーロードは直接関係ない。
もうちょっとC++勉強すれば参照の良さがわかってくるよ。
0427デフォルトの名無しさん
2006/05/12(金) 22:03:56そういう機能を「C++っぽいから」という理由で無理に使ってワケわからんプログラムを書くよりは
便利さを実感できるようになってから使った方がいい
0428デフォルトの名無しさん
2006/05/12(金) 22:04:49もっと、経験を積んで再度参照の使いどころを検証してみます。
ありがとうございました。
0429デフォルトの名無しさん
2006/05/12(金) 22:11:38マインスイーパの画面を色を読み取って、
それをプログラムの中で行列にしたいのですが、
どういったコマンドを使えば良いのでしょうか?
・画面の読み取り方
・画像から行列データの変換の仕方など
教えてください。
0430デフォルトの名無しさん
2006/05/12(金) 22:17:21そっち行った方が良くね?
0431デフォルトの名無しさん
2006/05/12(金) 22:19:330432デフォルトの名無しさん
2006/05/12(金) 22:27:18IDE : BCC Developer
VBアプリからBCC Developerで作成したDLLを呼び出したいです。
VBのソースに書く装飾名が知りたいんですが、VC++がインストール
されている環境でないと知ることはできないのでしょうか。
0433デフォルトの名無しさん
2006/05/12(金) 22:56:00tlibでインポートライブラリからリストファイルを作成。
自作のDLLならextern "C"しとけば?
0434デフォルトの名無しさん
2006/05/12(金) 23:01:43tdump -ee
0435デフォルトの名無しさん
2006/05/12(金) 23:37:36あるクラスで構造体BBOXを宣言しました。
そして、そのクラスの中で、
BBOX GetBox(void){
return m_bbox;
}
のようにボックスを返すメンバ関数を作りました。
そして、別のクラスで呼び出そうとしたところ、
BBOX box;
と変数を宣言したら定義されていないとされました。
BBOX構造体を宣言したクラスのヘッダファイルはインクルードしてあります。
なにが問題でしょうか?
0436デフォルトの名無しさん
2006/05/12(金) 23:43:06「BBOX構造体を宣言したクラス」のヘッダファイルをインクルードしたんだな?
「BBOX構造体を宣言した」ヘッダファイルをインクルードしたわけじゃないんだな?
0437デフォルトの名無しさん
2006/05/12(金) 23:46:42そうです。
やはり、他のクラスでも使えるようにするには共通のヘッダで宣言するってことですか?
クラス内で宣言した場合はクラス内でしかつかえないのでしょうか?
0438デフォルトの名無しさん
2006/05/12(金) 23:53:300439デフォルトの名無しさん
2006/05/13(土) 00:04:36解決しました。ありがとうございます
0440デフォルトの名無しさん
2006/05/13(土) 01:36:42この質問は昔からあるFAQだな…。
コピーコンストラクタとか、例外とか、深くわかってくると参照じゃないと非常に問題があることがわかってくるよ。
ていうかポインタってやつは言語仕様的にはマジ腐ってる。
でも参照も実は中途半端で、コンテナに突っ込んでおくとオブジェクトの生存期間の管理がややこしくなったりする。
生存期間、つまりdeleteするタイミングを任意にコントロールしたければ、腐っていてもポインタを使うしかない。
そんなわけでポインタも参照もなるべく使わず、C++/CLIのハンドル(^)を使うのが最強ってことで。
0441デフォルトの名無しさん
2006/05/13(土) 01:38:24C++ 使ってるんなら、実行速度を無視して最強を決めるんじゃない。
0442デフォルトの名無しさん
2006/05/13(土) 01:47:09参照は「初期化されずに使用されるポインタ」「(意図せずに)NULLを指すポインタ」
なんてのを排除しつつ見た目を多少整える程度の存在。
別の言い方をするなら、
指し示す先を「領域が確保され初期化されている既存オブジェクト(等)」に
限定したポインタのような存在。
0443デフォルトの名無しさん
2006/05/13(土) 01:49:14昔はC++は遅いってよく批判されたものだけどね。
10年前はマイナーな言語だったのに、今は詳しい人がこんなにいるってのが、
おじさんには驚きですよ。いい時代になったものだね。
誰にも理解されなかったあの頃が懐かしい。
C++/CLIのネイティブコンパイラが現れる時代もそんなに遠くないでしょ。
ネイティブでガベコレってのはD言語でもやってるしね。
0444デフォルトの名無しさん
2006/05/13(土) 01:52:50C++ のポインタが遅いとか、>>440 が書き込まれた時点で C++ のポインタの変わりに
C++/CLI のハンドルが使える(しかもそうすることを推奨)とか、
そういうことを本当に信じてますか?
初学者に適当なこと言って惑わすのって面白いですか?
0445デフォルトの名無しさん
2006/05/13(土) 01:54:20# ここで禿が言う「オブジェクト指向に過度に毒された人」はイテレータのクラスを作れ!とか言うんだろうが
0446デフォルトの名無しさん
2006/05/13(土) 01:54:45ところでガベコレってなんで必要なのかいまいちわからんな
スマートポインタ使ってれば必要なくね?
0447デフォルトの名無しさん
2006/05/13(土) 02:05:18D&Eの最新の邦訳を持っているなら、第-1章のxxviiiを参照するといいかも
0448デフォルトの名無しさん
2006/05/13(土) 02:32:13情報Thanks!
ということはガベコレにもいいことがあるだなぁ
今度見てみます
0449デフォルトの名無しさん
2006/05/13(土) 02:44:27http://www.kmonos.net/alang/d/garbage.html
0450デフォルトの名無しさん
2006/05/13(土) 04:52:430451デフォルトの名無しさん
2006/05/13(土) 05:15:33Dの優位性はあまり感じられない、というのが正直な感想。
DがC++に対して優位である証明として、次の比較があるけれど:
D vs その他の言語
http://www.kmonos.net/alang/d/comparison.html
C++のように、ライブラリでの実装を推奨したとすれば、上記の比較表はかなり違ったものになる。
この比較は、標準ライブラリでの実装を否定し、言語仕様に組み込むことを善とする考えに基づいている。
その理由として:
言語の機能 vs ライブラリによる実装
http://www.kmonos.net/alang/d/builtin.html
を挙げている。漏れには、これらの「利点」が、ライブラリでの実装を否定するほどのものではないように見える。
その他のDの機能も、C++でできることを、Dは少し簡易にできるというだけにしか見えない。
結論:C++で必要十分。
0452デフォルトの名無しさん
2006/05/13(土) 10:04:52シングルスレッドなプログラムならスマートポインタでほとんど大丈夫。
でもコンテナにポインタを入れるときに面倒なことがおきがち。
マルチスレッドで、オブジェクトをスレッド間でやり取りするなら、
ガベコレは非常に欲しい。かなり楽になるよ。
0453デフォルトの名無しさん
2006/05/13(土) 10:44:27Dの関数の入れ子やデリゲート、無名関数は欲しい。
でもtemplateはC++のがいい。これがあるから俺は他の言語へ移る気にならない。
0454デフォルトの名無しさん
2006/05/13(土) 10:47:42>>419
関数に巨大な構造体を引数として渡す時に値渡しではなくconst参照で渡して
パフォーマンスアップ、以外の使い方見たこと無いけどね
0455デフォルトの名無しさん
2006/05/13(土) 11:31:18> 関数に巨大な構造体を引数として渡す時に値渡しではなくconst参照で渡して
それはconstポインタでもできる
ってか,巨大な構造体を値渡しなんてCでもせんだろw
0456デフォルトの名無しさん
2006/05/13(土) 12:29:29VC6 で、
デバッグビルドではさくっと動くのに、
リリースビルドではさくっとこける。
て言う現象が起こったとき、
どこを疑えばいいのかどなたかご教授くださいお願いします orz
0457デフォルトの名無しさん
2006/05/13(土) 12:38:430458335
2006/05/13(土) 12:44:38EffectiveC++とか?
0460デフォルトの名無しさん
2006/05/13(土) 15:15:36参照ならポインタと違ってわざわざ呼ぶ側が&演算子を使う必要が無くなる。
こと構造体(やクラス)では値渡しだと非効率と言うコンピュータの勝手な都合だから、
そんなポインタを使っていることを意識させないほうがよろしい。
0461デフォルトの名無しさん
2006/05/13(土) 15:31:29応答速度やメモリ原価でイライラするのは結局人間の都合
0462デフォルトの名無しさん
2006/05/13(土) 15:36:120463デフォルトの名無しさん
2006/05/13(土) 16:41:22class A
{
void* operator new(size_t t)
{
void* mem;
mem = malloc(t);
return mem;
}
}
class B : public A
{
int* i = new int;
}
0464デフォルトの名無しさん
2006/05/13(土) 16:42:300465デフォルトの名無しさん
2006/05/13(土) 16:46:51頭脳が間抜けか?
それがよばれるのは、class A および class Bをnewしたときだ。
それがしたいなら、グローバルなnewをオーバーロードしなければならない。
void * operator new(size_t size, std::nothrow_t const &) throw()
{
std::cout << "new called : " << size << std::endl ;
return malloc(size) ;
}
0466デフォルトの名無しさん
2006/05/13(土) 16:50:160467デフォルトの名無しさん
2006/05/13(土) 16:54:19あと、std::nothrow_tを引数に取らないnewをオーバーロードするときは、ちゃんと例外を投げておくこと。
とくにグローバルなnewをオーバーロードしたいなら。
厳密にまったく同じ動作をしたいなら、さらにset_new_handlerをトリッキーに使う必要があるけど、
そこまでするかどうか状況によると思う。
0468デフォルトの名無しさん
2006/05/13(土) 18:59:29もう1つ聞きたいのですが、
operator new[]の方をオーバーロードした時の中の処理は
malloc(size);でもいいのでしょうか?
0469デフォルトの名無しさん
2006/05/13(土) 19:03:56すみません自己解決しました。
0470デフォルトの名無しさん
2006/05/13(土) 19:49:330471デフォルトの名無しさん
2006/05/13(土) 20:36:22「細かいテクニック」って何のことだ?
その表現からは、「所詮は枝葉末節であり、仕事に関係しない・知らなくてもいい技法」というニュアンスを感じるが。
Effective C++では、設計・実装の「常識」は説明されているが、「小細工」の類は書かれていない。
0472デフォルトの名無しさん
2006/05/13(土) 21:16:040473デフォルトの名無しさん
2006/05/13(土) 21:27:390474デフォルトの名無しさん
2006/05/13(土) 21:30:090475デフォルトの名無しさん
2006/05/13(土) 21:32:51> erase( size() - 1, 1 )
http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#534
0476デフォルトの名無しさん
2006/05/13(土) 21:32:57っresize
っerase
0477デフォルトの名無しさん
2006/05/14(日) 01:00:21#include <malloc.h>
struct KATA{
int ab;
int cd;
};
int MyFunction(int x, struct KATA *y)
{
y = (struct KATA *)calloc(x, sizeof(struct KATA));
if(y == NULL){
return(1);
}
for(int i = 0;i <= x -1;i++){
y[i].ab = 2;
y[i].cd = 3;
}
return(0);
}
0478デフォルトの名無しさん
2006/05/14(日) 01:00:48{
struct KATA *y;
cout << "MyFunctionの戻り値 = " << MyFunction(2, y) << endl;
for(int i = 0;i <= 1;i++){
cout << "y[" << i << "].ab = " << y[i].ab << endl;
cout << "y[" << i << "].cd = " << y[i].cd << endl << endl;
}
}
関数に作りたい構造体の数と、構造体変数へのポインタを渡して、
関数の中で、領域を確保して値を格納して、格納した値をmainで参照
したいのですができません。これはできないものでしょうか。
0479デフォルトの名無しさん
2006/05/14(日) 01:07:00http://www.kouno.jp/home/c_faq/c4.html#8
あと、
× #include <iostream.h>
× #include <malloc.h>
× void main()
0480デフォルトの名無しさん
2006/05/14(日) 01:23:340481デフォルトの名無しさん
2006/05/14(日) 01:34:410482デフォルトの名無しさん
2006/05/14(日) 01:36:48int MyFunction(int x, struct KATA *&y)
それから、C++ では calloc より new とコンストラクタを使え
なお、479 は C++ スレで C の解説サイトへ誘導を試みてるアフォなんで (・∀・)ニヤニヤ しとけばいい
参照渡しやオブジェクトの初期化方法を差し置いて × と書いている理由も
おそらく根拠が C の仕様で、かなり重度に気が狂ってる模様
0483デフォルトの名無しさん
2006/05/14(日) 01:36:51馬鹿はスルーでお願い
0484デフォルトの名無しさん
2006/05/14(日) 01:40:063.6.1 - Main function の 2 より。
"It shall have a return type of type int, but otherwise its type is implementation-defined."
0485デフォルトの名無しさん
2006/05/14(日) 01:41:31なるほど、お前が英文が読めないことはよくわかった
0486デフォルトの名無しさん
2006/05/14(日) 01:42:34479 の×の理由の根拠が C の仕様って、おまえも狂ってんじゃね?
0487デフォルトの名無しさん
2006/05/14(日) 01:43:400488デフォルトの名無しさん
2006/05/14(日) 01:44:19main についてはそうかもね
0489デフォルトの名無しさん
2006/05/14(日) 01:47:31||| | \____ __
||| | )\ ∨
||| 英 文. <⌒ヽ ヽ
||| \ ( ´ー`) ∧∧
|||_________V( 丿V^ ●Д゚,,)
|,,| |,,| ヽ ( と ,)
ノ ) | |〜
∧ .し`J,,.
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\
なんか、たった1行の英文が読めてない奴多いなー
0490デフォルトの名無しさん
2006/05/14(日) 01:48:450491デフォルトの名無しさん
2006/05/14(日) 01:54:490492デフォルトの名無しさん
2006/05/14(日) 01:55:13that main may have the return type void then
main may indeed have the return type void
and a program with void main() is a conforming program.
↓これをどう取るかで宗教論争
0493デフォルトの名無しさん
2006/05/14(日) 02:00:15http://www.research.att.com/~bs/bs_faq2.html#void-main
0494デフォルトの名無しさん
2006/05/14(日) 02:05:550495デフォルトの名無しさん
2006/05/14(日) 02:08:47必死だな。 ISO で決まってるんだからその指摘も的外れだが。
> See the ISO C++ standard 3.6.1[2] or the ISO C standard 5.1.2.2.1.
0497デフォルトの名無しさん
2006/05/14(日) 02:09:320498デフォルトの名無しさん
2006/05/14(日) 02:11:220499デフォルトの名無しさん
2006/05/14(日) 02:11:33それならまだマシ
奴は ISO の文書が読めてない
0500デフォルトの名無しさん
2006/05/14(日) 02:12:11お前がだろ
0501デフォルトの名無しさん
2006/05/14(日) 02:12:500502デフォルトの名無しさん
2006/05/14(日) 02:13:01意味わからん。 ISO の文書読んだら、戻り値は int 以外無いだろ?
0503デフォルトの名無しさん
2006/05/14(日) 02:14:090504デフォルトの名無しさん
2006/05/14(日) 02:14:53ほらな
484 を君は何と読んだんだい (ニヤニヤ
0505デフォルトの名無しさん
2006/05/14(日) 02:15:300506デフォルトの名無しさん
2006/05/14(日) 02:16:340507デフォルトの名無しさん
2006/05/14(日) 02:16:57それは仕方ないよ、処理系定義という日本語を日本人全員が知ってるわけでもないのと同じ
問題はプログラム技術板で鼻息を荒くしてることであって
0508デフォルトの名無しさん
2006/05/14(日) 02:19:110509デフォルトの名無しさん
2006/05/14(日) 02:19:120510デフォルトの名無しさん
2006/05/14(日) 02:20:10あれを「戻り値の型は実装定義」と読んでるようだな。
実装異存なのは main 関数の型だよ。
0511デフォルトの名無しさん
2006/05/14(日) 02:21:410512デフォルトの名無しさん
2006/05/14(日) 02:22:31おーい、訳が無茶苦茶で通じてねえぞ
0513デフォルトの名無しさん
2006/05/14(日) 02:26:47ここはひとつ、あなたの解釈を書いてみてもらえますか?
0514デフォルトの名無しさん
2006/05/14(日) 02:27:42あっかんべー
どうしても教えて欲しければ有料だよ乞食さん
0515デフォルトの名無しさん
2006/05/14(日) 02:29:25あの文章の前後の文もないとつらくないか?
0516デフォルトの名無しさん
2006/05/14(日) 02:32:44>>510以外のどういう解釈があるのかと。
int main()
{
std::cout << typeid(main).name() << std::endl ;
}
0517デフォルトの名無しさん
2006/05/14(日) 02:36:110518デフォルトの名無しさん
2006/05/14(日) 02:38:45聞き方が収束したようだな
0519デフォルトの名無しさん
2006/05/14(日) 02:43:55> 関数 main は多重定義してはならない。その返却値の型は, int とする。
> これを除いて,関数 main の型は,処理系定義とする。
0520デフォルトの名無しさん
2006/05/14(日) 02:57:200521デフォルトの名無しさん
2006/05/14(日) 03:23:15main の話に逃げ込んだのがどっちかは明らかだがな
0522デフォルトの名無しさん
2006/05/14(日) 03:26:400523デフォルトの名無しさん
2006/05/14(日) 03:27:250524デフォルトの名無しさん
2006/05/14(日) 03:29:21extern "C++" typedef int f1();
extern "C" typedef int f2(int, char *[]);
extern "C" f1* p1;
extern "C++" f2* p2;
extern "C++" int main()
{
p1 = &main;
(*p1)();
}
extern "C" int main(int, char *[])
{
p2 = &main;
(*p2)(0, 0);
}
0525デフォルトの名無しさん
2006/05/14(日) 03:46:37> main には 「型」 があるそうだが、こんなのが型かよまったく
そうだ。 C/C++ の関数には型がある。君はそれを知らなかったんだ。覚えておけばいい。
間違いを偉そうに撒き散らしたのを謝って反省するともっといいね。
0526デフォルトの名無しさん
2006/05/14(日) 03:52:47言いたいことが通じてないようだが
int 以外の返却値を認めてない背景にある問題が
スタートアップモジュールとのスタック構造の一致にあり
それこそが型に他ならないと指摘している
オブジェクトの初期化だの引数の渡し方だのを C の話でやろうとした奴だからこそ
main の結合が処理系定義とか言う話にも何の疑問も感じないんだろうが
そういうレベルの輩と真面目に話しているつもりは最初からないんで
何が間違いかがあんたらとは認識ちがいそうだよ
0527デフォルトの名無しさん
2006/05/14(日) 03:56:53俺に知らなかったと言うあんたは 524 のプログラム片に含まれる ill-formed を全て指摘できるのか
0528デフォルトの名無しさん
2006/05/14(日) 03:57:25方法ありませんか?どなたかよろしくお願いします。
class SuperClass{
ExtendClass* ec;
};
class SubClass:public SuperClass{
};
0529C・アズナブル
2006/05/14(日) 03:59:02苦し紛れの言い訳とは。
0530デフォルトの名無しさん
2006/05/14(日) 03:59:05実体を持たせようとするとサイズが無限になることくらいはわかるか?
やるならポインタで指すだな
0531デフォルトの名無しさん
2006/05/14(日) 03:59:45自分が根に持っているものに疑問を感じたら態度違うさ
0532デフォルトの名無しさん
2006/05/14(日) 04:02:590533デフォルトの名無しさん
2006/05/14(日) 04:03:18関数の型は、戻り値と引数リストで決まる。スタック構造の一致は実装の都合。
引数の渡し方については C の話で問題ない。
>>477 が誤解しているのは明らかに値渡しの理解。これを理解せずに
>>482 のようにコードを変更してうまくいったとしても、同じ間違いを繰り返す。
オブジェクトの初期化だのについては、君以外だれも何も言っていない。
0534デフォルトの名無しさん
2006/05/14(日) 04:03:25527 をスルーで煽りに転じるだけな者に型を語られても説得力がないことに変わりがないように
0535デフォルトの名無しさん
2006/05/14(日) 04:04:000536デフォルトの名無しさん
2006/05/14(日) 04:06:17>関数の型は、戻り値と引数リストで決まる。スタック構造の一致は実装の都合。
違う
結合は明白に関数の型の一部である
gcc などで試した結果のみが根拠な者がそのような誤解をするのは当然
>引数の渡し方については C の話で問題ない。
よってこれも誤り
>オブジェクトの初期化だのについては、君以外だれも何も言っていない。
そのとおり、重要なことを放置したまま話が逸れていったんだよ
0537デフォルトの名無しさん
2006/05/14(日) 04:06:33他には?
0538デフォルトの名無しさん
2006/05/14(日) 04:07:130539デフォルトの名無しさん
2006/05/14(日) 04:08:460540デフォルトの名無しさん
2006/05/14(日) 04:09:02他には?
0541デフォルトの名無しさん
2006/05/14(日) 04:11:17レスがワンパターンになってるぞ。もう終わりか?
0543デフォルトの名無しさん
2006/05/14(日) 04:13:140544デフォルトの名無しさん
2006/05/14(日) 04:17:13//
#include <iostream>
using namespace std;
int main()
{
char c[10] = "あいう";
char *s = "abcd";
char ch[10] = "わをん";
cout << " s:" << s << endl;
cout << " c:" << c << endl;
cout << "ch:" << ch << "\n" << endl;
s = (char*)c;
cout << "c => s:" << s << "\n" << endl;
cout << "現在のch:" <<ch << endl;
cout << "現在の s:" << s << "\n" << endl;
// @
for (int i=0; i<10; i++)
s[i] = ch[i];
cout << "ch => s:" << ch << "\n" << endl;
return 0;
}
文字列を各配列に納めるテストをしていたのだけれど
目印@でのキャスト処理を for構文つかわずに
s = (char*)c; のように簡略化できる方法ありますか?
0545デフォルトの名無しさん
2006/05/14(日) 04:18:48ill-formed に対する処理系独自の解釈に起因する連鎖で出るエラーはいいよ
直接的に ill-formed な箇所がわからない者には説得力がないと言っているだけなんで
0546デフォルトの名無しさん
2006/05/14(日) 04:21:27明白ってのは根拠があって言ってるのか?
規格を読む限りでは、戻り値型と引数リストの型が関数型の構成要素だよ。
非staticメンバ関数について型修辞子が追加される。
デフォルト引数や、例外仕様は含まれないことも明記してある。
リンケージについての記述は見当たらないが、 static つけたら型が変わられちゃ
困るんで、そんなものは関数型の一部ではない。
どうも「関数の型」が規格上に定義されたものだという前提が無いようだな。
> よってこれも誤り
「よって」が前の文と繋がってないよ。
> >オブジェクトの初期化だのについては、君以外だれも何も言っていない。
> そのとおり、重要なことを放置したまま話が逸れていったんだよ
どうでもいいから誰もタッチしてないんだよ。
0547デフォルトの名無しさん
2006/05/14(日) 04:22:22std::string 使え。
0548デフォルトの名無しさん
2006/05/14(日) 04:23:24static は型の一部ではない
extern "C" は関数の型の一部である
>どうでもいいから誰もタッチしてないんだよ。
どうでもよくないが、ここであんたに考えを改めてもらう必要もないんで放っておく
0549デフォルトの名無しさん
2006/05/14(日) 04:23:380550デフォルトの名無しさん
2006/05/14(日) 04:25:29ご苦労様
不合格ね
0551デフォルトの名無しさん
2006/05/14(日) 04:27:30すみません。コード間違えました。やりたいのは
class SuperClass{
SubClass* sc;
};
class SubClass:public SuperClass{
};
です。
>実体を持たせようとするとサイズが無限になることくらいはわかるか?
分かりません。でもポインタで指しているつもりです。
コンパイルを通したいのですが、どう宣言したら良いものか。
0552デフォルトの名無しさん
2006/05/14(日) 04:31:57public:
virtual ~BaseClass();
};
class SuperClass{
BaseClass* pSubClass;
};
class SubClass:public SuperClass{
};
とやっておいて、dynamic_cast とか
class SubClass;
class SuperClass {
SubClass* sc;
};
class SubClass : public SuperClass {
};
のように不完全型を使うとか・・・
0553デフォルトの名無しさん
2006/05/14(日) 04:52:07> extern "C" は関数の型の一部である
これは正しいようだ。 7.5.1 に書いてある。
ということは、 >>524 での p1, p2 への代入が関数型の不一致ってことか?
p1, p2 の宣言に付いてる extern "" は関数型には影響しないんじゃね?
↓こうなってればダメってのはわかるんだけどね。
extern "C" int (*p1)();
extern "C++" int (*p2)(int, char*[]);
0554デフォルトの名無しさん
2006/05/14(日) 04:52:36ありがとうございました。下の方法でうまくいきました。
ダイナミックキャストは勉強しておきます。
0555デフォルトの名無しさん
2006/05/14(日) 04:57:230556デフォルトの名無しさん
2006/05/14(日) 04:59:050557デフォルトの名無しさん
2006/05/14(日) 05:01:360558デフォルトの名無しさん
2006/05/14(日) 05:10:25うん、そこは影響しないように頑張るならこうだという意図で書いた
スタートアップがどうやって両方に対応するのかに対する疑問を提起するために
0559デフォルトの名無しさん
2006/05/14(日) 05:11:50ん?スタートアップは両方に対応する必要はないでしょ?
0560デフォルトの名無しさん
2006/05/14(日) 05:12:380561デフォルトの名無しさん
2006/05/14(日) 05:12:55すくなくとも int main() と int main(int, char *[]) に対応できなければならない
0562デフォルトの名無しさん
2006/05/14(日) 05:14:15結合指定が合ってるのを確認したうえで 「以上」 と言ってたならごめんよ
話についてこれてないのと見分けがついてなかった
0563544
2006/05/14(日) 05:15:48とすることで解決出来たのですが
<string> を include しなくても使えたので
この string の扱いは basic_string で良いのでしょうか?
0564デフォルトの名無しさん
2006/05/14(日) 05:16:530565デフォルトの名無しさん
2006/05/14(日) 05:21:17それ、両方 extern "C++" だから関係ないでしょ。
0566デフォルトの名無しさん
2006/05/14(日) 05:27:000567デフォルトの名無しさん
2006/05/14(日) 05:27:38どちらか一方のみが extern "C" という実装もありうるし
main に結合指定を記述することも許されている
これは返却値のみについて int であることを強弁することが空疎であると主張する根拠の1つである
0568デフォルトの名無しさん
2006/05/14(日) 05:27:44extern "C" と同様に使えるが、デフォルトと同じなのであまり使わない。
0569デフォルトの名無しさん
2006/05/14(日) 05:30:38それを許可する処理系は、その定義を正しく処理する。
できなければ処理系の欠陥。処理系定義ってのはそういうことだ。
main の戻り値が int なのは規格で決まってる。
C++ で void main() が無効なのは変わらない。
0570デフォルトの名無しさん
2006/05/14(日) 05:48:28正しく処理するように画策するのは曲がった話を通すためだろうがよ
1つの関数が extern "C" と extern "C++" の両方で同じ結合を持つなんて多重定義ができずかつ複数の型で定義できる関数だけだろ?
そのために main の型が処理系定義なのは結構だが、だったら「返却値を除く」必要性こそ処理系固有の事情によるはずで
引数の渡し方や動的記憶の使い方よりも優先するほどの重要度を持つ話ではないし
それしか指摘できない者がおこがましくも回答者面してたわけだ
0571デフォルトの名無しさん
2006/05/14(日) 05:51:130572デフォルトの名無しさん
2006/05/14(日) 05:51:25規格に文句言いたいなら勝手にすればいいが、ここで同意を求めるのはやめてくれ。
0573デフォルトの名無しさん
2006/05/14(日) 05:55:24http://gcc.gnu.org/bugzilla/show_bug.cgi?id=8680
0574デフォルトの名無しさん
2006/05/14(日) 05:57:300575デフォルトの名無しさん
2006/05/14(日) 06:05:41英語の一文を誤訳してたやつがおこがましくも回答者面しているわけだが。
0576デフォルトの名無しさん
2006/05/14(日) 06:15:10あんたの話そらす腕は認めるよ、大したものだ
だがあいにくと文句の主たる矛先は規格ではなく 471 でな
残念だったな
0577デフォルトの名無しさん
2006/05/14(日) 06:15:41s/471/479/
0578デフォルトの名無しさん
2006/05/14(日) 06:19:47規格に従うつもりがあるなら、 void main() がダメなのぐらい素直に認めとけよ。
俺は >479 はまっとうな指摘だと思うけどね。
あんたがさんざん噛み付いてる main の話も、おまけでつけてるだけだし。
0579デフォルトの名無しさん
2006/05/14(日) 06:19:50スレ立てして、最初に自分がどういう認識なのか全て書け。
気が向いた奴が相手してくれるだろ。
0580デフォルトの名無しさん
2006/05/14(日) 06:24:24盲従はしないってだけさ
従う/従わないの2値的な考えしてる者には通じなさそうだが
ところで main に噛みついてるのは俺じゃないぜ
くだらねえつってるだけだ
0581デフォルトの名無しさん
2006/05/14(日) 06:26:17C++ についてロクな回答できない奴よりまし
なんだい、あのコードに対してヘッダに main て・・・
0582デフォルトの名無しさん
2006/05/14(日) 06:32:300583デフォルトの名無しさん
2006/05/14(日) 06:35:29参照好きの漏れが修正するとこうなる。こういう関数にはもっといいパターンがあるけど、そこは気にしない方向で。
#include <iostream>
struct KATA { int ab, cd; };
int MyFunction(int x, KATA*& y) {
y = new KATA[x];
if (!y) return 1;
for (int i = 0; i < x; ++i) {
y[i].ab = 2;
y[i].cd = 3;
}
return 0;
}
int main() {
using namespace std;
KATA* y = 0;
cout << "MyFunctionの戻り値 = " << MyFunction(2, y) << endl;
for (int i = 0; i < 2; ++i) {
cout << "y[" << i << "].ab = " << y[i].ab << endl;
cout << "y[" << i << "].cd = " << y[i].cd << endl << endl;
}
delete[] y;
return 0;
}
0584デフォルトの名無しさん
2006/05/14(日) 06:42:24new の戻り値をヌルチェックしても意味無いよ。
0585デフォルトの名無しさん
2006/05/14(日) 06:42:59> KATA* y = 0;
としていながら参照で渡しているのは酷かったな。MyFunction()のあたりに次のコメントを追記:
// 引数 KATA* への参照は、null ポインタを指している可能性がある。右辺値としてアクセスする前に、必ず代入を行うこと
0586デフォルトの名無しさん
2006/05/14(日) 06:45:56そんな些細なこと気にするぐらいだったら、「もっといいパターン」に書きかえるよな。
0587デフォルトの名無しさん
2006/05/14(日) 06:48:08あー寝起きはだめすぎるなー。つっこみどころ多すぎる...orz
もう一眠りしてくる
0588デフォルトの名無しさん
2006/05/14(日) 06:48:440589デフォルトの名無しさん
2006/05/14(日) 08:41:42・CはC99から適合、
・C++はC++03でも駄目
ってことを知らない人がスレを混乱させてるな。
0590デフォルトの名無しさん
2006/05/14(日) 09:28:210591デフォルトの名無しさん
2006/05/14(日) 11:32:18template<class T>
class SuperClass{ voif foo() { static_cast<T>(this)->submethod() };
class SubClass : public SuperClass<SubClass>{};
だな。俺は
0592デフォルトの名無しさん
2006/05/14(日) 11:50:14age厨と100レス近く論争するのを規格を遵守するって言うんですか
0593デフォルトの名無しさん
2006/05/14(日) 12:02:150594デフォルトの名無しさん
2006/05/14(日) 12:05:300595デフォルトの名無しさん
2006/05/14(日) 12:37:21C99でも駄目だったと思うが。
0596デフォルトの名無しさん
2006/05/14(日) 15:46:11それともCOMでしか使えない関数なんですか?
0597デフォルトの名無しさん
2006/05/14(日) 15:49:06IClassFactory::CreateInstanceはCOMのメソッド
0598デフォルトの名無しさん
2006/05/14(日) 15:49:09少なくともC++言語に関する話題ではないな
0599デフォルトの名無しさん
2006/05/14(日) 20:14:250600デフォルトの名無しさん
2006/05/14(日) 21:10:380601デフォルトの名無しさん
2006/05/14(日) 21:29:34半径を入力すると円の面積と円周を出すプログラムを作りたいんですが
\include<iostream>
using namespace std;
double main()
{const double pi = 3.14;
double hankei;
cout << "円の面積と演習を求めます。" <<'\n';
cout <<"半径を入力してください:
cin >> hankei;
cout << "円の面積は" << hankei*hankei*pi << "です。" <<'\n';
cout << "演習は << 2*pi*hankei << "です。" ; <<'\n';
return 0;
}
このようにしたら
エスケープシーケンスの使い方が正しくありません
';' が '<' の前にありません。
型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
'cout' : 定義されていない識別子です。
定数が 2 行目に続いています。
';' が、識別子 'cin' の前に必要です。
'0x3000': この文字を識別子で使用することはできません
というエラーが出ました。「:」が「<」の前にないだのと良く分からないのですが何が問題なのでしょうか?
0602デフォルトの名無しさん
2006/05/14(日) 21:35:36コピペミスなのかもしれない
\include
double main
"半径を入力してください:
0603デフォルトの名無しさん
2006/05/14(日) 21:36:22double main()
cout <<"半径を入力してください:
cout << "演習は << 2*pi*hankei << "です。" ; <<'\n';
ここまでバカなんだったらムリしてプログラムなんてするなよ
0604デフォルトの名無しさん
2006/05/14(日) 21:56:45#include<iostream>
using namespace std;
int main()
{
const double pi = 3.14;
double hankei;
cout << "円の面積と演習を求めます。\n";
cout << "半径を入力してください:\n";
cin >> hankei;
cout << "円の面積は" << hankei*hankei*pi << "です。\n";
cout << "演習は" << 2*pi*hankei << "です。\n";
return 0;
}
これでも駄目なんですが何がいけないんでしょう?
0605デフォルトの名無しさん
2006/05/14(日) 22:08:48エラーが変わってないなら変わってないと、
変わったなら新たなエラーの内容くらい書けよ・・・回答者に言語以外の頭を回させるな。
0606デフォルトの名無しさん
2006/05/14(日) 22:10:21> cout << "半径を入力してください:\n";
> cout << "円の面積は" << hankei*hankei*pi << "です。\n";
全角スペースになってるぞ
0607デフォルトの名無しさん
2006/05/14(日) 22:10:42そのソースをプリントアウトしたものを見ながら
新しい main.cpp ファイルに打ち直してみましょう。
それでコンパイルできたら、なぜコンパイルできるようになったのか考えながら首吊りませう
0608デフォルトの名無しさん
2006/05/14(日) 22:13:03(´ω`)何だかナツカシす
0609デフォルトの名無しさん
2006/05/14(日) 22:16:090610デフォルトの名無しさん
2006/05/14(日) 22:16:53初心者スレに行けよ。
0611デフォルトの名無しさん
2006/05/14(日) 22:18:44どうでもいいが
初心者で検索すると将棋スレになってワロタwww
0612デフォルトの名無しさん
2006/05/14(日) 22:35:26???
0613デフォルトの名無しさん
2006/05/14(日) 23:44:00そうすると型を無視したポインタの配列確保するときはどうすればいいのでしょうか?
Intやcharや他の構造体がいっぱい入ってくる場合どのように書けばいいのでしょうか
0614デフォルトの名無しさん
2006/05/14(日) 23:48:57別に禁止じゃないが。推奨すべき理由もないが、それが最良と判断したのなら躊躇わずに使えばいい。
0615デフォルトの名無しさん
2006/05/14(日) 23:51:55べつに禁止されてないので型を無視したいのなら使えばいいっしょ
型を無視せずにいろんな型を突っ込むなら
RTTIでdynamic_cast使ったりとか仮想関数とか適当に
0616デフォルトの名無しさん
2006/05/15(月) 00:07:33処理の中では malloc でメモリ確保しているのですが
どうやれば new と同じようにコンストラクタを呼び出せるのでしょうか?
0617デフォルトの名無しさん
2006/05/15(月) 00:07:41プログラマにリスキーな手段を採る裁量を認めているのがC++の思想。
0618デフォルトの名無しさん
2006/05/15(月) 00:08:16placement newすればいいんでね
0619デフォルトの名無しさん
2006/05/15(月) 00:09:52確か勝手によばれるだろ?
明示的に呼び出したい場合は
char hoge[sizeof(hoge_type)];
new (hoge) hoge_type();
こんな感じで呼び出せる。
0620デフォルトの名無しさん
2006/05/15(月) 00:11:48オーバーロードできるのはoperator newであって、newはそもそもオーバーロードできない。
0621デフォルトの名無しさん
2006/05/15(月) 00:13:37Cのインターフェイスがvoid **になっていて果てさて
どうしたものかと悩んでしまいました。教えていただきありがとうございました。
0622デフォルトの名無しさん
2006/05/15(月) 00:16:47D&Eを嫁…といいたいとこだが、
Hoge *h = new Hoge();
というコードが実行される際の動作は、
1.sizeof(Hoge)のメモリがoperator newによって確保される
2.Hogeのコンストラクタが実行される
operator newはあくまでメモリを確保する役割しか持ってない。
あとは>>619-620
0623デフォルトの名無しさん
2006/05/15(月) 00:18:11>>619
>>620
ありがとうございます。
0624デフォルトの名無しさん
2006/05/15(月) 10:53:16static int a=0;
a++;
if(a==5)return;
foo();
}
みたいなコードを書いたとき、aは再帰で呼び出すたびに0になるの?それとも一番呼び出し元の最初だけ?
0625デフォルトの名無しさん
2006/05/15(月) 10:56:280626デフォルトの名無しさん
2006/05/15(月) 10:59:06やっと謎がとけた
0627デフォルトの名無しさん
2006/05/15(月) 15:54:28class B
{
public:
virtual void F();
};
class D :public B
{
virtual void F();//これではなく、
void F( int );//このようなもの。
}
0628デフォルトの名無しさん
2006/05/15(月) 16:08:42いえ
0629デフォルトの名無しさん
2006/05/15(月) 16:54:270630627
2006/05/15(月) 18:43:13そこに
「オーバーロードを悪いコードとして目立たせている理由に、1つは仮想関数をオーバーロードすることが望ましくないこと」
と書いてあったので気になったのですが・・
0631デフォルトの名無しさん
2006/05/15(月) 18:46:23それだけの話。
0632デフォルトの名無しさん
2006/05/15(月) 18:47:18禁止ではないが、望ましくはない。
だ。
0633デフォルトの名無しさん
2006/05/15(月) 19:00:050634デフォルトの名無しさん
2006/05/15(月) 19:38:560635デフォルトの名無しさん
2006/05/15(月) 19:41:090636デフォルトの名無しさん
2006/05/15(月) 20:04:22他人と共有するときにそんなコード書いたら、「ああ、この程度か」って思われると思うよ。
少なくともEffectiveC++は読んでないなと。
0637デフォルトの名無しさん
2006/05/15(月) 20:08:120638デフォルトの名無しさん
2006/05/15(月) 20:10:12こんな安易な発想で実際にクラス書かないですけど、
>>627のを
class D :public B
{
virtual void F();
virtual void F( int );
};
なら別に紛らわしくない?
0639デフォルトの名無しさん
2006/05/15(月) 20:12:57なぜ仮想関数をオーバーロードしてはいけないのか
なぜオーバーロードさせたくない関数にvirtualを付けるのか
解説または、そのような記述のあるサイトがありましたら
教えて頂けるとうれしいです。
0640デフォルトの名無しさん
2006/05/15(月) 20:13:31B にもあるなら紛らわしくない。
0641デフォルトの名無しさん
2006/05/15(月) 20:28:48もう片方は D からの(仮想)関数となると、
紛らわしい。
まあそんだけ。
0642デフォルトの名無しさん
2006/05/15(月) 20:40:15第38項「継承したデフォルトパラメータを再定義してはならない」というのならあるね。
0643デフォルトの名無しさん
2006/05/15(月) 20:48:120644デフォルトの名無しさん
2006/05/15(月) 22:16:50Effective3版の33項(2版だと9項?)には、
「基底クラスのオーバーロードした関数が隠蔽される」って話があるけど、
するなとは書いてないから違うかな?
個人的にはとてもわかりにくい仕様だと思った。
0645デフォルトの名無しさん
2006/05/16(火) 00:55:51C++ STANDARDにこんなのあった。
10.3.3
[Note: a virtual member function does not have to be visible to be overridden, for example,
struct B {
virtual void f();
};
struct D : B {
void f(int);
};
struct D2 : D {
void f();
};
the function f(int) in class D hides the virtual function f() in its base class B; D::f(int)
is not a virtual function. However, f() declared in class D2 has the same name and the
same parameter list as B::f(), and therefore is a virtual function that overrides the
function B::f() even though B::f() is not visible in class D2. ]
可視性の観点からややこしいことになるみたいね。
0646デフォルトの名無しさん
2006/05/16(火) 02:23:50オーバーロードとオーバーライドがごっちゃになってるだろ。
0647デフォルトの名無しさん
2006/05/16(火) 02:27:19そりゃあんたやw
0648デフォルトの名無しさん
2006/05/16(火) 02:28:290649デフォルトの名無しさん
2006/05/16(火) 02:39:58> なぜオーバーロードさせたくない関数にvirtualを付けるのか
0650デフォルトの名無しさん
2006/05/16(火) 02:40:08仮想関数は関係ない。これは継承を挟んだオーバライドの問題。
親クラス(またそれ以上の先祖クラス)のメンバ関数と偶然名前が衝突した時、
子クラスのメンバ関数を呼んだつもりが、親クラスのメンバ関数を呼んでいた
なんてことになるを避ける為、継承を挟んだオーバーロードは親クラスのメンバを
隠蔽する決まりになってる。親クラスのメンバを隠蔽させたくない時は using を
使って隠蔽させたくない親クラスのメンバを指定する。
0651デフォルトの名無しさん
2006/05/16(火) 06:21:17一行目の「オーバーライド」は「オーバーロード」の間違い?
0653デフォルトの名無しさん
2006/05/16(火) 08:57:36普通に>>627みたいなこと俺やってるけど・・・
ていうかもう9時だorz
0654デフォルトの名無しさん
2006/05/17(水) 18:05:27どんなのがありますか?
特にFirefoxとApacheはC++ですか?
0655デフォルトの名無しさん
2006/05/17(水) 18:52:220656デフォルトの名無しさん
2006/05/17(水) 20:34:02FirefoxはC++
0657デフォルトの名無しさん
2006/05/17(水) 23:43:47C++ Applications
http://www.research.att.com/~bs/applications.html
0659デフォルトの名無しさん
2006/05/18(木) 00:58:480660デフォルトの名無しさん
2006/05/18(木) 01:24:24悪かったな、市ね
0661デフォルトの名無しさん
2006/05/18(木) 01:44:100662デフォルトの名無しさん
2006/05/18(木) 02:07:27class Foo
{
public :
//テンプレートなメンバ関数
//これはヘッダで定義
template <typename T>
void f() { std::cout << typeid(T).name() << std::endl ; }
//普通のメンバ関数
//これはヘッダ以外の別の場所(Foo.cpp)で定義
void g() ;
} ;
//Foo.cpp
void Foo::g() { std::cout << "Foo::g()" << std::endl ; }
//main.cpp
int main()
{
Foo foo ;
foo.g() ;
foo.f(0) ;
foo.f(0.1) ;
}
インスタンス化に必要な部分だけは、main.cppから見えているので、ちゃんとコンパイル&リンクができるのですが、
やはりこういう書き方はやめたほうがいいのでしょうか。
export ほすぃ……
0663デフォルトの名無しさん
2006/05/18(木) 02:16:51inline にしたいのでなければ、とりあえずクラス外に移したほうがいいだろうな。
いつか export がサポートされるのを夢見て、 template の定義を別ファイルにわけて
// Foo.hpp の最後に
#ifndef COMPILER_SUPPOTS_EXPORT_KEYWORD
#define export /* removed */
#include "Foo_template.cpp"
#undef export
#endif
// Foo.cpp に
#if COMPILER_SUPPOTS_EXPORT_KEYWORD
#include "Foo_template.cpp"
#endif
とかいう話は聞いたことがある。メンドクサイ上にメリットの期待値が極小。
0664デフォルトの名無しさん
2006/05/18(木) 04:53:40namespace MyClass
{
class Exception{ Exception( Exception &E ); };
}
というクラスを作っていたんですが、Exception( Exception &E )をException( const &E )に変えたところ、
throw Exception( "〜〜〜" );
と例外を出してるクラスほとんど(全部ではない)から
Exception( class Exception &E )は未解決〜とエラーが出てしまいました。
( Exception( Exception &E )と宣言してたときにはエラーは出てない )
で、そのエラーが出たクラス内に
using namespace MyClass;
と書き加えたところでなくなりました。
namespace MyClass
{
//ここにusing namespace MyClass;と付け加えたら出なくなった。←MyClass内なのに。
void Func(){ throw Exception( "〜〜〜" ); }
}
で、さらにその後、追加したusing namespace MyClass;を削除してリビルドすると、
未解決エラーが出なくなりました。
今は正常にリンクできるのですが、後味が悪いので質問させていただきました
これはなぜなんでしょうか?
0665デフォルトの名無しさん
2006/05/18(木) 05:49:03例えばそのヘッダをA.cpp, B.cpp, C.cppから参照していたとして、
constに書き換えた時、何らかの理由でA.cppのみ再コンパイルされてしまったとか。
そうすると、Aのオブジェクトはconstを引数に取るコンストラクタを参照しようとするけれど、
B,Cのオブジェクトファイルは今まで通りconstのないコンストラクタを参照しようとして、未解決エラー。
で、エラーが出たクラスに変更を加えたことで、B,Cのオブジェクトファイルも更新され、正常にリンクされるようになる。
(加えた修正には意味がなく、修正を加えたことで更新されたのが解決の原因)
VC++のようなIDEを使っていればまず起きえない問題だけど、
もしMakefileでコンパイルを制御しているなら、各オブジェクトがヘッダの更新に対応しているかどうか
依存関係の記述を見直してみるといいかと。
0667デフォルトの名無しさん
2006/05/18(木) 16:29:330668デフォルトの名無しさん
2006/05/18(木) 16:59:470669デフォルトの名無しさん
2006/05/18(木) 17:35:34FAQの最初にあるのも笑えるが。
ttp://www.research.att.com/~bs/bs_faq.html#pronounce
自分の脳内では、ビャーネ・ストロォストルップなんだが
0671デフォルトの名無しさん
2006/05/18(木) 19:34:34細野ー!
0672デフォルトの名無しさん
2006/05/18(木) 21:02:10ハゲ
0673デフォルトの名無しさん
2006/05/18(木) 23:56:430674デフォルトの名無しさん
2006/05/19(金) 00:09:48影響されて俺もそういってるけど、検索しても全然でてこねえな
0675デフォルトの名無しさん
2006/05/19(金) 00:20:04ttp://ja.wikipedia.org/wiki/%E3%83%93%E3%83%A3%E3%83%BC%E3%83%8D%E3%83%BB%E3%82%B9%E3%83%88%E3%83%AD%E3%83%B4%E3%82%B9%E3%83%88%E3%83%AB%E3%83%83%E3%83%97
0676デフォルトの名無しさん
2006/05/19(金) 01:11:510677デフォルトの名無しさん
2006/05/19(金) 01:13:010678デフォルトの名無しさん
2006/05/19(金) 01:38:02「やあ、禿」なんて言うわけにいかないだろ
0679デフォルトの名無しさん
2006/05/19(金) 01:44:420680デフォルトの名無しさん
2006/05/19(金) 15:57:48「ビャールネ・ストロヴストルップ氏が〜〜って書いてた。」
って言うよりは、
「ハゲが〜って書いてた。」
って言うほうが早いなと。
0681デフォルトの名無しさん
2006/05/19(金) 16:01:38あんまりそんな事言ってると自分が偉くなって氏に直接会う機会とかで「ハゲ」って言いかねないからなぁ。
習慣って怖いし、「ハゲ」とか言ってると上司ににらまれたりもするし(w
0682デフォルトの名無しさん
2006/05/19(金) 16:28:23前者 → ないないw
後者 → …もの凄い気まずかったが、何か?
0683デフォルトの名無しさん
2006/05/19(金) 19:13:57できれば、必要な知識の解説&リファレンスが3:7ぐらいの割合で入っているものが欲しいです
0684デフォルトの名無しさん
2006/05/19(金) 19:19:28ttp://www005.upp.so-net.ne.jp/episteme/html/stlprog/index.html
0685デフォルトの名無しさん
2006/05/19(金) 19:45:36解説:EffectiveSTL
リファレンス:>684のサイト
詳細情報:適当な実装
0686デフォルトの名無しさん
2006/05/19(金) 19:49:270687デフォルトの名無しさん
2006/05/19(金) 22:35:02Apacheのstdcxxリファレンスもお勧め。
ttp://incubator.apache.org/stdcxx/
0688デフォルトの名無しさん
2006/05/20(土) 19:13:38#include <iostream>
int main()
{
std::cout << "wake waka ran";
}
をコンパイルするとエラーがでます。
1.インクルードファイルがオープンできないといわれるから,
<iostream.h>にすると
2.戻り値が指定されていないといわれる。
だから return 0;をつける。
けれど
3.std識別子がクラス名ではないときます・・
なにが原因なのでしょうか
0689デフォルトの名無しさん
2006/05/20(土) 19:15:030690デフォルトの名無しさん
2006/05/20(土) 19:18:22<iostream>と<iostream.h>の違いはstd名前空間に入っているかいないか
(iostream.hはとっくにdeprecatedだけれど)
だからiostream.hにするならstd::をつける必要はない
というかVC4.0を使うぐらいならVC2005EEにした方が数百倍マシな気がするが…
0691デフォルトの名無しさん
2006/05/20(土) 19:28:50コンパイラですが,VC2005EEは使ったけれど使いにくかった(使い慣れていない)ので,アンインストしましたが,
そうならもう一度入れてVC2005EEを使用することにします。
ありがとうございました。
0692デフォルトの名無しさん
2006/05/20(土) 19:54:06基本的なことだが、C++ の規格票に書いてある
制定年度
↓
ISO/IEC14882:xxxx
と、VC4 の出荷時期を比べてみるといい
あの当時の事実上の標準はこれ
http://www.research.att.com/~bs/arm.html
0693デフォルトの名無しさん
2006/05/20(土) 19:56:090694デフォルトの名無しさん
2006/05/20(土) 19:58:42抵抗感があるよね・・・
一生VC2003と付き合っていくことになりそうだ
0695デフォルトの名無しさん
2006/05/20(土) 20:01:02俺もVC2003から乗り換えた当初は「なんだこの分かりづらくてケバい色遣いは」と思ったが
しばらく使ってると慣れて、むしろ見やすく感じるようになった。
住めば都とはこのことか。
0696デフォルトの名無しさん
2006/05/20(土) 20:16:010697デフォルトの名無しさん
2006/05/20(土) 21:35:06一生VC6と付き合っていくことに……なるのは嫌だな。なんで退化するのよ。
0698デフォルトの名無しさん
2006/05/20(土) 22:19:49まぁいずれにせよスレ違いということで
0699デフォルトの名無しさん
2006/05/20(土) 22:31:250700デフォルトの名無しさん
2006/05/20(土) 22:42:55右クリック→Go to definition じゃダメなの?
右クリックはコンテキストメニューキー、Go to definitionはGキーで代用できるから、
実質2回キーを押すだけで飛べるんだが、それじゃ不満なのかね。
別にマクロ組んでショートカット割り当てても同じだと思うが…
というかスレ違いだな、うん。
0701デフォルトの名無しさん
2006/05/20(土) 22:47:47レスしてーw
違う、違うんだ!でもスレ違いだw
0702デフォルトの名無しさん
2006/05/20(土) 22:55:09スレ違いでごめん。
0703デフォルトの名無しさん
2006/05/20(土) 23:15:54気になるじゃまいか
0704デフォルトの名無しさん
2006/05/21(日) 00:44:20void f(int) {}
void f(float) {}
template<class T> void g(T) {}
g(f); // 曖昧
これを g(なんとか); の呼び出しで解決する方法はありますか?
0705デフォルトの名無しさん
2006/05/21(日) 00:45:12g(f<int>);とg(f<float>);でできたような。違ったらすまん。
0706デフォルトの名無しさん
2006/05/21(日) 00:47:10f()はテンプレート関数じゃないように見えるんだが……。
どうやるんだろう。
0707デフォルトの名無しさん
2006/05/21(日) 00:47:200709デフォルトの名無しさん
2006/05/21(日) 00:52:25通りました。
一応確認ですが
g(static_cast<void (*)(float)>(f));
でvoid f(int); が void f(float)にキャストされてしまう心配は無いですか?
0710デフォルトの名無しさん
2006/05/21(日) 00:54:28そんな無茶な変換をstatic_castが通すわけがない。
0711デフォルトの名無しさん
2006/05/21(日) 00:56:24曖昧なのは本当はコンパイラのチェックのタイミングで
PG の設計じゃないのにな
0712デフォルトの名無しさん
2006/05/21(日) 00:56:50g<void (int)>(f);なんかはだめ?
static_castよりも少ない文字数だよ。
0713デフォルトの名無しさん
2006/05/21(日) 01:04:13ありがとう御座います。
密かに
void (*p)(float) = f;
g(p);
しか無いのかなと思っておりました。
>>711
趣味でやっているもんでして
>>712
上の例はかなり簡略した例でして
実際のはfor_eachに渡すんで第二引数になってしまうんですよね。
第一引数を指定するのも面倒なんで>>707の方法で逝きます。
ありがとうございました
0714デフォルトの名無しさん
2006/05/21(日) 01:05:420715デフォルトの名無しさん
2006/05/21(日) 01:11:29確かにそうなんですが destroy_int とか destroy_float ってやるのもどうかと思いまして。。。
当然中身はただ delete オペレータ読んでるだけじゃないっす。float 以外の型も増えそうな感じなんで。
0716デフォルトの名無しさん
2006/05/21(日) 01:26:12古き良きマクロでも使うしかないのかねぇ……。
template <typename T>
void (T) make_f()
{ return static_cast< void (T)>(f) ; }
template <typename T>
void (*)(T) make_f()
{ return static_cast< void (*)(T)>(&f) ; }
template <typename T>
struct make_f
{
typedef ????……無理か……
}
0717デフォルトの名無しさん
2006/05/21(日) 01:26:41具体的な用途は知らんけど、こんな感じにしたら?
#include<iostream>
using namespace std;
template<typename T> struct g_impl;
template<> struct g_impl<int> {static int do_it(){cout << "int" << endl;} };
template<> struct g_impl<float> {static int do_it(){cout << "float" << endl;}};
template<class T> void g(T) {g_impl<T>::do_it();}
int main()
{
g(5);
g(5.5f);
}
0718デフォルトの名無しさん
2006/05/21(日) 01:28:46for_eachに渡したいといっているんだから、
関数オブジェクトにすべきでは?
0719デフォルトの名無しさん
2006/05/21(日) 01:33:300720デフォルトの名無しさん
2006/05/21(日) 01:38:10明示的なキャストなしで引き渡したい場合,確かに
(operator()がオーバーロード/テンプレート化された)関数オブジェクトにするしか
方法がないとは思いますけれど,そうすると今度は関数オブジェクトを
わざわざ作る手間とのトレードオフになってしまうんですよね.
0721デフォルトの名無しさん
2006/05/21(日) 01:42:51template <> struct destroy<int>
{
void operator () (int *p){ delete p ; }
} ;
template <> struct destroy<float>
{
void operator () (float *p){ delete p ; }
} ;
int main()
{
int * ptr_array[32] ; //
for (int i = 0; i != 32 ; ++i)
ptr_array[i] = new int ;
std::for_each( &ptr_array[0], &ptr_array[32], destroy<int>() ) ;
}
そんなに手間かな?
むしろ関数オブジェクトのほうが使いやすいと思うのだが。
0722721
2006/05/21(日) 01:49:390723デフォルトの名無しさん
2006/05/21(日) 01:51:55趣味でやってると時間の制限が無い分、あれこれ試してるだけで1日終わったり…。
今はなるべく、行数が少ない方が良いと思ってプログラムしております。
変更するのに時間掛からないんで。
どうでもいいですよね
0724デフォルトの名無しさん
2006/05/21(日) 01:54:20>>722
関数オブジェクトクラスに型パラメータを持たせずに
済ませることすらできるようになりますね.
struct destroy{
template< class T > operator()( T *p ){ delete p; }
};
ただ for_each のような例なら関数呼び出し構文の戻り値の型を
全く必要としないのでその手間で済むんですが,一般には汎用関数内で
戻り値の型を必要とする場合がしばしばあるので,
そうすると戻り値の型計算をちゃんと書かないといけなくなるので.
(いわゆる Polymorphic Function Object)
0725721
2006/05/21(日) 01:56:22{
void operator() (T *p) { delete p ; }
} ;
オーバーヘッドが気にならないんだったら、
boostのsmart_ptrあたりをコンテナに放り込んだほうが楽そう。
>>723
禿曰く、「マルチパラダイム」らしいけど。
0727デフォルトの名無しさん
2006/05/21(日) 02:45:480728デフォルトの名無しさん
2006/05/21(日) 02:48:040729デフォルトの名無しさん
2006/05/21(日) 03:18:40,. -‐'''''""¨¨¨ヽ
(.___,,,... -ァァフ| あ…ありのまま 今 起こった事を話すぜ!
|i i| }! }} //|
|l、{ j} /,,ィ//| 『関数ポインタを返す関数をコンパイラに読ませたと
i|:!ヾ、_ノ/ u {:}//ヘ 思ったらいつのまにか自分では読めないコードがそこにあった』
|リ u' } ,ノ _,!V,ハ |
/´fト、_{ル{,ィ'eラ , タ人 な… 何を言ってるのか わからねーと思うが
/' ヾ|宀| {´,)⌒`/ |<ヽトiゝ おれも何をしたのかわからなかった…
,゙ / )ヽ iLレ u' | | ヾlトハ〉
|/_/ ハ !ニ⊇ '/:} V:::::ヽ 頭がどうにかなりそうだった…
// 二二二7'T'' /u' __ /:::::::/`ヽ
/'´r -―一ァ‐゙T´ '"´ /::::/-‐ \ 催眠術だとか超スピードだとか
/ // 广¨´ /' /:::::/´ ̄`ヽ ⌒ヽ そんなチャチなもんじゃあ 断じてねえ
ノ ' / ノ:::::`ー-、___/:::::// ヽ }
_/`丶 /:::::::::::::::::::::::::: ̄`ー-{:::... イ もっと恐ろしいものの片鱗を味わったぜ…
template<typename T>
inline void (*select_f())(T) { return f; }
g(select_f<int>());
0730デフォルトの名無しさん
2006/05/21(日) 06:06:450731デフォルトの名無しさん
2006/05/21(日) 07:44:420732デフォルトの名無しさん
2006/05/21(日) 14:58:09こういう風に調べたのだろうか……。
//関数ポインタ
typedef void (*ptr_type)(int) ;
//関数ポインタを返す関数
ptr_type foo() ;
//人間の読める文字列を得る。
std::cout << typeid(foo).name() << std::endl ;
//VC7.1だと、void (__cdecl*__cdecl(void))(int)
これを元にテンプレート関数へ
template <typename T>
inline
void ( *make_f(void) ) (T) { retuirn f ; }
将来、絶対に書きたくないし読みたくもないコードだ……。
0733デフォルトの名無しさん
2006/05/21(日) 18:24:15ふつーに K&R でも読めばどうとでも・・・
0734デフォルトの名無しさん
2006/05/21(日) 19:27:310735デフォルトの名無しさん
2006/05/21(日) 20:09:03typedef しろ
0736デフォルトの名無しさん
2006/05/21(日) 20:30:05あれを typedef 使って書き直そうとすると、 template のせいで意外と大変な罠。
0737デフォルトの名無しさん
2006/05/21(日) 20:43:040738デフォルトの名無しさん
2006/05/21(日) 20:58:36関数ポインタを返す関数について K&R と C++ の相違を述べよ
0739デフォルトの名無しさん
2006/05/21(日) 21:11:170740デフォルトの名無しさん
2006/05/21(日) 21:15:49違いはない。一人吹いたぐらいで突っかかるな。
0741デフォルトの名無しさん
2006/05/21(日) 21:57:51返ってきたのは 739 程度
0742デフォルトの名無しさん
2006/05/21(日) 21:59:220743デフォルトの名無しさん
2006/05/21(日) 22:00:510744デフォルトの名無しさん
2006/05/21(日) 22:39:11論理的思考のできない平成生まれが脊椎反射でレスてんじゃねーよwwww
0745デフォルトの名無しさん
2006/05/21(日) 22:50:070746デフォルトの名無しさん
2006/05/21(日) 22:56:020747デフォルトの名無しさん
2006/05/21(日) 22:56:360748デフォルトの名無しさん
2006/05/21(日) 23:04:35C++にしかないtemplateと併用する場合typedefを使うとかえって面倒なため(>736)、
>729のような複雑な宣言を強いられるが、
Cであればtypedefですっきりした宣言にできる。
あんたはCでもtypedefせずに>729みたいに書いてるのか?
つかまさかK&Rに>729みたいな書き方を読めるようになりなさいって書いてあるんだろうか
0749デフォルトの名無しさん
2006/05/21(日) 23:08:39まあ、そうだね
職場でもスタイルについては頻繁に議論するけど
これに不満を訴える人はいないし
0750デフォルトの名無しさん
2006/05/21(日) 23:12:070751デフォルトの名無しさん
2006/05/21(日) 23:12:36後半はまったく意味を成していない件について
0752デフォルトの名無しさん
2006/05/22(月) 00:03:39template<typename T> type
{
typedef T type;
};
template<typename T>
inline type<void (*)(T)>::type select_f {return f;}
0753デフォルトの名無しさん
2006/05/22(月) 00:22:44できるだろうな。そのままじゃコンパイルできないけど。
0754デフォルトの名無しさん
2006/05/22(月) 01:18:590755デフォルトの名無しさん
2006/05/22(月) 01:21:540756デフォルトの名無しさん
2006/05/22(月) 01:27:560757デフォルトの名無しさん
2006/05/22(月) 01:53:08struct identity
{
typedef T type ;
} ;
template <typename T>
inline
identity<void (*)(T)>::typename
type select_f()
{
return f ;
}
VC7.1ではコンパイルが通らない。
何かおかしいのかな。
0758デフォルトの名無しさん
2006/05/22(月) 02:00:18だろ?
VC7.1で試してはいないが。
0759757
2006/05/22(月) 02:04:370760757
2006/05/22(月) 02:07:32struct make_type
{
typedef void (*type)(T) ;
} ;
template <typename T>
inline
typename make_type<T>::type
make_f()
{
return &f ;
}
こうしたほうがわかりやすいかな。
0761デフォルトの名無しさん
2006/05/22(月) 02:17:08return &f;←このfはどこから?
0762デフォルトの名無しさん
2006/05/22(月) 02:20:070763デフォルトの名無しさん
2006/05/22(月) 06:21:18ここで喧嘩売るあんたこそ一番の荒らしだよ
0764デフォルトの名無しさん
2006/05/22(月) 06:24:15あらゆる難癖の中でも「自分がキレイなつもりでいる」分悪質だな。
0765デフォルトの名無しさん
2006/05/22(月) 06:26:440766デフォルトの名無しさん
2006/05/22(月) 06:27:120767デフォルトの名無しさん
2006/05/22(月) 06:31:50void f(T);
template<>void f<int>(int){....}
template<>void f<float>(float){...}
0768デフォルトの名無しさん
2006/05/22(月) 07:08:37ほら、喧嘩したいのは他ならぬ自分なのが丸わかり。
0769デフォルトの名無しさん
2006/05/22(月) 07:10:300770デフォルトの名無しさん
2006/05/22(月) 11:24:04そのまま visitor として実装すればいいだけだろうと思うが。
function_traits でいちいち型を調べる必要も無い。
// STL のアルゴリズムに渡すためには、
// result_type を定義しないといけないので、
// とりあえず static_visitor から派生させておく
struct fx : public ::boost::static_visitor<void> {
template< typename T > void operator()( T val ) const {
// すでにある関数 f の呼び出し
f( val );
}
};
g(fx());
0771デフォルトの名無しさん
2006/05/22(月) 11:44:350772デフォルトの名無しさん
2006/05/22(月) 20:54:20あんたが煽る限りいくらでもやり返すぜ
最後まで何か言う気なら結果は1つだ
0773デフォルトの名無しさん
2006/05/22(月) 21:36:52この様に宣言されているスマートポインタをノーマルポインタに宣言し直すにはどうのようにすればいいのでしょうか?
0774デフォルトの名無しさん
2006/05/22(月) 21:39:22じゃないの?
0775デフォルトの名無しさん
2006/05/22(月) 22:06:06即レス感謝です。ありがとうございました
0776デフォルトの名無しさん
2006/05/22(月) 23:35:57ほんとに血の気が多いね。頭が悪いのに。
あ、ズバリ書くとまた煽られちゃうかもー(コワイコワイ
0777デフォルトの名無しさん
2006/05/23(火) 21:55:45質問しづらいだろ
0778デフォルトの名無しさん
2006/05/24(水) 00:29:06{
if(なんちゃら)
if(なんちゃら)
if(なんちゃら)
}
ってあったんだけど、
{
}
↑これなに?
カッコだけでくくると何か特別な意味あるのかな?
ただ、見やすくするため?
0779デフォルトの名無しさん
2006/05/24(水) 00:37:55それだけ見るとあんまり意味は無い。
変数の定義があれば、スコープがひとつできることになる。
0780デフォルトの名無しさん
2006/05/24(水) 00:56:22意味ないのは変わりないと思うけど。
0781デフォルトの名無しさん
2006/05/24(水) 01:01:470782779
2006/05/24(水) 01:05:49あーそうだな。書き直そう。
- 変数の定義があれば、スコープがひとつできることになる。
+ スコープがひとつできるので、変数の定義があれば何か意味があるかも。
0783デフォルトの名無しさん
2006/05/24(水) 01:09:55ブロックの事を言っている?
0785779
2006/05/24(水) 01:30:04- 変数の定義があれば、スコープがひとつできることになる。
+ ブロックができるので、変数などの宣言があればそこでスコープが切れることになる。
0786デフォルトの名無しさん
2006/05/24(水) 01:46:04ただ
if(ほにゃらら) return FALSE;
が3列ならんでるだけですね。
見やすくするだけなのか?あまり意味はなさそうですね。
0787デフォルトの名無しさん
2006/05/24(水) 01:57:54{
}
とかだったりしてな。
0788デフォルトの名無しさん
2006/05/24(水) 04:07:24正直、778のレス内容だけでは何とも言いがたい。
0789デフォルトの名無しさん
2006/05/24(水) 07:29:49if(なんちゃら) { T x = XXX; …
if(なんちゃら)
if(なんちゃら)
}
ってのがあれば、デストラクタ呼び出しが}で行われる。Cとの違い。
0790デフォルトの名無しさん
2006/05/24(水) 08:53:38その例だと外側のBracesは要らない。
無い知恵絞った積もりなのだろうけど、その点に関してはCと違わない。
0791デフォルトの名無しさん
2006/05/24(水) 13:41:38if( どーたら )
{
if(なんちゃら)
...
}
とあったのが、何らかの理由で「if( どーたら )」
だけ削ったんじゃねーの?
0792デフォルトの名無しさん
2006/05/24(水) 14:57:21>無い知恵絞った積もりなのだろうけど
やめろってば
0793デフォルトの名無しさん
2006/05/24(水) 14:58:35> {
> if(なんちゃら) T x = XXX;
だとどうなの?
0794デフォルトの名無しさん
2006/05/24(水) 16:06:29Cだと(C99でも)エラー。
C++だとスコープがif () の後の一文に限定される。
#だったと思う。
0795デフォルトの名無しさん
2006/05/24(水) 16:28:09…
}
のiのscopeは結局どうなったの?
if (i == N) { // not found
はまずい仕様になった?
0796デフォルトの名無しさん
2006/05/24(水) 16:30:27//iはここで使える。
}
//VC6のような腐ったコンパイラだと、何故かここで使える。
0797デフォルトの名無しさん
2006/05/24(水) 16:58:26時代背景も知らずに
0798デフォルトの名無しさん
2006/05/24(水) 17:01:26時代背景→歴史的経緯
0799デフォルトの名無しさん
2006/05/24(水) 17:06:58どっちでもいいがなw
0800デフォルトの名無しさん
2006/05/24(水) 17:08:55知ってても今となっては(今さら使うなら)腐ってるといえる
でもまあ今VC6を使ってるとかいう話なわけでもないのに
唐突にVC6のことを書くのは余分だな
VCとしては7以降でちゃんとその後の規格に合わせて対応してるし
>>795
規格としては >>796 でいうVC6で採用されていたスコープルールとは
異なるものが採用された
0801デフォルトの名無しさん
2006/05/25(木) 02:13:36{
bool F(){ delete this; retrun true; }
};
--
A *a = new A;
a->F();
これあり?
0802デフォルトの名無しさん
2006/05/25(木) 02:24:35古典的
ttp://www.parashift.com/c++-faq-lite/freestore-mgmt.html#faq-16.15
1.オブジェクトは100パーセント絶対確実にnewによって作られていなければならない。
new[]やPlacement newだとダメ。ローカル、静的なオブジェクトもNG
2.これ以降、そのオブジェクトは使えない。
3.delete thisをしたあとは、メンバ関数はそのオブジェクトに属するメンバを使ってはならない。
4.クラスの外部でも操作不可。
とりえず、100パーセント絶対確実に、自信を持って出来るならば、やればいいんじゃない。
0803デフォルトの名無しさん
2006/05/25(木) 02:52:39delete this;は当たり前のように使われている。
0804デフォルトの名無しさん
2006/05/25(木) 06:12:390805デフォルトの名無しさん
2006/05/25(木) 11:24:540806デフォルトの名無しさん
2006/05/25(木) 13:32:22type_info::operator =
type_info::before
による型チェックを行ってるのですが、何故か照合できない型があります。
そして、別の型名なのに true になってしまう事もあります。
type_info による型チェックは信頼性が低いのでしょうか?
0807デフォルトの名無しさん
2006/05/25(木) 13:44:43問題を再現する最低限のソースを貼ってみましょ
0808デフォルトの名無しさん
2006/05/25(木) 14:19:11contents...
};
class Block : public FixObj {
contents...
};
class Step : public FixObj {
contents...
};
こういうクラス構造で・・・
bool test (const type_info& TYPE, Obj* OBJ) {
return typeid(OBJ) == TYPE || typeid(OBJ).before(TYPE);
}
こういう型判定メソッドがあり・・・
Obj* obj = new Block;
test(typeid(Block*), obj);
こうしても結果がfalseになってしまいます。
しかし、dynamic_cast<Block*>(obj)では、NULLになりません。
何故なんでしょうか?
ただ、Stepインスタンスはちゃんと照合できるのです。
環境はVisualC++です。何故なんでしょうか?
type_info による型照合は信頼性が低いのでしょうか?
0809デフォルトの名無しさん
2006/05/25(木) 14:27:290810デフォルトの名無しさん
2006/05/25(木) 14:37:37参照渡しにすれば問題なし。
0811デフォルトの名無しさん
2006/05/25(木) 15:18:36おお、どうもです。しかし・・・・
bool test (const type_info& TYPE, Obj& OBJ) {
return typeid(OBJ) == TYPE || typeid(OBJ).before(TYPE);
}
として、参照渡しにして
Obj* obj = new Block;
test(typeid(Block), *obj);
としたら、照合はされたのですが、今度は
typeid(Step)でもtrueになってしまいます・・・・
しかも、ポインタ型だとどんなものでもtypeid(string*)でも、trueに
なってしまうのです・・・・
内部で勝手に、何かが共有(スライシング)されてるのでしょうか?
もうイライラして死にそうです・・・
0812デフォルトの名無しさん
2006/05/25(木) 15:28:30うちはちゃんと動いてるようだけどなぁ
$ cat test.cpp && c++ -o test test.cpp && ./test
#include <iostream>
using namespace std;
struct Obj {virtual ~Obj () {}};
class FixObj : public Obj {};
class Block : public FixObj {};
class Step : public FixObj {};
bool test (const type_info& TYPE, const Obj& OBJ) {
// return typeid(OBJ) == TYPE || typeid(OBJ).before(TYPE);
return typeid(OBJ) == TYPE;
}
int main () {
{
Obj* obj = new Block;
cout << test(typeid(Block), *obj);
cout << test(typeid(Step), *obj);
}
{
Obj* obj = new Step;
cout << test(typeid(Block), *obj);
cout << test(typeid(Step), *obj);
}
cout << endl;
return 0;
}
1001
0813デフォルトの名無しさん
2006/05/25(木) 16:30:03すみません。説明不足でした・・・・
実際のプログラム中では、「Obj*」データはコレクションクラスに格納されており、
Objを仮想基本クラスにした様々なインターフェースを、それぞれが実装してるのです。
その格納庫の中から任意のインターフェースを実装してるObj*データを
随時取り出して処理を行わせる流れにしてるのですが、そのインターフェースの
型チェックで上記のtest関数が上手くいかないのです・・・・
コレクションから取り出したObj*は、dynamic_castだと正確に照合できますが
typidチェックだと照合できなかったり、他の型でもtrueになったりしてしまうのです・・・
もうどうすればいいのか・・・
0814デフォルトの名無しさん
2006/05/25(木) 16:56:32testに渡す前とtestの中で
type_info::nameを見てみれば?
0815デフォルトの名無しさん
2006/05/25(木) 17:04:15それが「class Block」となってるんです・・・・
しかし、そのObj*データは、ポインタ型だとどんなものであっても
typeid(obj) == typeid(string*) || typeid(obj).before(typeid(string*))
これで true になってしまうのです・・・・
0816デフォルトの名無しさん
2006/05/25(木) 17:15:510817デフォルトの名無しさん
2006/05/25(木) 17:26:19どなたか知恵をかしてください。
ヒントは"三角関数をつかう"なんですけど...
式の立て方がわからないです
0818デフォルトの名無しさん
2006/05/25(木) 17:29:21まとめると
Obj* pobj; として、それにBlockインスタンスを代入して
typeid(pobj)だと、その「Block*」との照合が false となり、
typeid(*pobj)だと、「Block」だけなく同じ仮想基本クラスを持つ型(Step)と、
更に全ポインタ型(string*)との照合でも true になってしまうのです・・・
何がなんだか・・・orz
0819デフォルトの名無しさん
2006/05/25(木) 17:36:09座標(cx, cy)を半径rで回るとすると
int i = 0;
while (true) {
i = (i + 1) % 360;
double rad = (double) i * 3,14 / 180;
double x = cos(rad) * r;
double y = sin(rad) * r;
drawImage(cx + x, cy + y);
}
0820デフォルトの名無しさん
2006/05/25(木) 17:39:19これの出力をコピペしてみて(文章による報告じゃなくて)
#include <iostream>
using namespace std;
struct Obj {virtual ~Obj () {}};
class FixObj : public Obj {};
class Block : public FixObj {};
class Step : public FixObj {};
bool test (const type_info& TYPE, const Obj& OBJ) {
cout << typeid(OBJ).name () << ' ' << TYPE.name ()
<< ' ' << typeid (string *).name ()
<< ' ' << typeid (int *).name () << endl;
return typeid(OBJ) == TYPE;
}
int main () {
Obj* obj = new Block;
cout << typeid (*obj).name () << endl;
cout << typeid (Obj).name () << ' ' << typeid (Block).name ()
<< ' ' << typeid (Step).name () << endl;
cout << test(typeid(Block), *obj) << endl;
cout << test(typeid(Step), *obj) << endl;
return 0;
}
0821デフォルトの名無しさん
2006/05/25(木) 17:49:30アドバイスありがとうございますY(>_<、)Y
今からさっそく実行してみます!!
0822デフォルトの名無しさん
2006/05/25(木) 17:49:56dynamic_castが使えるならdynamic_castでいいだろ。
0823デフォルトの名無しさん
2006/05/25(木) 17:55:00わざわざどうもです。
class Block
struct Obj class Block class Step
class Block class Block class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > * int *
1
class Block class Step class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > * int *
0
結果は正確なのですが、上でも述べましたが
Obj* obj = への代入は、実際のプログラムの中ではコレクションクラスから
取り出したObj*データ(Blockインスタンスなど)なのです・・・
0824デフォルトの名無しさん
2006/05/25(木) 18:05:37一つの希望クラスを指定してのtest関数だけなら、そうするのですが
実は、複数のtype_infoオブジェクトをvectorで渡して、その複数タイプの内
どれか一つを実装してるインスタンスを判別する為のmultiTest関数もあり
そっちがメインなのです。
ですから、何とかtype_infoで型チェックを行いたいのです。
0825デフォルトの名無しさん
2006/05/25(木) 18:07:51beforeが判定するのはクラス継承関係じゃないよ(わかってたらごめん)
0826デフォルトの名無しさん
2006/05/25(木) 18:08:01実行結果最後の行の0は
>>818
>typeid(*pobj)だと、「Block」だけなく同じ仮想基本クラスを持つ型(Step)
><中略>との照合でも true になってしまうのです・・・
の報告と矛盾してるようだけど
0827デフォルトの名無しさん
2006/05/25(木) 18:12:42>>実は、複数のtype_infoオブジェクトをvectorで渡して、その複数タイプの内
type_infoオブジェクトはコンテナに入れてはいけないよ
Loki::TypeInfoなどを使いましょう
0828デフォルトの名無しさん
2006/05/25(木) 18:13:31自分の認識ではbeforeは、そのインスタンスの全スーパークラス「だけ」との
照合で true になると思ってるのですが・・・・
違うのですか?
>>826
単純に、Obj* obj = new Block と代入するなら正確な結果になるのですが
実際のプログラムの中では、obj = iterator->second などと
コレクションクラスから代入してるのです。
0829デフォルトの名無しさん
2006/05/25(木) 18:19:31正確には、type_info のアドレスをvectorに入れてるのですが
これでもまずいのですか?
0830825
2006/05/25(木) 18:19:32単にtypeidの配列をソートしたい場合とかに使う順序関係であって、
クラス継承とは無関係だと思ったけど…。
いざ探そうと思うとドキュメントが見つからない
0831デフォルトの名無しさん
2006/05/25(木) 18:22:44int i = 0;
i = i++;
printf("%d\n", i);
}
このようなコードを書いた際、C/C++では1が表示されますが
C#で同じコードを書くと0が返ってきます。
演算子の優先順位を確認するとC#のほうが正しいような気がするのですが、正しいのはどっちでしょうか。
気になって夜も眠れません。
0832デフォルトの名無しさん
2006/05/25(木) 18:23:51げー!!!
じゃあC++の標準ではスーパークラスをチェックする方法はないんですか?
MFCみたいに、クラス毎にマクロを記述するのはどうしても避けたいのですが・・・
インターフェースが多すぎて
0833831
2006/05/25(木) 18:24:45C/C++のコンパイラはVisual C++ 2005とgcc4.0.3で確認しました。
C#のコンパイラはVisualC# 2005で確認しました。
0834デフォルトの名無しさん
2006/05/25(木) 18:30:02>18.5.1
>1. The class type_info describes type information generated by the
>implementation. Objects of this class effectively store a pointer to
>a name for the type, and an encoded value suitable for comparing two
>types for equality or collating order. The names, encoding rule, and
>collating sequence for types are all unspecified and may differ
>between programs.
>
>bool before(const type_info& rhs) const;
>
>5. Effects: Compares the current object with rhs.
>6. Returns: true if *this precedes rhs in the implementation’s collation order.
0835デフォルトの名無しさん
2006/05/25(木) 18:31:53これは演算子の優先順位でなく、コンパイラの解釈上の問題のような。
シンプルに考えると1の方が正しい。iへの後置演算をキャンセルした
♯のアセンブルが正しいかどうかは、人によって意見が分かれると思う。
0836デフォルトの名無しさん
2006/05/25(木) 18:36:46少なくともC/C++ではそれがどうなるかは未定義。
2つの副作用完了点の間に、2度も同一のオブジェクトに書き込むことになるから。
0837デフォルトの名無しさん
2006/05/25(木) 18:40:18dynamic_cast<>すればいいだろ。
0838デフォルトの名無しさん
2006/05/25(木) 18:42:05gcc3.3.5は-Wallで警告が出るね
0839831
2006/05/25(木) 18:44:56int i = 0;
i = (i++);
printf("%d\n", i);
}
ちなみにこのように括弧をつけても共に同じ挙動を示します。
0840831
2006/05/25(木) 19:06:25<C++>
int main(){
int h = 0;
int i = 0;
int j = 0;
int k;
printf("%d ", h++);
printf("%d ", i = i++);
printf("%d ", k = j++);
printf("%d\n", i);
return 0;
}
<C#>
static void Main(string[] args)
{
int h = 0;
int i = 0;
int j = 0;
int k;
Console.Write("{0} ", h++);
Console.Write("{0} ", i = i++);
Console.Write("{0} ", k = j++);
Console.WriteLine("{0}", i);
}
出力
<C++>
0 0 0 1
<C#>
0 0 0 0
0841デフォルトの名無しさん
2006/05/25(木) 19:19:05だから未定義って言ってるだろ。
コンパイラによっても違うかもしれないし、
最適化オプションによっても違うかもしれないし、
鼻から悪魔が出るかもしれないし、
そんなコードは書いちゃいかん。
0842デフォルトの名無しさん
2006/05/25(木) 19:51:08ありがとうございますー
0843デフォルトの名無しさん
2006/05/26(金) 02:04:44副作用完了点って意味ワカンなかったらググれよ、屑。
0844デフォルトの名無しさん
2006/05/26(金) 02:18:120845デフォルトの名無しさん
2006/05/26(金) 02:19:100846デフォルトの名無しさん
2006/05/26(金) 16:31:290847デフォルトの名無しさん
2006/05/26(金) 19:45:02スレ一覧を見ろ
0848デフォルトの名無しさん
2006/05/26(金) 20:59:45「mainより先に処理を呼ぶ方法がある」
と書いてあって、
方法としては確か
mainの書いてあるファイルと
同じファイルに無名namespaceで囲んだクラスを定義して・・・
以下どうだったか忘れました
・詳しくはどうやるんだっけ?
・どうしてそうなるのか
の二点が疑問なんですが、どなたかご存知の方いらっしゃいますか
0849デフォルトの名無しさん
2006/05/26(金) 21:20:27>同じファイルに無名namespaceで囲んだクラスを定義して・・・
その後で無名namespaceでインスタンスをつくるとかかなぁ
0850デフォルトの名無しさん
2006/05/26(金) 21:53:13・適当なクラスのコンストラクタにmainより前で実行させたい処理を書く。
・そのクラスのインスタンスを静的変数として定義
全ての静的変数の初期化はmainより前で行われるのでmainの前で処理が行える。
ついでに言うと静的変数のデストラクタはmainの終了後に行われる。
0851848
2006/05/26(金) 21:59:20>>850
なるほど!
静的変数の初期化を利用するんでしたか
という事は
・mainより先に処理したいクラス定義はmainの書いてあるファイルと
別ファイルにしてはいけない
・mainより先に処理したいクラス定義は複数書くと順番は保障されない
という認識になるんですかね
あとは調べながら試してみます
ありがとうございました
0853デフォルトの名無しさん
2006/05/26(金) 22:22:39演算子の優先順位を確認するとC#のほうが正しいような気がするのですが
int main(){
int i = 0;
int n;
n = i++;
printf("%d\n", n);
}
これでどうなる? 0 がでるだろ、演算子の優先順位処理は正しく行われている。
もとの式
i=i++;
左のiにゼロが代入される
その後i++でiがインクリメントされて、printfに渡される、何が問題なのか不明だなw
0854デフォルトの名無しさん
2006/05/26(金) 22:53:36なんかメリットあるのか?正直デメリットしか思いつかないんだが。
0855デフォルトの名無しさん
2006/05/26(金) 23:07:55cout の初期化を明示的に書かずに済むことくらいか
・・・これも怪しいが
0856デフォルトの名無しさん
2006/05/26(金) 23:58:29Singleton系
allocatorの初期化
0857デフォルトの名無しさん
2006/05/27(土) 00:40:370858デフォルトの名無しさん
2006/05/27(土) 00:47:270859デフォルトの名無しさん
2006/05/27(土) 00:53:06g++ならinfoみて
__pthreadとか
0860デフォルトの名無しさん
2006/05/27(土) 07:07:42#include <stdio.h>
namespace x
{
fread(...) { ... }
xmain()
{
fread(...);
fwrite(...);
}
}
main()
{
fread(...);
}
上のxmain()内でのfread()の呼び出しはx::fread()ですが、fwrite()の呼び出し先を::fwrite()でなく、エラーにしたいのです。何かいい方法はありますか?
0861デフォルトの名無しさん
2006/05/27(土) 07:12:07名前の隠蔽を利用して、宣言だけをx名前空間の中に置いておけばいいんじゃまいか?
namespace x {
fread(...) { ... }
size_t fwrite(...);
xmain() {
fread(...); // x::fread
fwrite(...); // エラー:x::fwriteは定義がない
}
}
0862デフォルトの名無しさん
2006/05/27(土) 13:14:43#define fwrite do_not_call
0863デフォルトの名無しさん
2006/05/27(土) 17:34:560864デフォルトの名無しさん
2006/05/27(土) 17:55:13わざわざそんな質問をするような暇人向けではない。
0865デフォルトの名無しさん
2006/05/27(土) 18:12:11将来使う予定があるなら暇なときに習得するべし
0866デフォルトの名無しさん
2006/05/27(土) 18:17:43線形リストもコーディングできないような奴とか
配列の境界チェック怠ってBOF起こさせる奴とか
0867デフォルトの名無しさん
2006/05/28(日) 06:33:420868デフォルトの名無しさん
2006/05/28(日) 13:57:27このコードなのですが、コンパイルできないので知恵をおかしください。
多分35行目の
OSStatus err = FSRefMakePath(&appBundleRef,mPathString, PATH_MAX);
のmPathStringに問題があると思うのですが、どこを変更すればいいのか分かりません。
0869デフォルトの名無しさん
2006/05/28(日) 14:17:360870デフォルトの名無しさん
2006/05/28(日) 23:25:59お母さんの様にやさしく教えてくれるサイト・本等あったら教えてください
boost,Lokiのソースを見てみましたが
「何の処理をしているか」はなんとなく分かるんですが
「なぜそうしているのか」かがいまいち汲み取れてないのが現状です
0871デフォルトの名無しさん
2006/05/28(日) 23:26:02誤表記ですよね、定価 \6,000 だし・・・
ttp://www.amazon.co.jp/gp/product/4756137156/250-9284646-5949012?v=glance&n=465392
0872デフォルトの名無しさん
2006/05/28(日) 23:29:380873870
2006/05/28(日) 23:34:04なるほどソース読むよりまずはドキュメントを熟読せよと
英語なのでお母さんの様にやさしいかは不明ですが、
ますはチュートリアルから頑張って読んで見ます。
0874デフォルトの名無しさん
2006/05/28(日) 23:41:3529800だろ?それが高いのはかなり前から推薦図書スレで既出
良書の上、絶版になったので高騰してる
0875デフォルトの名無しさん
2006/05/29(月) 00:35:53Modern C++ Design(邦訳あり)
C++ Templates
C++ Template Metaprogramming
0876デフォルトの名無しさん
2006/05/29(月) 01:29:16という名前空間をみかけますが、
TR1の名前空間は暫定的なものなんでしょうか
C++0xになったらstdに格上げされるとか?
0877デフォルトの名無しさん
2006/05/29(月) 01:51:50だいぶ仕様が変わっているから、そのままだと既存のコードが動かないし。
0878デフォルトの名無しさん
2006/05/29(月) 01:55:10↓これ見たらわかるかも。
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1836.pdf
0879デフォルトの名無しさん
2006/05/29(月) 07:41:15互換性のため、std::tr1を維持するのは構わないけど、(そのための'1'なんだから)
標準に入ったら、stdにも加わるに決まってるだろ。
0880デフォルトの名無しさん
2006/05/29(月) 23:29:00ttp://www.amazon.co.jp/exec/obidos/ASIN/0201379260/qid=1148912665/sr=1-1/ref=sr_1_2_1/249-9107367-7476308
訳書じゃないなら、日本のアマゾンで8300円少々で買える
ま、29万はありえんが2万9800円も異常な値段だな
0881デフォルトの名無しさん
2006/05/30(火) 06:31:53ExceptionalC++等で断片的な知識は得た物の、
言語仕様上の違いがいまいちハッキリ分からずに悩んでおります。
0882デフォルトの名無しさん
2006/05/30(火) 06:40:54規格票
0883デフォルトの名無しさん
2006/05/30(火) 06:44:49おkおk、書店で売っている大量の、
自称C++入門書とやらは、全部詐欺本だな。
規格票ひとつあれば、あんなものいらねーもんな。
アルゴリズムや特定のアーキテクチャ、ライブラリの解説書以外は不要だよな。
0884デフォルトの名無しさん
2006/05/30(火) 06:53:15まあ必要かどうかということならそうだね。
教科書だけあれば参考書は必要ではない
だがあれば理解の助けになるので、意義はあるけどな
0885デフォルトの名無しさん
2006/05/30(火) 08:47:03継承関係なしに private と protected の違いさえわかればいいと思うんだが。
0886デフォルトの名無しさん
2006/05/30(火) 09:34:02例えばDerivedがBaseをprivate継承していたら
BaseのポインタにDerivedのポインタを代入できなかったりと
クラス内のアクセス制御とはちょっと違う制約があるからな
0887デフォルトの名無しさん
2006/05/30(火) 09:37:48それも継承関係が private であることの結果でしょ?何が違うとも思わないな。
0888デフォルトの名無しさん
2006/05/30(火) 09:40:50「クラス内からのみアクセスできる」と「ポインタが代入不可」にどうして違いがないのか理解できない
0889デフォルトの名無しさん
2006/05/30(火) 09:56:06「クラス内からのみアクセスできる」ことによって
「クラス内からのみポインタが変換(代入)できる」ことになる。
前者が private の効果。後者はその結果の一つ。
0890デフォルトの名無しさん
2006/05/30(火) 14:16:340891デフォルトの名無しさん
2006/05/30(火) 14:18:350892デフォルトの名無しさん
2006/05/30(火) 14:27:440893デフォルトの名無しさん
2006/05/30(火) 14:55:100894デフォルトの名無しさん
2006/05/30(火) 15:13:57ダウンロードしてみます。
0895デフォルトの名無しさん
2006/05/30(火) 17:59:15ダウンロードしてみます。
0896デフォルトの名無しさん
2006/05/30(火) 19:08:10ダウンロードしています。
0897デフォルトの名無しさん
2006/05/30(火) 19:17:23ダウンドードしています。
0898デフォルトの名無しさん
2006/05/30(火) 19:19:10ダウンロードしてきます。
0899デフォルトの名無しさん
2006/05/30(火) 19:25:52emacs
0900ホアキン
2006/05/30(火) 22:34:33要するにこうしたいのです↓
class ClassA{
ClassB b;
};
class ClassB{
ClassA a;
};
よろしくお願いします。
0901デフォルトの名無しさん
2006/05/30(火) 22:36:120902デフォルトの名無しさん
2006/05/30(火) 22:40:44どちらか一方或いは両方がポインタや参照などを持つようにするならば可能。
0903デフォルトの名無しさん
2006/05/31(水) 00:50:11protected b{
any function()
....
}
}
インナークラスBのインスタンスをクラスAで宣言する場合の記述方法を教えてください
const a::b _b&;
こんな感じだっけ?
0904デフォルトの名無しさん
2006/05/31(水) 01:08:02インナークラス=ネストされたクラス
クラスAで宣言=クラスAのメンバとして宣言
として、
class A { class B {}; B b; };
こんな感じ。
0906デフォルトの名無しさん
2006/05/31(水) 01:18:58新しいg++だとダメみたいで正確な書式知りたいんだけど
どなたか知りませんか?
0907デフォルトの名無しさん
2006/05/31(水) 02:25:12エラーメッセージも貼らずに聞かれちゃぁ、エスパー募集するしかないねぇ。
0908デフォルトの名無しさん
2006/05/31(水) 03:42:13だったら出来るんじゃないの?
0909デフォルトの名無しさん
2006/05/31(水) 04:50:37問題ないよ。4.1.1 20060511
>>908
おいおい
0910デフォルトの名無しさん
2006/05/31(水) 22:07:21ちょっと興味深いコードだね。
しかし>>900のようにしてしまうとコンパイル時にサイズが決定できなくなる
っつーか無限大になっちまうから、ポインタや参照にする必要がある。
0911デフォルトの名無しさん
2006/05/31(水) 22:34:12class A{
B* b;
public:
A();
};
class B{
A* a;
public:
B()
{
a = new A;
}
};
A::A()
{
b = new B;
}
いくらコンパイル通るからってこういうことするなよ
0912デフォルトの名無しさん
2006/05/31(水) 22:40:15参照を理解してないなw
0913デフォルトの名無しさん
2006/05/31(水) 22:54:54プログラマーが明示的に区別しなくても
vector<int>::iterator p;
の様に書くだけで、後はコンパイラが適切なものを自動で選んでくれるのでしょうか?
0914デフォルトの名無しさん
2006/05/31(水) 22:55:460915デフォルトの名無しさん
2006/05/31(水) 23:21:38vectorの場合はランダムアクセスイテレータ。
そういう風にコンテナによって必然的に決まる。
コンテナとは関係ないイテレータでも、その目的によってやはり必然的に決まる。
0916デフォルトの名無しさん
2006/05/31(水) 23:24:49class Hoge
{
friend T;
};
こういうことをしたいのですが、VC++ 7.1ではこれでコンパイルできたのですが、
GCC 3.4.4ではコンパイルエラーになりました。試しにfriend class T;としてもだめでした。
もしかしてこんなことを標準C++ではやれないのですか?
0917デフォルトの名無しさん
2006/05/31(水) 23:28:29vector<int> a;
iterator(a) i = a.begin();
みたいな
0918デフォルトの名無しさん
2006/05/31(水) 23:52:16C++標準 7.1.5.3 の 2
>《詳述型指定子》中の《識別子》は,名前検索によってその表すものを見つけ出す
>(これを,名前検索が解決するという。)。名前検索の処理は,3.4.4に規定する。
>《識別子》が《クラス名》 又は 《列挙体名》 と解決された場合,《単純型指定子》が
>その型名を導入するのと同じように,《詳述型指定子》は,その《識別子》をその
>宣言に導入する。
>《識別子》が《型定義名》 又はテンプレート《型仮引数》と解決された場合,その
>《詳述型指定子》は不適格とする。
>
>参考 したがって,《型仮引数》Tというテンプレートをもつクラステンプレートの中では,
>次の宣言は,不適格となる。
> friend class T;
0919デフォルトの名無しさん
2006/05/31(水) 23:53:13auto i = a.begin();
ってのが標準化されるかも。
0920デフォルトの名無しさん
2006/05/31(水) 23:54:28C#に搭載されるという
0921デフォルトの名無しさん
2006/06/01(木) 00:00:02C++0xに入ってるみたいだけど
まだ正式な規格になってないから「かも」レベルではあるか
0922デフォルトの名無しさん
2006/06/01(木) 00:01:220923デフォルトの名無しさん
2006/06/01(木) 00:05:09それはすごいな
初期化子からオブジェクト自体の型を推論か・・・
いやふつーに a.iterator i = a.begin(); でもいいんだけどさ
たまーにコンパイラがアフォすぎって感じることあるんだよ
別に :: と . と -> の使い分けとかポインタの存在なんかそのままでいいんだけど
そういうところを受け入れたうえでもコンパイラのロジック自体の直交的に見えないところを整理して欲しい今日この頃でさ
0924デフォルトの名無しさん
2006/06/01(木) 00:06:08http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1894.pdf
0925デフォルトの名無しさん
2006/06/01(木) 00:08:45typedef使っとけばいいじゃん
0926デフォルトの名無しさん
2006/06/01(木) 00:09:02まあ今でも関数templateの実引数から型を決定すること自体はやってるわけでさ。
0927デフォルトの名無しさん
2006/06/01(木) 00:10:11関数テンプレートの型パラメータの省略だけじゃなくて、
クラステンプレートのコンストラクタの型パラメータの省略とか、
改善して欲しい所はたくさんあるね。
0928デフォルトの名無しさん
2006/06/01(木) 00:16:45面白そうだな
じっくり読んでみるよ
thx!!
0929デフォルトの名無しさん
2006/06/01(木) 00:17:460930デフォルトの名無しさん
2006/06/01(木) 00:21:17他の言語は何かマスターしてるのか?
アドバイスが欲しかったらちゃんと自分の状況を書け
0931デフォルトの名無しさん
2006/06/01(木) 00:25:37わかりやすく解説してる良書、お勧め書はありますか?
0932デフォルトの名無しさん
2006/06/01(木) 00:29:40既存の予約語を使いまわす辺りがC直系らしいと思うが
なんとまあ都合いい予約語が余ってたもんだなw auto。
0933デフォルトの名無しさん
2006/06/01(木) 00:31:440934デフォルトの名無しさん
2006/06/01(木) 00:42:38憂鬱なプログラマのためのオブジェクト指向開発講座
0935デフォルトの名無しさん
2006/06/01(木) 00:57:07auto i = 1.0; が
Cでは、int i = 1;のこと。(BCPL以来のint(WORD型)の省略可能)
>>924が規格に入ったC++ではfloat i = 1.0;になるんじゃないかな。
0936デフォルトの名無しさん
2006/06/01(木) 01:25:390937デフォルトの名無しさん
2006/06/01(木) 01:43:59誰も困りそうにないのが凄いな。
0938デフォルトの名無しさん
2006/06/01(木) 01:46:47int main(){
auto i = 0;
return i;
}
%g++ -Wall auto.cpp
auto.cpp: In function `int main()':
auto.cpp:2: error: ISO C++ forbids declaration of `i' with no type
0939デフォルトの名無しさん
2006/06/01(木) 01:49:13auto i = 0; // type-specifier
auto int i = 0; // storage-class-specifier type-specifier
auto auto i = 0; // storage-class-specifier type-specifier
名前に意味ダブらすの得意だし>C++
0940デフォルトの名無しさん
2006/06/01(木) 02:00:08>cl auto.cpp
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.42 for 80x86
auto.cpp(2) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++
は int を既定値としてサポートしていません
0941デフォルトの名無しさん
2006/06/01(木) 03:37:44for (auto it = v.begin(); it != v.end(); ++it) { ... }
規格が確定するのが2008年頃としても、コンパイラがサポートするにはあと3,4年かかりそうだなぁ…
0942デフォルトの名無しさん
2006/06/01(木) 05:28:520943デフォルトの名無しさん
2006/06/01(木) 06:52:03autoキーワードそのものが>>941の目的に特化されて、
>>939の2、3番目はエラーになるのかな。
0944デフォルトの名無しさん
2006/06/01(木) 08:37:00型推論はいくつかの関数型言語ですでに実装されてる機能だし
実装自体にもそれほど難しい点はないので3、4年ってことはないと思われ
というか、初期化子だけで型が決まるんだから関数型言語の型推論よりよっぽど簡単
>>943
禿のことだから必死に互換性を保つだろう、その点は大丈夫そうだ
# 3番目はそもそもエラーらしいけどナ (規格に当たってないから本当かどうかは知らん)
0945デフォルトの名無しさん
2006/06/01(木) 10:18:29auto の他に型を書いていたら
その型になるとかいう仕様になるんじゃね?
0946デフォルトの名無しさん
2006/06/01(木) 10:57:050947デフォルトの名無しさん
2006/06/01(木) 11:00:19なんてのはちゃんと解釈されるの?
0948デフォルトの名無しさん
2006/06/01(木) 11:02:11vector<int> a;
typeof(a.begin()) i = a.begin();
で何とかなります。
>>927のコンストラクタ呼び出しの冗長化で悩ましいので、typeof使ったマクロで処理してます。
まあ標準外れちゃうんだけど。>typeof
0949デフォルトの名無しさん
2006/06/01(木) 11:02:57コンパイル時に決定できれば何でも大丈夫かと
0950デフォルトの名無しさん
2006/06/01(木) 11:03:34storage class 'auto'は廃止の提案です。
0951950
2006/06/01(木) 11:05:22storage class 'auto'の廃止じゃなくて、
storage class specifier 'auto'の廃止です。
「3.Proposed wording」のところ。
もちろん暗黙に指定した'auto' storage classはなくなりません。
0952デフォルトの名無しさん
2006/06/01(木) 11:06:470953デフォルトの名無しさん
2006/06/01(木) 12:35:330954デフォルトの名無しさん
NGNGデフォルトでregisterなのを明示的にautoにしたいとか。
0955デフォルトの名無しさん
2006/06/01(木) 13:35:510956デフォルトの名無しさん
2006/06/01(木) 13:56:390957デフォルトの名無しさん
NGNG昔、組込用コンパイラでそんなのがあった。OptimizeC-86だったかな。
>>956
最適化を抑止というか、レジスタを別の用途(インラインアセンブラとか)に使いたいからとか。
0958デフォルトの名無しさん
2006/06/01(木) 16:16:17規格からautoがなくなっても、今まで通りの処理系使うだけだな。
そもそもC++じゃなくてCっぽいし。
0959デフォルトの名無しさん
2006/06/01(木) 19:05:29いやautoが無くなる事じゃなくて型推論が追加される事に関してだが。
0960デフォルトの名無しさん
2006/06/01(木) 19:36:23例えば?
0961デフォルトの名無しさん
2006/06/01(木) 20:54:51const auto a = 6.3;
const auto m = n * sizeof(a);
auto a[m];
こんな奇怪なコーディングが可能になる、とかか?
すまんあまり良い例(悪い例?)が思いつかない。
0962デフォルトの名無しさん
2006/06/01(木) 21:05:59一番下の式は初期化式がないからアウトだな。
0963デフォルトの名無しさん
2006/06/01(木) 21:10:47あくまで初期化式と同じ型にするだけなのね。
0964デフォルトの名無しさん
2006/06/01(木) 21:31:38vector<int>::itrator it = v.begin();
とか
0965デフォルトの名無しさん
2006/06/01(木) 21:38:520966デフォルトの名無しさん
2006/06/01(木) 21:41:50ほぼどんな型でも格納できる
0967デフォルトの名無しさん
2006/06/01(木) 21:57:58auto is_test = not1(bind2nd(std::ptr_fun(strcmp),"test"));
std::cout << is_test("Test") << " " << is_test("test");
まぁ、多少の非効率を無視してboost::functionで誤魔化してもいいけどね。
0968デフォルトの名無しさん
2006/06/01(木) 22:27:290969デフォルトの名無しさん
2006/06/01(木) 22:33:48std::unary_negate<std::binder2nd<std::pointer_to_binary_function<const char*, const char*, int> > >
boost::lambdaを使うともっと、ありえない型になるw
using namespace boost::lambda;
auto is_test = ! bind(strcmp,_1,"test");
と書いたとして実際の型は
using namespace boost::lambda;
using namespace boost::tuples;
const lambda_functor<lambda_functor_base<logical_action<not_action>,
tuple<lambda_functor<lambda_functor_base<action<3,function_action<3> >,
tuple<int (&)(const char*, const char*),const lambda_functor<placeholder<1> >,
const char (&)[5]> > > > > >
0970デフォルトの名無しさん
2006/06/02(金) 00:06:43boostのlambdaをそんな風に使うコードなんて、autoがあったとしても読みたくない。
0971デフォルトの名無しさん
2006/06/02(金) 00:48:59できれば新しい予約語にして欲しかったけどね。
// けどそっちの方が互換性に問題が出やすいかな。
0972デフォルトの名無しさん
2006/06/02(金) 05:33:09void func(auto n)
{ ... }
templateとバッティングするから恐らく不可だろうなぁ…
0973デフォルトの名無しさん
2006/06/02(金) 06:04:15新しいtemplateの表記法として採用されなくはないんじゃないのか?
0974デフォルトの名無しさん
2006/06/02(金) 06:12:21autoって打つことになりそうだw
0975デフォルトの名無しさん
2006/06/02(金) 06:16:340976デフォルトの名無しさん
2006/06/02(金) 07:02:30今回の提案で意味が変わりそうってだけで
0977デフォルトの名無しさん
2006/06/02(金) 10:26:14そういや C ではとりあえず auto を使ってみた事はあるけど、
C++ では使った事無いな。
0978デフォルトの名無しさん
2006/06/03(土) 14:57:380979デフォルトの名無しさん
2006/06/03(土) 15:04:13memcpyのようなコピー。単に全ビットの並びが複写されるだけ。
0981デフォルトの名無しさん
2006/06/04(日) 13:11:07シャロウコピーなら聞いた事あるけど
0982デフォルトの名無しさん
2006/06/04(日) 13:50:440983デフォルトの名無しさん
2006/06/04(日) 13:56:55《名詞の語尾につけて》〜のように、〜の方向に、〜の点で、〜に関しては、〜的に、〜風に、〜の観点で
0984デフォルトの名無しさん
2006/06/04(日) 14:22:14int型にstring型を入れようとするとコンパイルエラーになる
というのをtype-safeという、という理解で合っていますか?
0985デフォルトの名無しさん
2006/06/04(日) 14:23:58#include <hoge>
という書き方の他に
#include "hoge"
という書き方もあるようなのですがどこか違いがあるのですか?
0986デフォルトの名無しさん
2006/06/04(日) 14:35:460987デフォルトの名無しさん
2006/06/04(日) 14:36:38検索方法がちがう。実際の検索方法はコンパイラ依存。
0988デフォルトの名無しさん
2006/06/04(日) 15:12:33適当に説明する。
<>はシステム側からフォルダ探す。
""はユーザー側からフォルダ探す。
だいたいの""は分割コンパイルするときの関数定義やらグローバル変数
を入れとくヘッダー。要は自作ヘッダー。
ま、言っても、色んなコンパイラ使ったことあるわけじゃないから
詳しくはしらね。
0989デフォルトの名無しさん
2006/06/04(日) 16:45:11教えてください
0990デフォルトの名無しさん
2006/06/04(日) 16:50:020991デフォルトの名無しさん
2006/06/04(日) 17:52:49JavaとかC#の人?
::はスコープ解決、主に名前空間の中の名前にアクセスしたり、静的メンバにアクセスしたり。
->はポインタからの間接参照、p->xは(*p).xに等しい。
0992985
2006/06/04(日) 17:53:58ありがとうございます
ということは<>はSystem32フォルダとかから
ヘッダファイル探索するけど
""だとプログラムのカレントディレクトリから
探索を始めるということですね
0993デフォルトの名無しさん
2006/06/04(日) 18:04:090994デフォルトの名無しさん
2006/06/04(日) 18:23:410995デフォルトの名無しさん
2006/06/04(日) 18:47:56システムにもいろいろなシステムがある。
0996デフォルトの名無しさん
2006/06/04(日) 20:21:32オブジェクトのセマンティクスを考えて行うコピーとの対照で良く、
bitwise copyと言われる。
例えば、参照カウンタを持つオブジェクトへのポインタは、
bitwise copyするとオブジェクトの整合性を壊してしまう。
0997デフォルトの名無しさん
2006/06/04(日) 21:10:510998デフォルトの名無しさん
2006/06/04(日) 21:50:531000デフォルトの名無しさん
2006/06/04(日) 21:52:40↓に避難。
【初心者歓迎】C/C++室 Ver.27【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1147183708/
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。