C++相談室 part56
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2007/07/26(木) 00:33:07ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
テンプレその他 >>2-15 付近参照
前スレ
class C++相談室lt;part56gt;
http://pc11.2ch.net/test/read.cgi/tech/1170343752/l50
0002デフォルトの名無しさん
2007/07/26(木) 00:38:05[C++ FAQ]
http://www.parashift.com/c++-faq-lite/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
Cとその仕様を比較しながらの解説なので分かりやすい。
***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
http://www.cppreference.com/ (英語)
http://www.cppll.jp/cppreference/ (↑の日本語訳だけど最新は反映しない)
[禿 Stroustrup]
http://public.research.att.com/~bs/
[C++ International Standard]
http://www.iso.org/iso/en/CatalogueDetailPage.CatalogueDetail?CSNUMBER=38110&ICS1=35&ICS2=60
[JTC1/SC22/WG21 - C++]
http://www.open-std.org/jtc1/sc22/wg21/
ここから規格の最新(2003より新しい)ドラフトがダウンロードできる。
[JIS X3014]
http://www.jisc.go.jp/app/pager?&RKKNP_vJISJISNO=X3014
ISO規格の日本語訳。JIS X 3014:2003はISO/IEC 14882:2003 (E)に対応。
0003デフォルトの名無しさん
2007/07/26(木) 00:38:43amazon.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/
ttp://www.amazon.co.jp/exec/obidos/ASIN/4894714663/ (翻訳)
C++ Coding Standards
ttp://www.amazon.co.jp/exec/obidos/ASIN/0321113586/
ttp://www.amazon.co.jp/exec/obidos/ASIN/4894716860/ (翻訳)
0004デフォルトの名無しさん
2007/07/26(木) 00:39:54Effective STL
http://www.amazon.com/exec/obidos/ASIN/0201749629/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714108/ (翻訳)
Modern C++ Design
http://www.amazon.com/exec/obidos/ASIN/0201704315/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714353/ (翻訳)
C++ Templates
http://www.amazon.com/exec/obidos/ASIN/0201734842/
C++ Template Metaprogramming
http://www.amazon.com/exec/obidos/ASIN/0321227255/
0005デフォルトの名無しさん
2007/07/26(木) 00:40:39[Boost]
Boost http://www.boost.org/
(日本語) http://www.kmonos.net/alang/boost/
(日本語) http://shinh.skr.jp/boost/
[標準ライブラリ]
SGI-STL http://www.sgi.com/tech/stl/
STLport http://stlport.sourceforge.net/
GNU libstdc++ http://gcc.gnu.org/libstdc++/
Apache STDCXX http://incubator.apache.org/stdcxx/
STLFilt http://www.bdsoft.com/tools/stlfilt.html
(日本語) http://www005.upp.so-net.ne.jp/episteme/html/stlprog/
(日本語) http://www.wakhok.ac.jp/~sumi/stl/
[Loki]
http://sourceforge.net/projects/loki-lib/
LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport
0006デフォルトの名無しさん
2007/07/26(木) 00:41:150007デフォルトの名無しさん
2007/07/26(木) 00:41:50俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない
0008デフォルトの名無しさん
2007/07/26(木) 00:42:250009デフォルトの名無しさん
2007/07/26(木) 00:42:55とかいうエラーが出るんだけどこれってどうすればいいの?
0010デフォルトの名無しさん
2007/07/26(木) 00:46:14後死ね。
0011デフォルトの名無しさん
2007/07/26(木) 00:46:44まぁヒントぐらいにはなったな。
うむごくろう。
0012デフォルトの名無しさん
2007/07/26(木) 00:49:272 ttp://pc.2ch.net/tech/kako/996/996640937.html
3 ttp://pc.2ch.net/tech/kako/1003/10038/1003832761.html
4 ttp://pc.2ch.net/tech/kako/1009/10090/1009071535.html
5 ttp://pc.2ch.net/tech/kako/1014/10142/1014217496.html
6 ttp://pc.2ch.net/tech/kako/1018/10184/1018454705.html
7 ttp://pc.2ch.net/tech/kako/1021/10217/1021787032.html
8 ttp://pc3.2ch.net/tech/kako/1025/10250/1025010364.html
9 ttp://pc3.2ch.net/tech/kako/1027/10273/1027347982.html
10 ttp://pc3.2ch.net/tech/kako/1029/10293/1029315669.html
11 ttp://pc3.2ch.net/tech/kako/1032/10323/1032345774.html
12 ttp://pc3.2ch.net/tech/kako/1035/10350/1035005882.html
13 ttp://pc3.2ch.net/tech/kako/1038/10380/1038031395.html
14 ttp://pc5.2ch.net/tech/kako/1041/10413/1041328679.html
15 ttp://pc5.2ch.net/tech/kako/1043/10436/1043605481.html
16 ttp://pc5.2ch.net/tech/kako/1045/10457/1045746245.html
17 ttp://pc5.2ch.net/tech/kako/1047/10475/1047560042.html
18 ttp://pc5.2ch.net/tech/kako/1050/10501/1050177746.html
19 ttp://pc5.2ch.net/tech/kako/1052/10526/1052625846.html
20 ttp://pc5.2ch.net/tech/kako/1055/10551/1055162298.html
21 ttp://pc5.2ch.net/tech/kako/1057/10575/1057580107.html
22 ttp://pc5.2ch.net/tech/kako/1060/10603/1060361082.html
23 ttp://pc5.2ch.net/tech/kako/1062/10626/1062690663.html
24 ttp://pc5.2ch.net/tech/kako/1066/10665/1066546387.html
25 ttp://pc5.2ch.net/tech/kako/1067/10679/1067949669.html
26 ttp://pc5.2ch.net/test/read.cgi/tech/1070164402/ (迷子)
27 ttp://pc5.2ch.net/test/read.cgi/tech/1074454641/ (迷子)
28 ttp://pc5.2ch.net/test/read.cgi/tech/1077985164/
29 ttp://pc5.2ch.net/test/read.cgi/tech/1082047479/
30 ttp://pc5.2ch.net/test/read.cgi/tech/1084030770/
0013デフォルトの名無しさん
2007/07/26(木) 00:52:2232 ttp://pc5.2ch.net/test/read.cgi/tech/1088236078/
33 ttp://pc5.2ch.net/test/read.cgi/tech/1090180012/
34 ttp://pc5.2ch.net/test/read.cgi/tech/1092018643/
35 ttp://pc5.2ch.net/test/read.cgi/tech/1093958200/
36 ttp://pc5.2ch.net/test/read.cgi/tech/1096304546/
37 ttp://pc5.2ch.net/test/read.cgi/tech/1098543578/
38 ttp://pc5.2ch.net/test/read.cgi/tech/1101473340/
39 ttp://pc5.2ch.net/test/read.cgi/tech/1106466303/
39(実質40) ttp://pc8.2ch.net/test/read.cgi/tech/1106527792/
40(実質41) ttp://pc8.2ch.net/test/read.cgi/tech/1113408957/
41(実質42) ttp://pc8.2ch.net/test/read.cgi/tech/1120190961/
43 ttp://pc8.2ch.net/test/read.cgi/tech/1124113879/
44 ttp://pc8.2ch.net/test/read.cgi/tech/1128512737/
45 ttp://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/
49 ttp://pc8.2ch.net/test/read.cgi/tech/1146185570/
50 ttp://pc8.2ch.net/test/read.cgi/tech/1149427282/
51 ttp://pc8.2ch.net/test/read.cgi/tech/1153079297/
52 ttp://pc8.2ch.net/test/read.cgi/tech/1156525695/
53 ttp://pc11.2ch.net/test/read.cgi/tech/1159340181/
54 ttp://pc11.2ch.net/test/read.cgi/tech/1162215248/
55 ttp://pc11.2ch.net/test/read.cgi/tech/1164951094
56 ttp://pc11.2ch.net/test/read.cgi/tech/1170343752
今気付いた。このスレ57だね_| ̄|○
0014デフォルトの名無しさん
2007/07/26(木) 00:54:59多すぎ。とりあえずスレタイ C++ で検索して。
以下、スレタイで見付からなさそうな関連スレ。
Boostを語れゴラァ part4
http://pc11.2ch.net/test/read.cgi/tech/1175663346/l50
GCCについて part7
http://pc11.2ch.net/test/read.cgi/tech/1145357824/l50
Cygwin + MinGW + GCC 相談室 Part 3
http://pc11.2ch.net/test/read.cgi/tech/1177944767/l50
0015デフォルトの名無しさん
2007/07/26(木) 01:37:45http://pc11.2ch.net/test/read.cgi/tech/1139266461/
0016デフォルトの名無しさん
2007/07/26(木) 05:49:150017デフォルトの名無しさん
2007/07/26(木) 10:42:40乙
>>15
靴は関係ねぇだろ、靴は!
また↓みたいなことにしたいのか?
http://pc11.2ch.net/test/read.cgi/tech/1139266461/58-76
0018デフォルトの名無しさん
2007/07/26(木) 18:23:15で返す方が多いようですが、そのような方はスレの皆様を混乱させるだけでなく
スレの雰囲気を崩しかねないのでお黙り下さい。
また質問者は回答者に知識を披露する場を与える貴重な存在なので、
質問者を見下した回答、あまりにも儀礼を欠いた回答も厳重に禁止いたします。
忙しい中、少ない時間の合間を縫って質問しに来てるわけですので、
その辺ご承知下さい。なお、当方が質問に対して有意義な答えであると
判断した方には評価いたしますので各自よく調べ、よく考え正確な回答をするように。
0019デフォルトの名無しさん
2007/07/26(木) 18:27:490020デフォルトの名無しさん
2007/07/26(木) 20:43:140021デフォルトの名無しさん
2007/07/26(木) 23:59:54俺は資源は再利用する派だな
0022デフォルトの名無しさん
2007/07/27(金) 06:17:220023デフォルトの名無しさん
2007/07/27(金) 09:43:250024デフォルトの名無しさん
2007/07/27(金) 18:12:47map<string, CHoge *>
みたいにして、文字列で検索をかけたりしたいのですがどうすればいいのでしょうか?
0025デフォルトの名無しさん
2007/07/27(金) 18:19:250026デフォルトの名無しさん
2007/07/27(金) 18:20:110027デフォルトの名無しさん
2007/07/27(金) 18:20:570028デフォルトの名無しさん
2007/07/27(金) 18:27:36☆ ガッ
ヽ■━⊂(・∀・ )
(´・ω・`)
002924
2007/07/27(金) 18:27:51すいません。できました。
*.insert(pair<string, CHoge *>())
のCHogeの名前(ホントは違う名前)が間違ってましたww
ご迷惑おかけしました。
0030デフォルトの名無しさん
2007/07/27(金) 19:05:410031デフォルトの名無しさん
2007/07/27(金) 19:58:51はいw
0032デフォルトの名無しさん
2007/07/28(土) 00:19:520033デフォルトの名無しさん
2007/07/28(土) 00:23:490034デフォルトの名無しさん
2007/07/28(土) 00:46:070035デフォルトの名無しさん
2007/07/28(土) 01:21:06ポインタとは違う実装というのは具体的にどんなものがあるの?
0036デフォルトの名無しさん
2007/07/28(土) 07:50:55最適化の結果、(関数のインライン化などで)差がつくこともしばしば。
0037デフォルトの名無しさん
2007/07/28(土) 10:23:56main() {
vector<int> vec;
int v[3] = {0, 1, 2};
vec.resize(3);
// コピー
}
上のソースで、v[3]のデータをvecに入れたい、
(勿論、vec[0] : 0 vec[1] : 1 vec[2] : 2のように)
のですが、一発で入れる方法無いですか?
やはり、for等でvec[loop] = v[loop]にするか、イテレータ使うしかないのでしょうか?
よろしくお願いします。
0038デフォルトの名無しさん
2007/07/28(土) 10:30:41int v[] = {0, 1, 2,};
std::vector<int> vec(v, v + sizeof(v) / sizeof(* v));
じゃいかんの?
0039デフォルトの名無しさん
2007/07/28(土) 10:34:370040デフォルトの名無しさん
2007/07/28(土) 10:43:240041デフォルトの名無しさん
2007/07/28(土) 10:50:19レスありがとうございます。
書き忘れましたが、std::vector<int> vec;は別のところで宣言しているため
>>38さんのやり方では無理でした・・・すいません。
なので、copyについてググってたら答えが、、
>>40さんありがとうございます。
sizeof vとかっていう()の無い使い方初めて見たのですが、sizeof()と同じですか?
0042デフォルトの名無しさん
2007/07/28(土) 10:52:37つけたければつけていいけど。
0043デフォルトの名無しさん
2007/07/28(土) 10:53:35対象が型名でないsizeofは括弧を必要とはしていない。
0044デフォルトの名無しさん
2007/07/28(土) 10:54:42そうだったんですか。。勉強不足でした。ありがとうございます。
0045デフォルトの名無しさん
2007/07/28(土) 11:04:360046デフォルトの名無しさん
2007/07/28(土) 11:16:34vectorにassign()というのも用意されてたんですね、、
ありがとうございます。
0047デフォルトの名無しさん
2007/07/28(土) 11:27:52gcc4.1とvc8sp1両方ともこれが通って
&str is NULLが出力されます。
#include <iostream>
#include <string>
void func(std::string& str)
{
if(&str == NULL)
{
std::cout << "&str is NULL" << std::endl;
}
}
main()
{
std::string *str = NULL;
func(*str);
}
0048デフォルトの名無しさん
2007/07/28(土) 11:28:13未定義動作。
0049デフォルトの名無しさん
2007/07/28(土) 11:37:28ありがとうございます。
具体的にどの部分が未定義動作になりますか?
1, *str (NULLの参照外し)
2, 参照型にNULLアドレスの実体が渡る事
3, funcのif条件で&strとして参照型のアドレスを見に行った事
1と2で合ってますか?
そもそも1が未定義なので2は起こる事はあり得ないはずという認識の方がいいんでしょうか?
0050デフォルトの名無しさん
2007/07/28(土) 11:44:59例えば main 内で &*str がヌルポインタになるのは well-defined 。
だから、未定義なのは 2 と 3 。
0051デフォルトの名無しさん
2007/07/28(土) 11:45:490052デフォルトの名無しさん
2007/07/28(土) 12:16:54それって↓ここにある話だよね?
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#232
現行の規格では 1 も未定義動作と読めるから、ダメだと考えておいた
ほうがいいんじゃない?
0053デフォルトの名無しさん
2007/07/28(土) 12:22:51D3DVECTOR(Cバージョン。float x,y,zのみ)
D3DXVECTOR3(C++バージョン。上記にメンバ関数が付いた)
後者を引数として受け取る関数
func( D3DXVECTOR3 &v )
に前者D3DVECTORを渡そうとしているのですが、型が違うという
エラーがでるので、func( (D3DXVECTOR3)v )とキャストしています。
問題なく動いているのですが、こういうキャストって文法的に問題無い
のでしょうか?なんとなく違和感があって
func( *((D3DXVECTOR3*)&v) )
こっちに直そうかと思っているのですが…
0054デフォルトの名無しさん
2007/07/28(土) 12:32:14func( (D3DXVECTOR3)hoge );
とするとちゃんとエラーが出ますね。ということはコンパイラが
ちゃんとそこまで判断して通してくれているのでやはり合法
なのかな?
0055デフォルトの名無しさん
2007/07/28(土) 12:32:50あら、そうだったんだ。すまん。
0056デフォルトの名無しさん
2007/07/28(土) 12:38:55http://msdn2.microsoft.com/en-us/library/ms887536.aspx
D3DXVECTOR3 は D3DVECTOR からの変換コンストラクタを持っているので
(D3DXVECTOR3)v が static_cast 相当の働きになり、一時オブジェクトが作られる。
ただし標準では一時オブジェクトを非 const 参照には渡せないので、
func() の呼び出しがエラーになるはず。 VC 系は最新でも通るんだっけ?
>>54
メンバ変数が同じかどうかは関係ない。
0057デフォルトの名無しさん
2007/07/28(土) 13:06:23>>56
とりあえずVC7.1で試してみた感じだと、
「組み込み型では通らないけどユーザー定義型なら通る」っぽい。
0058デフォルトの名無しさん
2007/07/28(土) 13:55:59なるほど、やぱり駄目な書き方なのですね。私も最初エラーになると
思ったのですが、動いてしまったのでむしろ驚きました。
ちなみにこちらは.NET2003です。
>メンバ変数が異なるクラスは駄目
ここら辺はVCの独自拡張なのかな?
とりあえず以下の書き方に直します。
func( *((D3DXVECTOR3*)&v) );
0059デフォルトの名無しさん
2007/07/28(土) 16:40:050060デフォルトの名無しさん
2007/07/28(土) 16:44:32それが説明できるくらいなら誤読しないだろ。
0061デフォルトの名無しさん
2007/07/28(土) 17:33:43文法的に問題ないということでしょうか?
func()の引数にconst付ければ問題ないということです?
0062デフォルトの名無しさん
2007/07/28(土) 20:54:100063デフォルトの名無しさん
2007/07/28(土) 21:19:580064デフォルトの名無しさん
2007/07/28(土) 22:00:170065デフォルトの名無しさん
2007/07/28(土) 22:03:480066デフォルトの名無しさん
2007/07/28(土) 22:17:25どんなとき?
0067デフォルトの名無しさん
2007/07/28(土) 22:19:42ヘ、 ヽ _..≧=ヽ|Y〃/∠._ / }
\ ,′ \ >ヘ´ | / '⌒≦ / ノ
ヽ. /// `X < く V
!. \ / , / / | j{ /ヽ ) だ I
!. /〃/ / / , 〃|l U \ ヽ `) さ P
/ {/ / / / / || |l } lヽ 丶 < い で
‐- . / { / 〃,′{ { |l jl | |ハ ヽ} ヽ ! や
_ ヽ、 { ハ{ { {/´≧x x≦ヽハ\ ヽ〈 ノ、 っ
 ̄ ≧‐-{;;;\ヽ{ {:::{.j {.j::} }|lヽ \ ハヽ=≦ヽ て
/ `八;;;;;;;;....|xx`~ _'_ `~xxjハヽ;;;;;;;;;;}ハ }
-‐ァ'//´ ヽ:;;;;...{ヘ、 ( j ノ ハl|;;;;;;;ハ  ̄ ノ /
-/ // , \/⌒≧ーr---ァ≦'⌒ヽノ}|};;;/ハ /⌒Y⌒ヽ{
7/ / / 〉\ }ノ'⌒ヽ // | リノ \
{ / ノ厂 {{ }'⌒ヽ⌒ヽL_ \ \!
j/ / f´/ ノ>ァ‐1 j| l ) \ j
ハ / �W 〃/ `ーく{ |{ \ \,'
ハ / / l{ / イ ー==- \\ �Y ヽ \ /\
× / ノ // | \ヽ \ ヽ \ イ
0068デフォルトの名無しさん
2007/07/28(土) 22:27:570069デフォルトの名無しさん
2007/07/28(土) 22:29:49好きなものは好きと言える気持ち抱きしめてたいとき
0070デフォルトの名無しさん
2007/07/28(土) 22:37:43俺の胸に飛び込んで来い
0071デフォルトの名無しさん
2007/07/28(土) 23:01:580072名無しさん@そうだ選挙に行こう
2007/07/29(日) 14:36:280073名無しさん@そうだ選挙に行こう
2007/07/29(日) 16:18:36class C {
public:
int hoge;
};
class B {
C *c;
public:
B() : c(NULL) {}
virtual ~B() { if (c != NULL) { delete c; c = NULL; } }
void init() { c = new C; c->hoge = 4545; }
int Get() { return c->hoge; }
};
class A {
B b;
public:
B Get() { return b; }
void init() { b.init(); }
void print() { printf("%d\n", b.Get()); }
};
int main() {
A *a = new A;
a->init();
B b = a->Get();
printf("%d\n", b.Get());
a->print();
delete a;
return 0; }
このソースなんですが、Bクラスのデストラクタが2回呼ばれてエラーを吐きます。
私的には、delete a;した時に1回だけ呼ばれてほしいのですが、どうすればいいのでしょうか?
分かる方お願いします。
0074名無しさん@そうだ選挙に行こう
2007/07/29(日) 16:35:390075名無しさん@そうだ選挙に行こう
2007/07/29(日) 16:43:15エラーも吐かずに普通に実行できてしまった。
再現方法は?
0076名無しさん@そうだ選挙に行こう
2007/07/29(日) 16:46:38↑これをポインタで受け取れば?
0077名無しさん@そうだ選挙に行こう
2007/07/29(日) 16:48:41>>74
ちょっと調べてみます。
>>75
試しに、Releaseビルドで実行したら普通に実行できました・・・。
Debugビルドだとエラー吐きます・・・
一応環境は、VS2005 pro です。
>>76
ポインタで受け取ってみたらエラー吐かずに実行できました。
どういう事なんでしょうか??
0078名無しさん@そうだ選挙に行こう
2007/07/29(日) 16:51:320079名無しさん@そうだ選挙に行こう
2007/07/29(日) 16:53:22#delete aと、B bがdeleteされるとき
メンバーポインタはけっこう難しいので、最初は使わないほうがよろしいかと。
boost::shared_ptrがお勧め
008079
2007/07/29(日) 16:57:41あと、RAIIを調べると幸せになれるかも。
0081名無しさん@そうだ選挙に行こう
2007/07/29(日) 17:01:31B Get() {return b;}
これだとここでコピーが行われて新しくメモリ作られるよ
ポインタで返すようにして
B* Get() { return &b; }
こうやってポインタで受け取るべき
B* b = a->Get();
0082名無しさん@そうだ選挙に行こう
2007/07/29(日) 17:01:59返事ありがとうございます。
boost::shared_ptrですか、、聞いたこと無いな、、
ググってきます。
アドバイスなどありがとうございます。
参考にさせていただきます。
0083名無しさん@そうだ選挙に行こう
2007/07/29(日) 17:03:58>B Get() {return b;}
>これだとここでコピーが行われて新しくメモリ作られるよ
あっ、そういうことですか。
難しいですね、、
ありがとうございます。
0084名無しさん@そうだ選挙に行こう
2007/07/29(日) 17:11:24>難しいですね、、
だから、>78。
そもそも、なんでnew/deleteを使うのか理解している?
#Javaじゃあるまいし、new/delete[]と違ってnew/deleteの必然性なんてそんなにないだろうに。
0085名無しさん@そうだ選挙に行こう
2007/07/29(日) 17:14:370086名無しさん@そうだ選挙に行こう
2007/07/29(日) 17:22:240087えいいち ◆GRGSIBERIA
2007/07/29(日) 17:22:56char name[20];
char *p;
int j = 0;
cin >> name;
p = name;
if(*p == 'a'){
j = 1;
}
p++;
if(*p == 'b'){
j = 1;
}
if(j == 1){
cout << "成功\n";
}else{
cout << "失敗\n";
}
return 0;
のように書くと、コマンドの文字数や種類が増えるにつれて何行もif文に費やされることになってしまいます。
簡略化できる方法を教えてください。
0088名無しさん@そうだ選挙に行こう
2007/07/29(日) 17:24:33コピーされては困るクラスでは代入演算子やコピーコンストラクタをprivateにしよう。
class B {
C *c;
public:
略
private:
B(const B&);//禁止
const B&operator=(const B&);//禁止
};
詳しくはEffective C++でも読んでくれ。
0089名無しさん@そうだ選挙に行こう
2007/07/29(日) 17:26:530090名無しさん@そうだ選挙に行こう
2007/07/29(日) 17:27:26多重分岐→データテーブル→データファイル化
0091えいいち ◆GRGSIBERIA
2007/07/29(日) 17:28:17if(*p == 'b'){
j = 1;
}
↓
if(*p != 'b'){
j = 0;
}
009279
2007/07/29(日) 17:29:45new/deleteで問題なのは所有者がはっきりしないことなので、そこに注意していればいい。
何だかんだ言って、boost::shared_ptr使うのが良いけどね。
0093名無しさん@そうだ選挙に行こう
2007/07/29(日) 17:31:47つ Commandパターン
0094名無しさん@そうだ選挙に行こう
2007/07/29(日) 17:41:24STLだけでやりたい漏れはいらないや。。
0096名無しさん@そうだ選挙に行こう
2007/07/29(日) 17:50:080097名無しさん@そうだ選挙に行こう
2007/07/29(日) 17:56:30std::tr1::shared_ptr
0098名無しさん@そうだ選挙に行こう
2007/07/29(日) 18:04:17ライセンス制限ないんだから素直にboost使えばいいんじゃね?とは思うけど。
0099名無しさん@そうだ選挙に行こう
2007/07/29(日) 18:05:020100名無しさん@そうだ選挙に行こう
2007/07/29(日) 18:48:13インクルードパスを通しておくだけ。
0101デフォルトの名無しさん
2007/07/29(日) 18:57:05hash_set<string> h;
string s = "Hoge";
h.insert(s);
stringじゃないものを指定した場合にはinsertではエラーが出ないんですが、stringだと出てしまいます。
コンパイラはg++を使っています。
原因は何でしょうか?また、対応策はあるのでしょうか?わかる方がお願いします。
0102名無しさん@そうだ選挙に行こう
2007/07/29(日) 19:20:21エラーメッセージは?
0103名無しさん@そうだ選挙に行こう
2007/07/29(日) 19:31:220104名無しさん@そうだ選挙に行こう
2007/07/29(日) 19:39:550105名無しさん@そうだ選挙に行こう
2007/07/29(日) 19:41:45>原因は何でしょうか?
ext/hash_fun.hに template <> struct hash<std::string> が定義されてないから
>対応策はあるのでしょうか?
たぶんこんなんで良いと思う
#include <string>
#include <ext/hash_set>
struct string_hash
{
size_t operator () (const std::string &p) const
{
return __gnu_cxx::hash <const char *> () (p.c_str ());
}
};
int main ()
{
__gnu_cxx::hash_set <std::string, string_hash> h;
std::string s = "Hoge";
h.insert(s);
}
0106名無しさん@そうだ選挙に行こう
2007/07/29(日) 19:46:06じゃ今後ともどんなプログラムも頑張って標準関数だけで書いていって下さい
0107105
2007/07/29(日) 19:49:470108名無しさん@そうだ選挙に行こう
2007/07/29(日) 19:59:100109名無しさん@そうだ選挙に行こう
2007/07/29(日) 20:09:15唯一の静的汎用クラスを作ろうとしてこうしたんだけど、
こういう書き方普通?一応うまくいってますが
//test.h
#include <windows.h>
class CTest{
friend CTest* test();
CTest(){}
char *c; //実質静的メンバ変数(ソースで初期化する必要なし!)
public:
void f1(){c="f1";MessageBox(0,c,0,0);}
void f2(){c="f2";MessageBox(0,c,0,0);}
void f3(){c="f3";MessageBox(0,c,0,0);}
};
static CTest* test(){ //ここからのみアクセスできる
static CTest inst;
return &inst;
}
//main.cpp
#include "test.h"
int main(){
test()->f1();
test()->f2();
test()->f3();
}
0110名無しさん@そうだ選挙に行こう
2007/07/29(日) 20:13:23なるべく参照を使っているのですが、
戻り値に参照を使っているときに関数が失敗したときに
NULLは返せません。この場合どうすればいい?
exit(0)で強制終了するとか駄目だし・・・
0111名無しさん@そうだ選挙に行こう
2007/07/29(日) 20:13:450112名無しさん@そうだ選挙に行こう
2007/07/29(日) 20:14:282つのソースから include して使ってみろ。うまくいかない。
0113名無しさん@そうだ選挙に行こう
2007/07/29(日) 20:16:26> static CTest* test(){
このstaticは余計なんじゃねーの
0114名無しさん@そうだ選挙に行こう
2007/07/29(日) 20:16:37ポインタが遅いから参照ってのが大間違い。そんなの信じてるようじゃ
「いろいろ駄目」ってのも疑わしい。ヌル返したいなら素直にポインタ使え。
本当に参照が適切なら、失敗を例外で伝えるという手もある。
0115名無しさん@そうだ選挙に行こう
2007/07/29(日) 20:19:56一番早い書き方は?
0116名無しさん@そうだ選挙に行こう
2007/07/29(日) 20:20:38Boost Consultingにインストーラあったと思ったが
0117名無しさん@そうだ選挙に行こう
2007/07/29(日) 20:21:47エイリアスが無いと判断しにくいから最適化しにくいとかそういう話?
0118デフォルトの名無しさん
2007/07/29(日) 20:26:48コンストラクタがprivateなのにどうやってインスタンス化しろっての。
0119デフォルトの名無しさん
2007/07/29(日) 20:38:07一昔前ならLoki::Singletonをお勧めしていたところだけど……
boostにSingletonあったっけ?
0120デフォルトの名無しさん
2007/07/29(日) 20:40:120121デフォルトの名無しさん
2007/07/29(日) 20:41:020122デフォルトの名無しさん
2007/07/29(日) 20:41:20/| \ / |\
/ | / | \ Nentansoft
| /\/ ^o^ /\/|
|/\/ /\/ | J i n s e i O w a t a o 2 0 0 5
\ | / | /
\|__/ \__|/
0123デフォルトの名無しさん
2007/07/29(日) 20:42:09それ static 関係ない。 friend が指定してある。
あれ? friend に内部リンケージの関数って不味くないか?
0124デフォルトの名無しさん
2007/07/29(日) 20:47:46CTestのinstが存在することにならね?
0125デフォルトの名無しさん
2007/07/29(日) 20:52:14ttp://boost.cppll.jp/HEAD/libs/pool/doc/implementation/singleton.html
0126デフォルトの名無しさん
2007/07/29(日) 21:27:24テンプレートクラスなら普通にstaticなメンバ変数をヘッダ内に書ける(ODRに違反せずに「定義」できる)んじゃ無かったっけ?
それなら前にやったことがあるけど。
っていうかこれってどうやってるんだろう。やっぱリンカががんばってるんだろうか。
テンプレートじゃなきゃ、別にヘッダだけで収めようとしたことはないなぁ。
0127デフォルトの名無しさん
2007/07/29(日) 22:16:170128デフォルトの名無しさん
2007/07/30(月) 00:34:51いや、便利ライブラリが嫌いなんじゃなくって
STL以外だと会社にもってって使えないいんよね。
便利なパーツは単体で、尚且つインクルード/コピペするだけで
リンカの設定弄らなくてもさくっとコンパイルできるのがいい。
ソース管理されてる環境だとプロジェクトファイルすら弄れないしね。。
0129デフォルトの名無しさん
2007/07/30(月) 00:39:49同意
0130デフォルトの名無しさん
2007/07/30(月) 00:45:12「あいうえお」と書いた外部ファイルを読み込んで1文字画面に出力するという操作を実装しようとしたら文字化けしてしまいました。
理由は文字コードが0x82A0なのに対し0x82までしか読み込んでなかったからみたいなのですが、
FILE* fp;
wint_t ch;
TCHAR s;
if( fopen_s(&fp, "word.dat", "r") )
{
MessageBox(NULL, TEXT("ファイルオープンに失敗"), NULL, MB_OK | MB_ICONSTOP);
exit(-1);
}
for(ch=fgetwc(fp); ch!=EOF; ch=fgetc(fp))
{
wsprintf(&s, TEXT("%d"), ch);
MessageBox(NULL, &s, NULL, MB_OK);
}
fclose(fp);
これだと1バイト分しか読み込まないのでしょうか?
また、2バイト読み込むにはどうしたらいいのでしょうか?
使ってる環境は、
WindowsXP Home Edition
VC++2005 Express Edition
です。
0131デフォルトの名無しさん
2007/07/30(月) 00:45:530132デフォルトの名無しさん
2007/07/30(月) 00:50:28>リンカの設定弄らなくてもさくっとコンパイルできるのがいい。
Boostは大概インクルードだけで使えるけど……
0133デフォルトの名無しさん
2007/07/30(月) 00:53:040134130
2007/07/30(月) 00:56:53できませんでした。
wint_tも2バイト変数なのでfgetwcで2バイト読み込んでないということだと思うのですが、
fgetwcでは2バイト読み込むことは出来ないのでしょうか?
0135デフォルトの名無しさん
2007/07/30(月) 01:00:43C言語の上にバグ持ちのVC++8.0か
環境依存スレ向きの話題じゃないのか
0136デフォルトの名無しさん
2007/07/30(月) 01:08:11wsprintf(&s, TEXT("%d"), ch);
TCHARってコンパイルの環境によって定義かわらない?
0137デフォルトの名無しさん
2007/07/30(月) 01:11:05fgetwc()とfgetc()を混ぜこぜにしてるし
> TCHAR s;
> wsprintf(&s, ...
って何だそら
ムチャクチャだ
0138デフォルトの名無しさん
2007/07/30(月) 01:14:30まともに動かん
VC++8.0の場合はバグのせいで、どっちみちw系のコンソール入出力が
腐るので諦めろ
0139デフォルトの名無しさん
2007/07/30(月) 01:17:31TCHAR WCHARとかじゃなく
明示的にchar wchar_tとか書いてもだめなん?
0140デフォルトの名無しさん
2007/07/30(月) 01:19:180141デフォルトの名無しさん
2007/07/30(月) 01:20:09有名な話だよ。SP1でも直ってない。
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=250724&SiteID=7
参照。
0142デフォルトの名無しさん
2007/07/30(月) 01:23:53Cにはimbueも糞も無いんだが。
以下のコードがVC8.0では期待したように動かない。
#include <stdio.h>
#include <wchar.h>
#include <locale.h>
int main(void)
{
wint_t c;
setlocale(LC_CTYPE, "");
while ((c = getwchar()) != WEOF)
putwchar(c);
return 0;
}
0143デフォルトの名無しさん
2007/07/30(月) 01:25:08MSだせーな
BCC32マンセーしててしらんかったわw
0144130
2007/07/30(月) 01:38:26VC++8.0にはバグがあったんですね…
bccでコンパイルしてみることにします。
0145デフォルトの名無しさん
2007/07/30(月) 01:39:52ざっくり見直してみたけどこれでどうよ?
FILE* fp;
wint_t ch;
wchar_t s[32]; //10進数の文字表現を格納する?
if( fopen(&fp, "word.dat", "r") )
{
MessageBoxW(NULL, L"ファイルオープンに失敗", NULL, MB_OK | MB_ICONSTOP);
exit(-1);
}
for(ch=fgetwc(fp); ch!=EOF; ch=fgetwc(fp))
{
wsprintf(s, L"%d", ch);
MessageBoxW(NULL, s, NULL, MB_OK);
}
fclose(fp);
0146デフォルトの名無しさん
2007/07/30(月) 01:41:26WEOFにしないと無限ループ
0147145
2007/07/30(月) 01:42:180148130
2007/07/30(月) 02:07:48このソースでも文字コードが0x82と0xA0いうふうに分かれて表示されてしまいました
やはりBCCを使ったほうがいいということなのでしょうか…
0149デフォルトの名無しさん
2007/07/30(月) 02:09:19fopen/fcloseじゃなくて、wfopen/wfcloseじゃないとだめとかある?
0150デフォルトの名無しさん
2007/07/30(月) 02:09:55setlocale(LC_CTYPE, "");
をプログラムのドアタマで実行汁。
0151デフォルトの名無しさん
2007/07/30(月) 02:10:37関係ねー
それらはUTF-16なパス名でストリームを開く、というだけだ
0152130
2007/07/30(月) 02:30:11出来ました!
ロケールというものを設定しないといけなかったんですね!
ロケールについて調べてみたらよくわからなかったんですが、
ロケールとはパソコンの情報の表示形式みたいなものと考えていいのでしょうか?
0153デフォルトの名無しさん
2007/07/30(月) 02:37:35ロケールは貨幣や数値、時刻の形式なども扱うが、この場合は
LC_CTYPEというカテゴリを指定してやることで、
文字エンコーディング(SJISだのEUC-JPだの)をCランタイムに
教えてやっている。「""」は、「実行環境に応じて良きにはからえ」という
意味だ。Cランタイムはそれに応じてワイド文字とマルチバイト文字の
変換を行う。
0154130
2007/07/30(月) 03:02:24なるほど、だからロケールを設定してないときの読み込み方がおかしかったんですね
わかりやすく教えていただきありがとうございました!
0155デフォルトの名無しさん
2007/07/30(月) 08:17:11具体的には次のようなことをやりたいのですが…
template<typename T>
struct PtrWrapper { T* p; };
class A {...};
class B : public A {...};
PtrWrapper<A> a;
PtrWrapper<B> b;
a = b; // 可能
b = a; // 不可能
0156デフォルトの名無しさん
2007/07/30(月) 11:44:19class Conversion
{
typedef char Small;
class Big { char dummy[2]; };
static Small Test(U);
static Big Test(...);
static T MakeT();
public:
enum { exists = sizeof(Test(MakeT())) == sizeof(Small) };
};
int main() {
using namespace std;
cout
<< Conversion<double, int>::exists << endl
<< Conversion<char, char*>::exists << endl
<< Conversion<size_t, vector<int> >::exists << endl
<< Conversion<A*, B*>::exists << endl
<< Conversion<B*, A*>::exists << endl;
}
詳しくは Modern C++ Design 参照。
0157デフォルトの名無しさん
2007/07/30(月) 16:10:51追加したコンテンツをドラッグ&ドロップで移動できるのですが、
そのUIを、WinXPSP2上のVS2005 C++ Windowsフォームにて実装してみたくて調査中なのですが、
技術的に停滞中です。
フォームにPanelを配置し、そのパネルをドラッグ&ドロップすればよいのかと思うのですが、
パネルのドラッグ&ドロップが出来ません。。
何かサンプルありませんか?
0158デフォルトの名無しさん
2007/07/30(月) 16:26:330159デフォルトの名無しさん
2007/07/30(月) 17:46:58COleDropTargetですか。ちょっとみてみましたが、
楽チンポンとは行かないみたいですね。
ちょっと勉強にいそしみます。
0160デフォルトの名無しさん
2007/07/31(火) 00:30:10ありがとう!
ていうか解説読んで感動しました…
0161デフォルトの名無しさん
2007/07/31(火) 09:22:22どうせ中では同じようなことをやってるはずだけど、使えるなら Boost TypeTraits を使うのが楽。この場合は is_convertible
0162デフォルトの名無しさん
2007/08/01(水) 05:03:00対応する placement new の実行中に例外が発生した場合に呼ばれるからという
ただそれだけのために存在する、という認識で問題ありませんか?
0163デフォルトの名無しさん
2007/08/01(水) 06:18:290164デフォルトの名無しさん
2007/08/01(水) 06:24:12と定義して
struct s s_obj();
としてもコンストラクタが呼ばれないんですが、
俺何か間違ってるんでしょうか?
0165デフォルトの名無しさん
2007/08/01(水) 06:31:420166デフォルトの名無しさん
2007/08/01(水) 11:23:21もっとも、s s_obj; で十分だが。
0167デフォルトの名無しさん
2007/08/01(水) 12:24:54どうせ君は使わないだろうから問題ないよ。
人と話すときにはその話題避けてればいいんだし。
0168デフォルトの名無しさん
2007/08/01(水) 12:32:58違う。正しくは
対応する placement new が成功した後のコンストラクタで例外が発生した場合に以下同文。
0169デフォルトの名無しさん
2007/08/01(水) 13:11:18new-expression:
::(opt) new new-placement(opt) new-type-id new-initializer(opt)
new-placement:
( expression-list )
と書いてあって、new-placement ってのはあらゆる引数リストを指す要素のようだけど、
引数つきの new は何でも placement new と呼ぶのか?
0170デフォルトの名無しさん
2007/08/01(水) 13:13:10最初に想定されたのが配置に関する制御だったので、
placement newと名付けられたが、
使ってみたら色々使い道があったというわけ。
0171デフォルトの名無しさん
2007/08/01(水) 13:17:43っつーことは、「いつもの placement delete」 には特に呼ぶ価値ないけど、
それ以外の placement delete には十分価値があるかもしれんっつーことか。
0172デフォルトの名無しさん
2007/08/01(水) 21:46:240173デフォルトの名無しさん
2007/08/01(水) 21:53:000174デフォルトの名無しさん
2007/08/01(水) 22:31:34{
AnsiString Value;
TRegistry *Reg = new TRegistry();
Reg->RootKey = RootKey;
if(Reg->OpenKey(Key,false)){
if(Reg->ValueExists(Name))
Value = Reg->ReadString(Name);
Reg->CloseKey();
}
Reg->Free();
return Value;
}
0175デフォルトの名無しさん
2007/08/02(木) 00:53:060176174
2007/08/02(木) 00:57:40↓続き
関連する項目をググって、上記ソースを見つけたのは良いのですが、
得た値"Value"をstrcpy(a,b)のbで使おうとすると、
AnsiString型からキャストできず、エラーとなります。
AnsiString型をキャストすること自体がよろしくないようなのですが、
キャストか、他に良い方法がありましたら教えてください。
長文すみません。よろしくお願いします
0177デフォルトの名無しさん
2007/08/02(木) 01:01:430178デフォルトの名無しさん
2007/08/02(木) 01:13:55Value.c_str()でやれということ
0180デフォルトの名無しさん
2007/08/02(木) 22:26:11どうすればいいでしょうか?
0181デフォルトの名無しさん
2007/08/02(木) 22:29:12Win32APIのQueryPerformanceFrequencyは?
0182デフォルトの名無しさん
2007/08/02(木) 22:32:00しかしモバイル用CPUとか動的にクロックが変化するCPUだとちょっと困る
0183デフォルトの名無しさん
2007/08/02(木) 22:42:28もしかして不可能?
0184デフォルトの名無しさん
2007/08/02(木) 22:45:000185デフォルトの名無しさん
2007/08/02(木) 22:46:46レジスタに信用なら無いモデルナンバーが返って来る
メーカーの資料と照らし合わせる
周波数を知る
0186デフォルトの名無しさん
2007/08/02(木) 22:51:170187デフォルトの名無しさん
2007/08/02(木) 22:56:08だから>>181でFA
0188デフォルトの名無しさん
2007/08/02(木) 23:08:53ああ、その方法もありますね。しんどいけど。
どこかに cpuid --> cpu clock 変換表みたいなのありませんか?
クロック自体はrdtscで読めるんですが、
最近のCPUは省電力モードとかで
クロック自体が落ちてることもあって
正確なクロックが取得できないんです
0189デフォルトの名無しさん
2007/08/02(木) 23:15:320190デフォルトの名無しさん
2007/08/02(木) 23:24:100191デフォルトの名無しさん
2007/08/02(木) 23:40:090192デフォルトの名無しさん
2007/08/03(金) 16:33:06C++ だと 9.2p8 を見る限り対応されてなさそうな雰囲気を感じる。
これは、非静的メンバ配列変数のサイズは必ず指定する必要があるという記述だから
ここだけじゃ実際のところはっきりとは分からんけど。
でも、次期 C++ ドラフトを見るとこの記述が削られてる。
これは C99 と同様に可変長のメンバ配列変数に対応された現れだと見ているけど、
そのことが書いてある箇所が見つからない。
C++ での可変長のメンバ配列変数への対応具合の状況はどんな感じなんじゃろか。
0193デフォルトの名無しさん
2007/08/03(金) 20:55:470194デフォルトの名無しさん
2007/08/03(金) 21:23:30でも、本気でそれでも問題ないと思うんだよな。
正直可変長メンバってどのくらい意味があるのか分かんないな。
Windows API とか可変長メンバを要求するところがあるから
しゃーなしで使わんといかんこともあるんだが。
0195デフォルトの名無しさん
2007/08/03(金) 21:33:07なるから、そのままファイルに読み書きしたりできて便利な場合もあるでそ
0196デフォルトの名無しさん
2007/08/03(金) 22:04:00vectorやstringのサイズ増加時にコピーが走りまくって参った。
0197デフォルトの名無しさん
2007/08/03(金) 22:16:19そういうハナシじゃない?
0198デフォルトの名無しさん
2007/08/03(金) 22:19:340199デフォルトの名無しさん
2007/08/03(金) 22:25:23書き込みは一発だけど、
読み込む時は一旦サイズを読み出さないといかんのだよな。
状況によってサイズが分かる場合もあるけどさ。
そこまでの利点には思えんのよなあ。
昔だとその僅かな差も重要だったんだろうか。
0200デフォルトの名無しさん
2007/08/03(金) 22:27:52<cstdlib>のreallocも、その場で拡張できなければ、
新しい領域を確保して、そこへ元の記憶域の内容をコピーすることになっている。
クラスインスタンス相手にコピーコンストラクタを使わず複写なんて
やるわけには行かないから、アロケータにrealloc相当の操作がないのも妥当な判断。
仮にやるとしたら、その場で拡張できるときだけ成功するrealloc操作
なんてことになるんだろうな。
0201デフォルトの名無しさん
2007/08/03(金) 22:33:47malloc()/free()一発で確保・解放できるのも「Cでは」便利
で、特にデメリットも無いわけで
まあ可変長に出来るのは最後のメンバだけ、という制限があるけどな
ま、基本的に言語サポートが貧弱なCで特に生きるテクニックという気がする
0202デフォルトの名無しさん
2007/08/03(金) 22:35:49その後にちゃんとコピーコンストラクタを placement new で呼べば一応正常に動作する。
問題は二度手間になることと、
realloc による管理は C++ っぽくないってところだな。
0203デフォルトの名無しさん
2007/08/03(金) 22:36:31パフォーマンスに関わるんで結局手書きしちゃったよ
無駄にT()でfillするし・・・
0204デフォルトの名無しさん
2007/08/03(金) 22:37:30どっちゃにしろ動的に確保する場合は
確かに一発で済むから便利か。なるほど。
0205デフォルトの名無しさん
2007/08/03(金) 22:40:24例えば倍々に増やしていったりする実装の存在なんかを考えれば、
やっぱりコンテナがrealloc相当のことをやっているんだよなと思う。
0206デフォルトの名無しさん
2007/08/03(金) 22:42:15Stroustrupが説明してた気がするが、忘れた
0207デフォルトの名無しさん
2007/08/03(金) 22:45:500208デフォルトの名無しさん
2007/08/03(金) 22:49:310209デフォルトの名無しさん
2007/08/05(日) 02:02:59中で特別な関数以外の関数呼んだら未定義とか規格に書いてるんだけど。
0210デフォルトの名無しさん
2007/08/05(日) 02:04:270211デフォルトの名無しさん
2007/08/05(日) 02:04:590212デフォルトの名無しさん
2007/08/05(日) 02:05:320213デフォルトの名無しさん
2007/08/05(日) 02:09:07sigaction()を使うべき
Windowsのコンパイラが提供するsignal()は、規格を満たすためだけの紛い物で
何の役にも立たない
つまりsignal()なんて要らない子
0214デフォルトの名無しさん
2007/08/05(日) 02:10:340215デフォルトの名無しさん
2007/08/05(日) 02:11:280216デフォルトの名無しさん
2007/08/05(日) 02:14:570217デフォルトの名無しさん
2007/08/05(日) 02:15:530218デフォルトの名無しさん
2007/08/05(日) 02:17:24スレッドと相性が非常に悪いし
それでなくとも
シグナルハンドラが再インストールされるかどうかとか
システムコールが再送されるかどうかとか
シグナルハンドラ内であれをやってよいこれはよくないとか
バッドノウハウのすくつやん
0219デフォルトの名無しさん
2007/08/05(日) 02:23:03posixもM$がサーバ戦略に本腰いれて慌てて始めたもんだしなあ
0220デフォルトの名無しさん
2007/08/05(日) 03:22:10main で全ての例外補足してから異常終了した方が
ローカル変数のデストラクタが呼ばれていいと思うんだけど。
0221デフォルトの名無しさん
2007/08/05(日) 03:24:59例外処理中に例外が出たとか
0222デフォルトの名無しさん
2007/08/05(日) 03:27:032行目以降の意味がわからん。 set_terminate() 関係ないだろ。
0223デフォルトの名無しさん
2007/08/05(日) 03:36:23ああ、二重例外に対応する場合か。なるほど。
0224デフォルトの名無しさん
2007/08/05(日) 12:41:24捕らえたいんだけど、
try{}
catch( ... ){}
この構文では捕えられないんだけど、どうしたらいい?
0225デフォルトの名無しさん
2007/08/05(日) 12:44:090226デフォルトの名無しさん
2007/08/05(日) 12:54:51でもデフォルトから変更した場合、
ミドルウェアとか依存するライブラリ絡みの整合性が心配だな。
0227デフォルトの名無しさん
2007/08/05(日) 15:14:37まあC++の範疇じゃないな。
0228デフォルトの名無しさん
2007/08/06(月) 06:55:480229デフォルトの名無しさん
2007/08/06(月) 18:19:11いずれにせよVC++くらいしか使えるものがないというのに変わりはないけどな。
0230デフォルトの名無しさん
2007/08/06(月) 21:25:46スレ違いだったらすいません。
アプリ開発の依頼スレが見つからなかったのでこちらに書かせて頂きました。
当方所有のウェブアプリケーションソフト
(以前プログラマに依頼して作ってもらったものですが今は連絡が取れません)
がURL先の変更?で突然使えなくなってしまいました。
そこで、緊急で本日中に改変が出来そうな方是非お願いできないでしょうか?
当方、全くの知識不足で言語が C++ということ以外分かりません。
ソースファイルは持っております。料金は2万円でお願いします!
[email protected]
0231デフォルトの名無しさん
2007/08/06(月) 21:29:580232デフォルトの名無しさん
2007/08/06(月) 21:47:570233デフォルトの名無しさん
2007/08/06(月) 23:11:47ソースがあるならソースを晒せよ。ロハでできるぞ。
ソースを晒せないから有料でということなら、2万円なんて人を見下したようなことをするもんじゃない。
0234デフォルトの名無しさん
2007/08/07(火) 06:33:04{
}
0235デフォルトの名無しさん
2007/08/07(火) 06:34:28void foo(char *p, size_t len)
{
// ここでpとlenからistreamを作りたい
}
実際には、basic_istreamの派生クラスを作るしかないのでしょうか?
0236235
2007/08/07(火) 06:44:000237デフォルトの名無しさん
2007/08/07(火) 07:39:56↓エスパー1級
0238デフォルトの名無しさん
2007/08/07(火) 07:48:18ファイルストリーム以外でバイナリとテキストの問題なんて起こらないだろ?
istringstream でいいと思うよ。
0239デフォルトの名無しさん
2007/08/07(火) 07:50:42なんでバイナリを扱う必要があったら istringstream を見送るの?
0240デフォルトの名無しさん
2007/08/07(火) 09:01:360241デフォルトの名無しさん
2007/08/08(水) 20:13:23x = x +1
が疑問でもなんでもない俺は負け組
0242デフォルトの名無しさん
2007/08/08(水) 20:15:25固定観念はよくない
0243デフォルトの名無しさん
2007/08/08(水) 21:16:130244デフォルトの名無しさん
2007/08/08(水) 21:57:28x = x * x + Cならマンデルブロ集合なんだけどね。
0245デフォルトの名無しさん
2007/08/09(木) 10:46:54むしろそのへんの切り替えが高速にできない子は算数のできない子
0246デフォルトの名無しさん
2007/08/09(木) 19:51:160247デフォルトの名無しさん
2007/08/09(木) 19:59:43新しいルール、新しい前提の上でのゲームには一歩も踏み出せないってことだからな
その程度の頭の柔軟性が無いのでは算数やプログラミングに限らず
何やってもだめ
0248デフォルトの名無しさん
2007/08/10(金) 09:40:31そこに疑問を持ち、考察し、納得する、というプロセスをだな・・・
0249身の程知らず
2007/08/10(金) 12:01:33もちろんもっと人間にもコンパイラにも分かりやすくて、すばらしい文法は作れただろうが、
今のような位置を占めているかどうかは疑問だ。
以下、俺様演算子を定義できる機能とか、
Cのプリプロセッサなんかより、もっとプログラマブルで、文法を考慮するマクロとか、
↓禿のお気に入りだったマルチメソッドなどについて語ろう↓
0250デフォルトの名無しさん
2007/08/10(金) 12:04:48演算子オーバロードではお気に召しませんか?
>Cのプリプロセッサなんかより、もっとプログラマブルで、文法を考慮するマクロとか、
C99のプリプロセッサではお気に召しませんか?
それならDをどうぞ。
0251デフォルトの名無しさん
2007/08/10(金) 12:06:050252デフォルトの名無しさん
2007/08/10(金) 12:10:18シェア争いを制するために時間を惜しんだんだろ
結局当時は高級言語に負けたが。
0253デフォルトの名無しさん
2007/08/10(金) 12:11:290254デフォルトの名無しさん
2007/08/10(金) 14:42:560255デフォルトの名無しさん
2007/08/10(金) 14:58:060256デフォルトの名無しさん
2007/08/10(金) 15:05:030257デフォルトの名無しさん
2007/08/10(金) 15:54:280258デフォルトの名無しさん
2007/08/10(金) 16:32:060259デフォルトの名無しさん
2007/08/10(金) 17:05:230260デフォルトの名無しさん
2007/08/10(金) 17:07:200261デフォルトの名無しさん
2007/08/10(金) 17:10:30詭弁じゃないと言うなら、何をもって
「禿は演算子オーバーロードは必要最小限に抑えたほうが良いと言ってなかったか」
「おまいは禿が死ねって言ったら死ぬのか?」
というのが同じ重みがあるとするのかを明確化しろ。
0262デフォルトの名無しさん
2007/08/10(金) 17:44:52と注意する場合の定型句だと思うが。
0263デフォルトの名無しさん
2007/08/10(金) 18:16:580264デフォルトの名無しさん
2007/08/10(金) 18:21:40慣用句等あれば使うのが文化って奴だろ
その点APLなんかすごいぞ
0265デフォルトの名無しさん
2007/08/10(金) 18:26:070266デフォルトの名無しさん
2007/08/10(金) 18:34:210267身の程知らず
2007/08/10(金) 18:45:10一言も突っ込まれないマルチメソッド哀れ。
まあ、正直言ってまず使わないと思うけど。
0268デフォルトの名無しさん
2007/08/10(金) 19:05:50Lokiにもマルチディスパッチの実装あるけど、さすがに面倒だ。
でも、コンパイラの実装大変そうだよね。
演算子オーバーロードはPEGとかEBNFを実装するためにあると思うんだ。
0269デフォルトの名無しさん
2007/08/11(土) 12:00:15class A
class B
class C
があるとして、class Cをclass AとBのメンバに持たす時、
class AとBのインスタンスを複数作った場合、メンバであるclass Cも
複数作成されてしまうと思います。
そこで、classA、B共に一つずつしかclass Cを作らないようにしたいのですが、
こういう場合はstaticメンバ変数にするしかないのでしょうか?
ていうのも、static変数はクラス外に宣言を書かないといけないためclass A,Bみたいなクラスを
たくさん作ると大変なんですよね・・・。
class A,Bの基底クラスに持たすことはできませんし・・・
良い方法があればご教授ください。
0270デフォルトの名無しさん
2007/08/11(土) 12:27:320271デフォルトの名無しさん
2007/08/11(土) 12:45:41CRTP が使える場面かもしれない。
でも、そんなに静的変数が要るのかどうかが疑わしい。
クラス外に定義が必要なのが嫌だというのも理解しかねる。
0272デフォルトの名無しさん
2007/08/11(土) 16:51:02class Base
{
static C s_c;
};
template<UINT nID>
C Base<nID>::s_c;
class A : public Base<0>
{};
class B : public Base<1>
{};
0273269
2007/08/11(土) 19:13:13返事が遅れてしまい申し訳ありませんでした。
レスありがとうございます。
CRTPってデザインパターンの一種みたいですね。
>>272のソースがCRTPなのでしょうか?
面白そうなので試してしみようと思います。
0274デフォルトの名無しさん
2007/08/11(土) 19:43:47CRTPはベースクラスが、継承クラスの型を知ること
0276デフォルトの名無しさん
2007/08/11(土) 23:40:11template<class derived_t>
class TLogPolicy {
public:
void log() { log_ += (static_cast<derived_t*>(this))->data_ + "\n"; };
protected:
TLogPolicy() {};
private:
std::string log_;
};
class TManager : public TLogPolicy<TManager> {
public:
void test() { log(); };
private:
std::string data_;
friend TLogPolicy<TManager>;
};
けっこう有名なテクニックだとおもうけど?
0277269
2007/08/12(日) 02:50:34ありがとうございます。
まだ、実装はしてませんが、>>276さんのソースを弄った感じ私が求めてたモノかもしれませんw
ただ、1行目のtemplate<class derived_t>って言うのがよく分からないのですがなんなのでしょうか??
0278デフォルトの名無しさん
2007/08/12(日) 03:00:57ごく普通のテンプレート宣言だよ。これぐらいは調べてくれ。
0279デフォルトの名無しさん
2007/08/12(日) 03:03:18あ、なるほど、template<class T>みたいなもんですかw
てっきり、特殊なことやってるのかと思いましたw
すいません。
0280269
2007/08/12(日) 15:09:02template<class derived_t>
class TLogPolicy {}
class TManager : public TLogPolicy<TManager> {};
class UManager : public TLogPolicy<UManager> {};
class Cont {
std::list<TLogPolicy *> cont;
template <class derived_t>
void add(TLogPolicy<derived_t> *hoge) {
cont.push_back(hoge);
}
};
として、TManager,UManagerのインスタンスを複数作り、
Contクラスのcontに格納したいのですがどうすればいいのでしょうか?
とりあえず、1つのコンテナで管理したいのです。
実際、追加しようとすると、変換できないなどとエラーがでます。
TManagerの適当なメンバ関数から、Cont::add<TManager>(this);
よろしくお願いします。
0281デフォルトの名無しさん
2007/08/12(日) 15:15:38コンテナに入れたいだけならもういっこ基底クラスを置くだけでいいだろう。
コンテナの要素に対して何をしたいのかによっては、それじゃ不満だろうが。
ソース貼るなら、ちゃんと問題(エラー)が再現できるコード作れよ。
0282デフォルトの名無しさん
2007/08/12(日) 15:50:20テンプレートのポインタ(TLogPolicy *)なんてのは無いよ。
TLogPolicy<TManager>とTLogPolicy<UManager> は別の型だから、
同じ基底クラスとして扱うことは出来無いし。
面倒だから簡単にboost::anyのコンテナ使う手もあるかね。
0283269
2007/08/12(日) 19:54:07レスありがとうございます。
>ソース貼るなら、ちゃんと問題(エラー)が再現できるコード作れよ。
申し訳ありません。以後気を付けます。
templateとclassの関係などもうちょっと勉強し、
レスを参考に少し考えてみることにします。
0284デフォルトの名無しさん
2007/08/12(日) 23:02:30多分コンパイル通そうと尋常じゃない時間を割くと思われるので一つ教えてあげる。
テンプレート関数はこう書く。
template <class T> void foo( T param ) { ... }
テンプレートクラスはこう書く。
template <class T> class bar { T member; };
しかし、クラスにテンプレートの関数(これをメンバテンプレートという)
を書くことはできない。
class hoge {
template <class T> void f( T param ) { ... } // ←コンパイルエラー
}
つまり 280 のコードでやろうとしていることは、そもそも不可能なんだよ。
0285デフォルトの名無しさん
2007/08/12(日) 23:16:39メンバテンプレートって呼び名が付いてるのに書くことはできないんだ。ふーん。
コンパイラ何使ってるの?
0286デフォルトの名無しさん
2007/08/12(日) 23:19:400287デフォルトの名無しさん
2007/08/12(日) 23:45:41が、一部文法が通らないな。
hoge h;
h.f(1); // OK
h.f<float>(1); // NG
vc5 は知らん。
0288284
2007/08/12(日) 23:46:09>>283 すまん、284 は全くのマチガイ。忘れてくれ m(_ _)m
>>285 VC2005。
>>286 今試したら VC6 ではできた。VC 5 以前はわからんけど。
いぢめないで。。。
0289デフォルトの名無しさん
2007/08/12(日) 23:59:00template<class derived_t>
class TClassData {
private:
template<typename T>
string& data(T* t) {
static string data;
return data;
}
friend derived_t;
};
class TManager : TClassData<TManager> {
public:
void set(string const& s) { data(this) = s; };
string& get() { return data(this); };
};
…………しかし、継承使われたりすると危なっかしくてしょうがないな。
TManagerはクラス内クラスにしてファイナル化しといた方が安全そうだ。
0290289
2007/08/13(月) 00:01:46未だに保守でVC5,6使わされているプログラマは可哀想でしょうがない。
0291デフォルトの名無しさん
2007/08/13(月) 00:03:03class AbstractTLogPolicyHolder { public:
TLogPolicy& policy;
AbstractTLogPolicyHolder( TLogPolicy& policy ) : policy( policy ) {}
};
template < class T >
class TLogPolicyHolder : public AbstractTLogPolicyHolder {
static TLogPolicy policy;
public: TLogPolicyHolder() : AbstractTLogPolicyHolder( policy ) {}
};
template <class T> TLogPolicy TLogPolicyHolder<T>::policy;
class Cont { ::std::list< AbstractTLogPolicyHolder* > cont;
public: void add( AbstractTLogPolicyHolder* holder ) { this->cont.push_back( holder ); }
void callAllFoo();
};
void Cont::callAllFoo() {
::std::list< AbstractTLogPolicyHolder* >::iterator i = this->cont.begin();
for( ; i != this->cont.end(); ++i ) { ( *i )->policy.foo(); }
}
class TManager : public TLogPolicyHolder< TManager > {};
class UManager : public TLogPolicyHolder< UManager > {};
void main() {
Cont cont;
TManager t1, t2, t3; // TManager::policy は 1 個だけ存在
UManager u1, u2, u3; // UManager::policy も 1 個だけ存在
cont.add( &t1 );
}
0292デフォルトの名無しさん
2007/08/13(月) 00:05:41この前、VC3の案件が回ってきて笑った。
0293289
2007/08/13(月) 00:15:30良く良く考えたらテンプレートメンバ関数要らんな。
ただ危険にしているだけだった。
template<class derived_t>
class TClassData {
protected:
TClassData() {};
string& data() {
static string data;
return data;
}
};
class TManager : public TClassData<TManager> {
public:
void set(string const& s) { data() = s; };
string& get() { return data(); };
};
0294デフォルトの名無しさん
2007/08/13(月) 08:35:29TLogPolicyとContはどこいった?
0295デフォルトの名無しさん
2007/08/13(月) 11:17:36std::complex<double> c = std::complex<double>(1, 2);
とした時、コピーコンストラクタが呼ばれるかどうかに関する規定がよく分からない。
これは「コピー初期化」であって「std::complex<double>(1, 2)がcにコピーされる」らしいんだが、
実際やってみると、どうもコピーコンストラクタは呼ばれない。
この「コピー」というのがコピーコンストラクタを呼ぶことを意味していないのか、
それともコピーコンストラクタを呼ばない最適化が規格で許されてるのか、
どうもよく分からない。
このあたりどうなってるのか詳しく知ってる人はいる?
0296デフォルトの名無しさん
2007/08/13(月) 11:22:35ttp://www.kmonos.net/alang/cpp/glossary.html#RVO
0297デフォルトの名無しさん
2007/08/13(月) 11:27:382)T a(...)
は同じじゃなかったっけ
0298デフォルトの名無しさん
2007/08/13(月) 11:45:31つまり、これも戻り値最適化に含まれる、というわけ?
0299デフォルトの名無しさん
2007/08/13(月) 12:05:27いいえ。前者はコピーコンストラクタが呼ばれる可能性があります。
# >296参照。
0300デフォルトの名無しさん
2007/08/13(月) 12:06:17正しく、RVOですね。
0301デフォルトの名無しさん
2007/08/13(月) 12:07:59戻り値最適化もコピー初期化時の省略もそのひとつ。
って、他にあったっけ?
0302デフォルトの名無しさん
2007/08/13(月) 12:09:56これで安心して眠れます。
まだ寝ないけど。
0303デフォルトの名無しさん
2007/08/13(月) 12:10:44これかしらん?
http://web.archive.org/web/20050308020505/www.kuzbass.ru/docs/isocpp/special.html
ここの最後の方
> -15- Whenever a temporary class object is copied using a copy constructor, and this object and the copy have the same cv-unqualified type,
an implementation is permitted to treat the original and the copy as two different ways of referring to the same object and not perform a copy at all,
even if the class copy constructor or destructor have side effects.
0304デフォルトの名無しさん
2007/08/13(月) 12:22:55おおー。それですね。完璧ですね。
0305デフォルトの名無しさん
2007/08/13(月) 12:31:03if the function is a constructor, the call initializes a temporary of the
destination type. The result of the call (which is the temporary for the
constructor case) is then used to direct-initialize, according to the rules above,
the object that is the destination of the copy-initialization. In certain cases,
an implementation is permitted to eliminate the copying inherent in this
direct-initialization by constructing the intermediate result directly into the
object being initialized;
0306デフォルトの名無しさん
2007/08/13(月) 13:07:44ええ? >297の通りじゃ……と思ってC++STDを確認しました。
8.5 Initializers
(snip)
initializer:
= initializer-clause
( expression-list )
initializer-clause:
assignment-expression
{ initializer-list ,opt }
{ }
initializer-list:
initializer-clause
initializer-list , initializer-clause
ということで、>297の通りじゃね?良くわからないけど。
0307デフォルトの名無しさん
2007/08/13(月) 13:12:39「ということで」じゃねーよ。何を確認したんだよ。
= に続けて置かれた初期値の型が同じなら、動作上は direct-initialization と
同じに最適化されるが、意味上は依然として copy-initialization なので、
たとえばコピーコンストラクタが private になってたりすると >>297 の 1 は
コンパイルエラーになる。
0308306
2007/08/13(月) 14:06:53過去ログにあった。
http://ir9.jp/prog/ayu/datlog/tech_cpp/1047560042/1047560042_03.html#R700
条件付きで同じになるっつうのが正解かしらん?
copy-initializationとdirect-initializationについて纏まっている資料は無いのかね?
More Exceptional C++に載っているみたいだけど……
0309デフォルトの名無しさん
2007/08/13(月) 14:56:260310デフォルトの名無しさん
2007/08/14(火) 01:11:10実際にはdirect-initializationが行われる(よばれる)のか
class Nurupo
{
private:
//public:
Nurupo(const Nurupo&) {
*(int*)0 = 0;
}
public:
Nurupo(int nurupo1, int nurupo2, int nurupo3) {
;
}
};
void foo() {
Nurupo nurupo = Nurupo(1,2,3);
}
private:だとコンパイルエラーになるが、
public:にして実行しても落ちるわけではない
でさ、これもRVOって呼ぶの?returnしてないのに?
0311デフォルトの名無しさん
2007/08/14(火) 01:53:47これは RVO とは呼ばない。
0312デフォルトの名無しさん
2007/08/14(火) 01:55:03規格のドラフトでいいんじゃないの? >>2
0313デフォルトの名無しさん
2007/08/14(火) 02:39:080314デフォルトの名無しさん
2007/08/14(火) 02:45:470315デフォルトの名無しさん
2007/08/14(火) 08:29:54C++的には正しい配布形式
0316デフォルトの名無しさん
2007/08/14(火) 10:19:47という配列をメンバーに持っていた場合、どうやって初期化すればよいのでしょうか?
0317デフォルトの名無しさん
2007/08/14(火) 10:21:52できません。 const 外すか、パフォーマンスに問題なければ std::vector を使うか。
0318デフォルトの名無しさん
2007/08/14(火) 10:23:08const X x; として、その x のコンストラクタで初期化する。
0319デフォルトの名無しさん
2007/08/14(火) 10:40:090320デフォルトの名無しさん
2007/08/14(火) 23:11:20C++にてシングルトンを実装するに当たって、インスタンスの解放を明示的に実装しますか?
私は、実装します。
プログラムの終了まで存在するものとしても解放するべきだと思っています。
実装しないという人の理由が、解放される順番が難しい、
というのですがそれは理由にはならないのではと。
解放しない派で、もっとこう積極的な理由があるなら教えてください。
0321デフォルトの名無しさん
2007/08/14(火) 23:19:43static HogeClass *s = new HogeClass;
return s;
とかするのか?
0322デフォルトの名無しさん
2007/08/14(火) 23:25:57言語に頼れるのならば任せるのがベターだろうと思うよ。
それができない(例外的な)ケースのときだろうね。明示的に実装することを考えるのは
0323デフォルトの名無しさん
2007/08/15(水) 02:20:59私は、解放します。
プログラムの終了まで存在するものとしても解放するべきだと思っています。
0324デフォルトの名無しさん
2007/08/15(水) 03:29:48ローカル関数内のstaticオブジェクトを使うのが簡単じゃない?
0325デフォルトの名無しさん
2007/08/15(水) 04:20:380326デフォルトの名無しさん
2007/08/15(水) 05:39:13Modern C++ Design 読め、で済ますしかない。
0327デフォルトの名無しさん
2007/08/15(水) 07:29:150328デフォルトの名無しさん
2007/08/15(水) 08:00:51C++でmalloc()使う方がどうかしている。
0329デフォルトの名無しさん
2007/08/15(水) 08:43:20有名な「malloc/free論争」と同じ
不毛な議論だということを述べているのだと思うが
0330デフォルトの名無しさん
2007/08/15(水) 08:46:56そんなに毛が欲しければCを使っていればいいだけのことだ。
0331デフォルトの名無しさん
2007/08/15(水) 09:25:19newしたものは必ずdeleteする必要があるか、という点なのだけど。
「mallocではなくnew」などというのは、本質を外れた揚げ足取りに過ぎないと
気が付いているんだろうけど、引っ込みがつかないんだろうね。
0332デフォルトの名無しさん
2007/08/15(水) 09:33:22「勝者とは強い者のことを言うのではない、戦場に最後まで立っていた者のことを言う」
と、妖魔司教ザボエラ様も仰ってる。
0333デフォルトの名無しさん
2007/08/15(水) 09:48:460334デフォルトの名無しさん
2007/08/15(水) 10:04:490335デフォルトの名無しさん
2007/08/15(水) 10:34:090336デフォルトの名無しさん
2007/08/15(水) 10:34:36RAIIの原則に従っておけば何も考えなくていいんだから
0337デフォルトの名無しさん
2007/08/15(水) 10:41:010338デフォルトの名無しさん
2007/08/15(水) 11:10:570339デフォルトの名無しさん
2007/08/15(水) 11:13:180340デフォルトの名無しさん
2007/08/15(水) 11:20:330341デフォルトの名無しさん
2007/08/15(水) 12:09:46私は、解放します。
プログラムの終了まで存在するものとしても解放するべきだと思っています。
0342デフォルトの名無しさん
2007/08/15(水) 12:15:100343デフォルトの名無しさん
2007/08/15(水) 12:31:170344デフォルトの名無しさん
2007/08/15(水) 12:38:33勿論deleteすべきだろうな
0345デフォルトの名無しさん
2007/08/15(水) 12:48:37C++必須の概念のはずなのに、知らないやつってホント多いよな。
0346デフォルトの名無しさん
2007/08/15(水) 12:52:51決め付けは良くないですyo
0347デフォルトの名無しさん
2007/08/15(水) 12:53:030348デフォルトの名無しさん
2007/08/15(水) 12:53:52それはデバッガがクソ
0349デフォルトの名無しさん
2007/08/15(水) 13:01:34今時手動deleteとかありえねえ
0350デフォルトの名無しさん
2007/08/15(水) 13:04:150351デフォルトの名無しさん
2007/08/15(水) 13:25:500352デフォルトの名無しさん
2007/08/15(水) 13:40:390353デフォルトの名無しさん
2007/08/15(水) 13:42:58ガベコレも結局無限リソース(メモリ)しか上手く処理できないしな……
0354デフォルトの名無しさん
2007/08/15(水) 13:44:470355デフォルトの名無しさん
2007/08/15(水) 14:01:29私はそう考えます。
0356デフォルトの名無しさん
2007/08/15(水) 14:29:380357デフォルトの名無しさん
2007/08/15(水) 14:48:33ちゃんとリソース所有権を考えれば循環参照はめったにおこらない。
まあ、考えるのが面倒だからガベコレに頼りたくなるんだけどね。
>355
どういう状況だよ。シングルトンわかってないだろ。
0358デフォルトの名無しさん
2007/08/15(水) 14:49:34そんなシングルトンが存在すること自体、設計が変だと思わないか
0359デフォルトの名無しさん
2007/08/15(水) 14:51:450360デフォルトの名無しさん
2007/08/15(水) 14:57:57可哀相なくらい行間が読めないコンビだな。
0361デフォルトの名無しさん
2007/08/15(水) 15:35:05いい加減夏厨相手にするのも飽きたなぁ
0362デフォルトの名無しさん
2007/08/15(水) 15:51:470363デフォルトの名無しさん
2007/08/15(水) 15:54:14ちゃんと伝えたきゃ書け
0364デフォルトの名無しさん
2007/08/15(水) 15:56:260365デフォルトの名無しさん
2007/08/16(木) 06:38:10日本語でコミュニケーションする能力が
技術的な部分と両輪で機能してない間抜けなぞ問題外。
0366デフォルトの名無しさん
2007/08/16(木) 14:56:080367デフォルトの名無しさん
2007/08/16(木) 15:29:53ttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2310.pdf
Boehm らによる言語機能としてのガベコレ提案。ちょっと期待。
0368デフォルトの名無しさん
2007/08/16(木) 18:15:46public:
LPSTR& operator[](LPCSTR);
};
class SUPERCLASS{
public:
SUBCLASS *subclass;
};
SUPERCLASS aaa;
int main()
{
aaa.subclass = new SUBCLASS(hogehoge);
return aaa.subclass["bbb"];
}
わけあってmapが使えないので上のようにしているのですが
「error C2107: ポインタでない式に、添字が使われました。」
というエラーが出てしまいます
どのようにすれば解決できますでしょうか?
開発環境はVS2005です
よろしくお願いします
0369デフォルトの名無しさん
2007/08/16(木) 18:30:39return (*aaa.subclass)["bbb"];
0371デフォルトの名無しさん
2007/08/16(木) 18:53:11エラーメッセージが変わっただろ。ちゃんとその辺を書けよ。
で、戻り値の型がLPSTRなんだから、らreturn文で呼ばずに単独で呼んでみな。
0373デフォルトの名無しさん
2007/08/16(木) 19:06:170375デフォルトの名無しさん
2007/08/16(木) 19:11:260376デフォルトの名無しさん
2007/08/16(木) 19:11:34俺もそうだと思ったけど、関数形式で呼ぶのがなんか嫌だから書かなかった
なんか解決策ないかね
0377371
2007/08/16(木) 19:13:21そうか? 前者は引き数が合わなくて関数が見つからないが、後者は戻り値の型が合わなくてエラーになると思うのだが。
つーか、なんでまたmain()のreturnなんかで試すんだ? >371の後半は読んでないのか?
0378376
2007/08/16(木) 19:13:31連想配列にしたくて添え字をオーバーロードしているはずなのに
opreator[]で呼んだら意味を成さなくなっちゃうからだ。
0379376
2007/08/16(木) 19:15:59subclassをカプセル化して、参照越しにoperator[]を呼ぶ
0380デフォルトの名無しさん
2007/08/16(木) 19:23:44aaa.subclass->operator[]("bbb") でコンパイル通るってあり得ないと思うんだが。
0381368
2007/08/16(木) 19:28:22あわわ間違って(*aaa.subclass["bbb"])としちゃってたようです
>>377
エラー部分だけ抜き出そうとして型違いのreturnになってました、ごめんなさい…
>>379
単語の意味がわかってないので検索してやってみます、ありがとうございました
0382デフォルトの名無しさん
2007/08/16(木) 19:35:38constでないということは、こういうことがやりたいんだろうか。
(*aaa.subclass)[''bbb"] = new char[10] ;
いや、ひょっとしたらこういうことがしたいのか
char * & ptr = (*aaa.subclass)[''bbb"] ;
ptr = static_cast<char *>( realloc(ptr) ) ;
0383デフォルトの名無しさん
2007/08/16(木) 20:59:50{
public:
Base(int n) {}
};
class Derived : Base
{
public:
Derived(int n) {}
};
これがどうしてダメで、Base::Base()が必要なのか教えてください。
0384デフォルトの名無しさん
2007/08/16(木) 21:06:38public:
Derived(int n) :Base(n) {}
0385デフォルトの名無しさん
2007/08/16(木) 21:06:530386デフォルトの名無しさん
2007/08/16(木) 21:07:27その例のDerived のコンストラクタは結局 Derived(int n) : Base() {} の省略形だから
0387デフォルトの名無しさん
2007/08/16(木) 21:21:450388デフォルトの名無しさん
2007/08/16(木) 23:12:17Derived クラスのインスタンスを生成するときに
Base クラスのコンストラクタを呼び出すからなんだと思います。
コンストラクタを定義していないときはデフォルトコンストラクタが呼び出されるけど
定義してると定義されたものを呼び出すから
この場合は引数のいらないコンストラクタを定義するか
Derived クラスのコンストラクタで
Derived(int n) : base(100) {}
みたいに Base(int n) を呼び出して
引数を渡さないとだめだと思うんです。
初心者なんで間違ってるかもしれません。
っていうか STL 難しすぎでうっ!
0389デフォルトの名無しさん
2007/08/16(木) 23:20:25っていうか STL 関係ねー
0390デフォルトの名無しさん
2007/08/17(金) 00:01:01>っていうか STL 難しすぎでうっ!
でうっ?
0391デフォルトの名無しさん
2007/08/17(金) 00:20:57ttp://www.karakuri-box.com/~killer-q/file7/KITERETU0022.png
0392デフォルトの名無しさん
2007/08/17(金) 00:41:05C++ってどんな局面で使うんですか?
WinアプリならC#使ったほうが圧倒的に楽
0393デフォルトの名無しさん
2007/08/17(金) 01:00:070394デフォルトの名無しさん
2007/08/17(金) 01:24:19ForループじゃなくてC++のiteratorに変換してくれるtemplateとかないんですか?
ない場合どのiterator継承すればいいんでしょうか
0395デフォルトの名無しさん
2007/08/17(金) 01:40:46なら、&head[0]〜&head[element]がiteratorの要件を満たしてくれるでそ?
0396デフォルトの名無しさん
2007/08/17(金) 01:48:01楽かどうかなら C# が楽だろうが、
C# は Windows にしか優しくないし、
速度も C++ に劣るし、
そういうのが必要な時には C++ が圧倒的有利。
0397デフォルトの名無しさん
2007/08/17(金) 02:19:58最近は全部C#。
0398デフォルトの名無しさん
2007/08/17(金) 02:21:200399デフォルトの名無しさん
2007/08/17(金) 02:38:290400デフォルトの名無しさん
2007/08/17(金) 03:59:530401デフォルトの名無しさん
2007/08/17(金) 05:58:45C#を実装するのに使います
0402デフォルトの名無しさん
2007/08/17(金) 12:37:180403デフォルトの名無しさん
2007/08/17(金) 21:16:42プログラムが必要な場面はいろいろあるぞ
0404デフォルトの名無しさん
2007/08/17(金) 21:39:47の2次元配列を動的に確保する場面があって、
CFUNC ***pppa;
として使いたいですが、
pppa = new CFUNC**[y_len];
でまずy要素を確保して
pppa[0] = new CFUNC*[x_len];
各y要素のx要素を確保して
pppa[y][x] = new CFUNC();
で、各要素をインスタンス化して
(*(pppa[y][x])).hoge();
みたいに使おうと思うのですが、このpppaを破棄する場合に
deleteはどう書いたらいいのかわからなくなってしまいました。。。どなかたpppaをdeketeしてもらえませんか?
ちなみによくしらないのですが、delete[]ってなんで配列の要素数がわかるんですか?
0405デフォルトの名無しさん
2007/08/17(金) 22:15:50typedef CFUNC** PPCFUNC
typedef CFUNC* PCFUNC
と整理してやると
PPPCFUNC pppa = new PPCFUNC[y_len]
pppa[0] = new PCFUNC[x_len]
pppa[y][x] = new CFUNC
になるんで
deleteとdelete[]で困る局面はなくなると思ってみたり
要素数は実装によるけどもコンパイル時には決められないからどっかで一元管理してんでないすか多分
俺はそうする
0406デフォルトの名無しさん
2007/08/17(金) 22:53:530407404
2007/08/17(金) 22:59:04ではこれで確保したpppaはdelete[] pppaで破棄できるんですねっ!
要素数は、
int pppa_len_y;
int *pppa_len_x = new int[ pppa_len_y ];
でnew時に一緒に初期化しています。
もっと手軽な方法ありますか?
0408404
2007/08/17(金) 23:02:44それじゃぁmallocするときに、必要size+1とってfreeのときにそれ利用してるんですねぇ。
ってことは要素数を保持しなくても、ポインタの手前の要素数使えってこと?
ちなみにc++の規定ですか?処理系依存ですか?
0409デフォルトの名無しさん
2007/08/17(金) 23:17:520410404
2007/08/18(土) 00:17:58PPPCFUNC pppa = new PPCFUNC[y_len];
でnewしようとすると、PPFUNC*からPPPFUNCに変換できません
と怒られてしまいました。
PPPCFUNC pppa = (PPPFUNC)( new PPCFUNC[y_len] );
でキャストして大丈夫なのでしょうか?
0411404
2007/08/18(土) 00:36:140412383
2007/08/18(土) 11:08:57ありがとうございました。よくわかりました。
最近C++を勉強しているのですが、Java育ちのゆとり世代なものでスパルタさにガクブルものです。
class Foo
{
private:
char* s_;
public:
Foo(char* str) : s_(new char[strlen(str)+1]) { strcpy(s_, str); }
~Foo() { delete[] s; }
};
int main()
{
Foo a("foobar");
Foo b = a;
}
この程度で落ちるってのがすごすぎです(なぜ落ちるのかはちゃんとわかりますが・・・)。
0413デフォルトの名無しさん
2007/08/18(土) 11:24:18生でnewを使うからそういう羽目になる。
std::stringを使うなり、std::vectorを使えばいい。
せめて、スマートポインタを使え。
0414デフォルトの名無しさん
2007/08/18(土) 11:34:020415デフォルトの名無しさん
2007/08/18(土) 12:19:01RAIIはちゃんと勉強しといたほうが良いよ
0416デフォルトの名無しさん
2007/08/18(土) 12:37:370417デフォルトの名無しさん
2007/08/18(土) 12:40:35Java→C→C++って回るべきだと思うんだが
0418デフォルトの名無しさん
2007/08/18(土) 13:32:090419デフォルトの名無しさん
2007/08/18(土) 14:17:34GC付きの言語を使うと変な癖が付く。
0420デフォルトの名無しさん
2007/08/18(土) 15:08:220421デフォルトの名無しさん
2007/08/18(土) 16:59:23自分はC#→C→Java→C++ってやってきたけどおk?
0422デフォルトの名無しさん
2007/08/18(土) 17:03:18そのクラスをstaticに使ってるんですが、
この場合、どのように例外をキャッチすればいいのでしょうか?
class Throw{ public: Throw(){ throw 1; } };
class TestClass{
static Throw throw;
};
こんな感じです。
0423デフォルトの名無しさん
2007/08/18(土) 17:12:19コンストラクタの中でキャッチするか、プログラムが死ぬか。
0424デフォルトの名無しさん
2007/08/18(土) 17:36:05staticをやめる
0425デフォルトの名無しさん
2007/08/19(日) 13:25:57たとえば
int i = 100, *ip;
double d = 123.456, *dp;
ip = &i;
dp = &d;
char *s = "abcdefg";
cout << ip << " " << dp << " " << s << endl;
このようなコードで int型やダブル型のポインタを cout で出力すると
アドレスが表示されるのに char型のポインタだと
文字列が表示されるのがいまいちよくわからなかったんですが
ずっと勉強してきてふと思ったんです。
cout で演算子オーバーロードでそうなるようにされてるのかなと。
で定義されているコードを探そうと思ったんですけど
なんかごちゃごちゃしててよくわかりません。
もし予想が当たってるならどのファイル見ればいいかでしょうか?
0426デフォルトの名無しさん
2007/08/19(日) 13:54:49basic_ostream っていうクラステンプレートに対して定義されている。
char もテンプレート引数になってるからちょっと探しにくいだろうね。
ヘッダ ostream に対応するファイルで定義されているはず。
ごちゃごちゃしたヘッダを読むのがいやなら >>2 から規格のドラフトでも見るといい。
0427デフォルトの名無しさん
2007/08/19(日) 17:00:460428デフォルトの名無しさん
2007/08/19(日) 17:31:070429デフォルトの名無しさん
2007/08/19(日) 18:41:48事故解決すますた
0430デフォルトの名無しさん
2007/08/19(日) 21:20:33ありがとうございます。
ファイル見てみたんですけど
今の僕にはまだ難しくてよくわかんないんで規格もみたんですけど
いまいちわからなくて
検索してたら説明されてるページをみつけました。
http://www.io.nara-su.ac.jp/kanrishitsu/manual/FSUNf90/LANG/japanese/C++/stdlib/stdref/bas_8583.htm
これですっきりしました。
0431デフォルトの名無しさん
2007/08/20(月) 15:44:57下のクラス図のようなクラスを実装したいのですが、DataClassのように、二つ(以上)で共有しているクラスは、コード上でどのように書いたらいいのでしょう?
DataClassのインスタンスをグローバルな領域で作るしかないのでしょうか?
クラス図
http://enjoi.blogdns.net/up/src/868.jpg
とりあえず書いてみたコード
class DataClass{
private:
int data;
public:
void setData(int newData);
int getData();
};
class ClassB
{
public:
bool DoSomething();
};
class ClassA
{
private:
ClassB classb;
};
0432デフォルトの名無しさん
2007/08/20(月) 16:18:28どっちかに持たせて、もう片方にも渡せるようにすることもあるし、
動的に確保して、A, B の両方のスマートポインタに入れとくこともあるし、
A を所有するクラスに持たせて、そっから渡すようにすることもあるし、
シングルトンにしてグローバルな領域に置くこともあるし、
0433デフォルトの名無しさん
2007/08/20(月) 16:18:280434デフォルトの名無しさん
2007/08/20(月) 16:20:59DataClass をメンバとして持つんですか?
ClassA と DataClass の関係って必要なんですか?
ClassB経由で十分なんじゃないでしょうか?
0435デフォルトの名無しさん
2007/08/20(月) 16:23:07むしろ同じオブジェクトではないと考えるほうが自然。
0436デフォルトの名無しさん
2007/08/20(月) 16:28:10各インスタンスはParentへのポインタを通してDataClassへとアクセスする。
0437デフォルトの名無しさん
2007/08/20(月) 16:30:250438デフォルトの名無しさん
2007/08/20(月) 16:35:130439デフォルトの名無しさん
2007/08/20(月) 16:36:430440デフォルトの名無しさん
2007/08/20(月) 16:59:470441デフォルトの名無しさん
2007/08/20(月) 17:56:47複数の方法論に、そもそも設計の段階でご意見まで、たくさんいただきまして、ありがとうございます。
少し数があるので、それぞれについて吟味して、決めた際にまた改めてのお礼がてらご報告にきたいと思います。
ありがとうございました。
0442デフォルトの名無しさん
2007/08/21(火) 09:33:29しなくていいよ。
0443デフォルトの名無しさん
2007/08/23(木) 00:48:570444デフォルトの名無しさん
2007/08/23(木) 00:56:170445デフォルトの名無しさん
2007/08/23(木) 01:27:07http://support.microsoft.com/kb/326616/ja
>>443
stringstream.str("");
0446デフォルトの名無しさん
2007/08/23(木) 02:00:38鬱になった
やはりSTLportを入れて使(ry
0447デフォルトの名無しさん
2007/08/23(木) 02:10:08std::wcoutで何も出力されなかったりして困ってたんだけど、445が原因?
でもVS2005 Proだから違うか
0448デフォルトの名無しさん
2007/08/23(木) 02:34:28coutにwchar_t*食らわしたり、localeを適切に設定せずに日本語文字列食わしてるならお前が悪いだけ。
0449印字ケータ
2007/08/23(木) 14:31:20保存してある漢字の"日"という文字は16進数で93 FAと表示されてますが、
コレを読込んで、配列に入れると-109と-6となります。
16進数で表示させたいので、変換する方法を教えてください。
お願いします。
0450デフォルトの名無しさん
2007/08/23(木) 14:35:180451デフォルトの名無しさん
2007/08/23(木) 14:40:351001 0011 1111 1010
10010011 を符号付き10進数であらわすと
-109
11111010 を符号付き10進数であらわすと
00000110
-6
そのまま16進にすれば同じ
気にしないで突き進め
char を intにするなら符号拡張がおきるので>>450のとおりunsigned にしとけばいい
0452印字ケータ
2007/08/23(木) 14:42:15返答ありがとうございます。
早速やってみましたが、変換後に4294967187というデカイ数値になりました。
ちなみに、unsignedの変数にキャストして代入してみました。
もしかして私のやり方が間違ってますか。
0453デフォルトの名無しさん
2007/08/23(木) 14:54:4193 はマイナスだから、そのままint にもってくと 符号拡張するんだよ
unsigned にキャストってどこでどうやったの?
unsigned な変数に入れてやってみ。
0454デフォルトの名無しさん
2007/08/23(木) 14:56:1710010011→11111111111111111111111110010011
0455デフォルトの名無しさん
2007/08/23(木) 15:04:05int n = (unsigned char)ch;
0456デフォルトの名無しさん
2007/08/23(木) 18:34:31Dinkum版stringの短文字列最適化がアダになったな。
実装としては面白くて好きなんだがな。
0457デフォルトの名無しさん
2007/08/23(木) 22:36:570458デフォルトの名無しさん
2007/08/30(木) 08:15:51vectorとかコレクションを返す関数って効率悪い?
0459デフォルトの名無しさん
2007/08/30(木) 08:30:10コンテナを参照で受け取ったほうがいいんじゃないか?
0460デフォルトの名無しさん
2007/08/30(木) 08:44:110461sage
2007/08/30(木) 10:25:41参照で受け取るっていうのは
void Func_A( vector< struct X >& );
か、
vector< struct X >& Func_A();
ってことですか?
とりあえず上の参照を引数にする方でやってみます
0462デフォルトの名無しさん
2007/08/30(木) 11:47:47はどっかに所有者用意しなきゃいけないから色々と面倒じゃね?
基本はauto_ptr戻しだと思うけど。
0463デフォルトの名無しさん
2007/08/30(木) 23:55:27仕様と実装を混同するのはよくないが、実際には多くのコンパイラにおいて
「構造体(class)を返す関数」は、暗黙の引数(返り値へのポインタ)を受け取って、
そこに書き込んで返しているわけだから。
で、return直前にインスタンスを生成する以外の場合、つまり
ローカル変数としてvectorを宣言していろいろ操作しそれを返す場合
おそらくRVOされる可能性も低いんじゃないね。知らないけど。
0464デフォルトの名無しさん
2007/08/31(金) 00:49:22よくある戻り値用のポインタが指しているのは確保されただけで
まだコンストラクタが走ってない領域ね。引数で受け取る場合は
必ず構築済みのインスタンスを指すんで、仕様的にも違いがある。
最後の場合は「可能性が低い」じゃなくて RVO は不可能。
0465デフォルトの名無しさん
2007/08/31(金) 00:52:15Named RVOはVC8がやってるらしいですぜ
http://msdn2.microsoft.com/en-us/library/ms364057(vs.80).aspx
0466デフォルトの名無しさん
2007/08/31(金) 00:55:03何か問題があったんだろうか?
0467デフォルトの名無しさん
2007/08/31(金) 01:09:49コンパイラが勝手にやるようになったから文法からは削除されただけみたい。
0468464
2007/08/31(金) 01:23:50働くのね。ふーん。
0469デフォルトの名無しさん
2007/08/31(金) 01:35:07できればクラスのメンバ関数でやりたいです
まえにWebで見かけたんだけど見つからなかったorz
0470デフォルトの名無しさん
2007/08/31(金) 01:48:21引数の型が同じなら関数を呼び分けることができないから、基本的に無理だろう。
戻り値の型を基底クラスのポインタにして、異なる型の派生クラスのオブジェクトの
ポインタを返すとかじゃダメ?
0471デフォルトの名無しさん
2007/08/31(金) 03:13:32こんな感じ?
struct A {
template <typename T> T foo(int);
};
void bar() {
A a;
char c = a.foo<char>(0);
short s = a.foo<short>(1);
// ...
}
0472デフォルトの名無しさん
2007/08/31(金) 14:55:280473デフォルトの名無しさん
2007/08/31(金) 15:13:390474デフォルトの名無しさん
2007/08/31(金) 16:14:22modf
>>473は負数のとき正しくない
0475デフォルトの名無しさん
2007/08/31(金) 17:35:42とかじゃ駄目?
0476デフォルトの名無しさん
2007/08/31(金) 18:59:330477デフォルトの名無しさん
2007/08/31(金) 19:19:41もともと整数部分がint範囲を超えてる場合があるので、
intにキャストするのはまずいと思われ。
0478デフォルトの名無しさん
2007/08/31(金) 23:01:01調べてみたらこれは C99 で定義されてるらしいから C++ では普通使えないな
とはいえ持ってる処理系に存在するかどうかは調べてみたらどうよ
0479デフォルトの名無しさん
2007/08/31(金) 23:31:140480デフォルトの名無しさん
2007/09/01(土) 00:05:170481469
2007/09/01(土) 00:26:15レス�dクスです、
自分が見てたのは、こんなのでした
素直に名前を変えます...
struct testFunc {
int n, m;
testFunc(int _n, int _m = 1) { n = _n; m = _m; }
testFunc(int _n, double _m) { n = _n; m = 10; }
operator int() { return n * m * 2; };
operator double() { return n * m * 3.0; };
};
void main() {
int a = testFunc(5);
double b = testFunc(5);
int c = testFunc(5, 5);
double d = testFunc(5, 5);
int e = testFunc(5, 5.0);
double f = testFunc(5, 5.0);
}
もう少し探したらそれらしいのが見つかりました
ttp://homepage2.nifty.com/well/FunnyStorage.html#mutate
やりたかったことはこんな感じ↓
ttp://anond.hatelabo.jp/20070722050021
0482デフォルトの名無しさん
2007/09/02(日) 00:02:07for (int i=0; i<v.size(); i++)
{
.....
}
というコードの i<v.size() で
> warning C4018: '<' : signed と unsigned の数値を比較しようとしました。
という警告が出るんですが、
こういうときは unsigned i=0 にして
きっちり警告を消してしまうもんなんでしょうか?
0483デフォルトの名無しさん
2007/09/02(日) 00:07:42警告も消すのが良い作法
0484デフォルトの名無しさん
2007/09/02(日) 00:11:18unsigned でも警告は消えるけど、v.size()のリターン値と同じ型を使うのが普通。
0485デフォルトの名無しさん
2007/09/02(日) 00:12:08for ( vector<char>::size_type i = 0 ; i < v.size() ; ++i )
0486デフォルトの名無しさん
2007/09/02(日) 00:16:440487デフォルトの名無しさん
2007/09/02(日) 00:23:34でもこの場合どうやるんだろう。
そもそも>>482はstd名前空間のvectorではないから、自前実装の俺様vectorである可能性もあるんだよね。
ひょっとしたら、size_typeなど定義されていないかもしれない。
こういうことできるの?
decltype( v.size() ) i ;
sizeofに関数を渡すと、戻り値の型のサイズになるから、
decltypeだと戻り値の型になってくれるんだろうか。
なんてことをふと考えてしまった。
どうなるの? 教えてハゲな人。
0488デフォルトの名無しさん
2007/09/02(日) 00:27:020489486
2007/09/02(日) 00:30:15for (auto i = v.begin(); i != v.end(); ++i)
0490デフォルトの名無しさん
2007/09/02(日) 00:40:25なるほど。さんくすです。
>> 484
やっぱりそうですよね。
安易に型決めるんじゃなくてちゃんと考えるべき何ですよね。
>> 485
感動しました。
0491デフォルトの名無しさん
2007/09/02(日) 01:34:22i++使う意味も判らん……
0492デフォルトの名無しさん
2007/09/02(日) 01:50:17for (int i = 0; i < v.size(); i++) v[i] = i;
みたいな。
0493デフォルトの名無しさん
2007/09/02(日) 01:59:53初心者だからだろ。
そのくらいわかれよ。
0494デフォルトの名無しさん
2007/09/02(日) 08:40:18できるよ。
0495デフォルトの名無しさん
2007/09/02(日) 12:06:53そうですね。イテレータでもいけそうですね。
今はサンプルプログラム打ちながら勉強してるんで
そこまでは思いつきませんでした。
>>492
ブロック内部でローカル変数作れば解決できそうですね。
またひとつ勉強になりました。
ありがとうございます。
0496デフォルトの名無しさん
2007/09/02(日) 13:35:18そうそう、ループはイテレータで書くのが癖になると、内部でint idx = it - vec.begin()みたいなのを書くのも癖になる。
0497デフォルトの名無しさん
2007/09/02(日) 13:47:29どうすればよいのでしょう。効率的に考えて
0498デフォルトの名無しさん
2007/09/02(日) 13:50:09似て非なるっていうか、ListとMapは別物じゃ?
0499デフォルトの名無しさん
2007/09/02(日) 13:55:44変換というか、Map型を継承しているクラスがList型で取り出せたりその逆も・・・出来る感じの事。
説明下手ですまそ。
0500デフォルトの名無しさん
2007/09/02(日) 13:57:46std::copy(map.begin(), map.end(), std::back_inserter( list ) )
でいけるんじゃね?効率なら知らん。
0501デフォルトの名無しさん
2007/09/02(日) 14:26:230502デフォルトの名無しさん
2007/09/02(日) 14:42:28っ アダプタパターン
0503デフォルトの名無しさん
2007/09/03(月) 01:48:49template <class T>
class hoger {
public:
typedef T hogeT;
struct fuga {
} m_fuga;
}
main()
{
hoger<int> Hoge;
hoger<型>::fuga &Fuga = Hoge.m_fuga;
}
みたいなことをやろうとしたんですが、hoger内の構造体とかを
(長くなってしまうので)ローカル変数で参照作って使いたいとき
hoger::fuga &ではなくhoger<型>::fuga &とする必要があると思うのですが
hoger<Hoge.hogeT>::fuga みたいに、Hogerオブジェクトからその型の情報は
得られないのでしょうか?
こういう情報(Hogeはintを指定して作成したということ)は外で持っておくしかないのでしょうか。
よろしくお願いします。
0504デフォルトの名無しさん
2007/09/03(月) 01:53:00うん。
何回も書くようなら typedef しとく。
0505デフォルトの名無しさん
2007/09/03(月) 02:01:24ありがとうございます。もう少し勉強してみます。
0506デフォルトの名無しさん
2007/09/03(月) 02:03:570507503
2007/09/03(月) 13:52:09>>506
なるほど、やっぱそうするしかないのですね・・
とりあえずはHoge.m_fuga.foo
みたいに全部書いて指定することにしました。
こういうのってテンプレートの仕様上仕方の無いことなんですかねぇ。
ヘッダにしか書けないのもそうだけど、非テンプレートコードと比べて
可読性が下がるのは、テンプレートの勉強を始めた自分にとっては
しょんぼり来てしまう(´・ω・`)
ともあれどうもありがとうございました。
0508デフォルトの名無しさん
2007/09/03(月) 14:09:430509デフォルトの名無しさん
2007/09/03(月) 20:01:180510デフォルトの名無しさん
2007/09/03(月) 20:10:05オブジェクト単位でコンパイル分ければいい
終わり
0511デフォルトの名無しさん
2007/09/03(月) 20:26:450512デフォルトの名無しさん
2007/09/03(月) 20:33:240513デフォルトの名無しさん
2007/09/03(月) 22:17:40暗黙のintは廃止されたから、
現在のC++での「auto x;」はコンパイルエラー。
「auto int x;」と書かないといけない。
0514デフォルトの名無しさん
2007/09/03(月) 22:20:45C++ 的には(C99もそうなったけど)宣言時の int の省略が認められないから一意に解釈可能なはず。
C89 での auto i; と同じ意味を持たせるなら auto int i; と書く必要がある。
0515デフォルトの名無しさん
2007/09/03(月) 22:21:250516デフォルトの名無しさん
2007/09/03(月) 23:35:130517デフォルトの名無しさん
2007/09/04(火) 04:09:37たとえば、123214332っていう数字があった場合、3桁区切りで123,214,332って表示しようと思ってる。
いい関数ない?やっぱ自作?,
0518デフォルトの名無しさん
2007/09/04(火) 04:13:24マルチしないでさっさとイネ
0519デフォルトの名無しさん
2007/09/04(火) 04:26:42setlocale
0520デフォルトの名無しさん
2007/09/04(火) 05:33:02ありがとう。
調べてみる。
0521デフォルトの名無しさん
2007/09/04(火) 07:51:20死ねカス
0522デフォルトの名無しさん
2007/09/05(水) 00:48:40デバッグモードでアサーション?がでる。
別の似たコードでは問題ないんだけどなぁ・・・。
原因がわからん
眠い。
寝る
0523デフォルトの名無しさん
2007/09/05(水) 01:04:21リリース時も同様に値がおかしいけど、エラーとして表示されてないだけってことはないよね。
0524デフォルトの名無しさん
2007/09/05(水) 02:36:54失敗してるアサートの条件を満たさないことがあるってことだな。
デバッガで現場を押さえればおおかた原因がわかるだろ。
0525デフォルトの名無しさん
2007/09/05(水) 10:39:580526デフォルトの名無しさん
2007/09/05(水) 11:00:35イテレータを取得し直さないで使おうとしたのがまずかったようだ。
うっかりやっちゃった。
リリースビルドではたまたま問題なかっただけってことかな。
0527デフォルトの名無しさん
2007/09/05(水) 15:00:58ソースは以下になります。
istream_iterator<string> start(cin);
istream_iterator<string> end;
vector<string> v(start , end);
C++を勉強始めたばかりで初歩的な質問だと思いますが、お願いします。
0528デフォルトの名無しさん
2007/09/05(水) 15:19:450529デフォルトの名無しさん
2007/09/05(水) 15:25:51デバッガで動きを確認したところ、標準入力から、
ちゃんとEOFが出るまで読み込んでいます。
しかし、vectorを作成する部分で止まってしまって
いる状況です。
0530デフォルトの名無しさん
2007/09/05(水) 15:51:510531デフォルトの名無しさん
2007/09/05(水) 16:20:550532デフォルトの名無しさん
2007/09/05(水) 20:33:36vectorの実行するところでループしている感じです
>>531
入力のcinの部分は実行されていました
0533デフォルトの名無しさん
2007/09/05(水) 20:48:31私の環境では動きましたよ。
0534デフォルトの名無しさん
2007/09/05(水) 22:48:500535デフォルトの名無しさん
2007/09/05(水) 22:57:190536デフォルトの名無しさん
2007/09/06(木) 12:02:54#include<iostream>
#include<istream>
#include<string>
#include<vector>
#include<algorithm>
#include<iterator>
using namespace std;
int main(){
cout << "Enter the seres of string::";
istream_iterator<string> start(cin);
istream_iterator<string> end;
vector<string> v(start,end);
…
}
こんなプログラムですが、やはり途中vectorの後にプログラムが進みません
コンパイラはg++-4.1を使っています。
わかる方宜しくお願いします
0537デフォルトの名無しさん
2007/09/06(木) 12:12:44>>531
0538デフォルトの名無しさん
2007/09/06(木) 12:19:41C++と全く関係ない話だ。
0539デフォルトの名無しさん
2007/09/06(木) 12:47:03こっちで再現できるだけのソースを貼るんじゃなかったら
その辺キッチリ書けよ
0540デフォルトの名無しさん
2007/09/06(木) 18:03:38ありがとうございました。
何とか解決しました
0541デフォルトの名無しさん
2007/09/06(木) 18:14:10これでは何の肥やしにもならない。
糞以下だね。
0542デフォルトの名無しさん
2007/09/06(木) 18:22:47すみません。
しかし色々いじっているうちに解決してしまったので、何がどうと言われても答えようがないのです。
0543デフォルトの名無しさん
2007/09/06(木) 18:35:01まぁまぁ、こういう奴はプログラミング向いてないから
いずれ挫折するなり淘汰されるなりしてこの分野から消えてくれるさ。
0544デフォルトの名無しさん
2007/09/06(木) 18:47:540545デフォルトの名無しさん
2007/09/06(木) 19:32:13プログラマとしても人間としても糞以下だね
0546デフォルトの名無しさん
2007/09/06(木) 20:11:090547デフォルトの名無しさん
2007/09/06(木) 20:37:280548デフォルトの名無しさん
2007/09/06(木) 20:58:040549デフォルトの名無しさん
2007/09/09(日) 23:45:03>色々いじっているうちに解決
いじる前後の違いを説明できないと言うのは理解できていないということ。
解決できていない可能性が高い。たまたま動いているだけのソースを直すのが...
0550デフォルトの名無しさん
2007/09/09(日) 23:47:30あと、自演乙
0551デフォルトの名無しさん
2007/09/10(月) 00:19:22これがダウトだったんだろうな
0552デフォルトの名無しさん
2007/09/10(月) 00:58:09どうもそれを禁止している条項が規格を洗っても見つからない。
誰か、どこにあるか知ってる人いますか?
0553デフォルトの名無しさん
2007/09/10(月) 01:10:260554デフォルトの名無しさん
2007/09/10(月) 01:55:41処理系依存だから禁止するのも処理系次第、ってことでいいんですかね。
0555デフォルトの名無しさん
2007/09/10(月) 02:02:420556デフォルトの名無しさん
2007/09/10(月) 02:03:29A pointer converted to an integer of sufficient size (if any such exists on the implementation)
and back to the same pointer type will have its original value;
mappings between pointers and integers are otherwise implementation-defined.
0557デフォルトの名無しさん
2007/09/10(月) 02:04:32VC++ でも g++ でも。
0558デフォルトの名無しさん
2007/09/10(月) 02:08:24でも、メンバポインタだと通らない。
警告じゃなくて、エラーになる。
0559デフォルトの名無しさん
2007/09/10(月) 02:16:340560デフォルトの名無しさん
2007/09/10(月) 02:20:11だったらメンバ関数のキャストの仕方間違ってるだけだろ
0561デフォルトの名無しさん
2007/09/10(月) 02:21:32namespace xxx_detail{ ふがふが }
ってのを見掛けるんですが、
これは何か意味あるんですか?
ADLの効果抑止とか?
無名namespace( namespace { げふげふ } )とかじゃダメなの?
0562デフォルトの名無しさん
2007/09/10(月) 02:26:30彼らがあくまでC++プログラマという事を忘れてはいけない。
0563デフォルトの名無しさん
2007/09/10(月) 03:40:05ヘッダで宣言するコンポーネントに無名 namespace の名前を使ったら、
コンパイル単位ごとに個別の宣言になっちゃうから、 ODR 違反になるだろ。
0564デフォルトの名無しさん
2007/09/10(月) 07:42:425.2.10 p4 の以下の記述がメンバへのポインタから整数型への変換を許しているように読める。
"A pointer can be explicitly converted to any integral type large enough to hold it."
でも 3.9.2 p3 に以下の記述がある。
"Except for pointers to static members, text referring to “pointers” does not apply to pointers to members."
"A pointer" も同様に、メンバへのポインタは含まないってことじゃない?
0565デフォルトの名無しさん
2007/09/10(月) 10:43:59[void*]を[整数型]として考える
0566デフォルトの名無しさん
2007/09/10(月) 10:56:38それだ! 凄いわ。ありがとう。
0567デフォルトの名無しさん
2007/09/10(月) 11:03:16ttp://www.kajisoku-f-2.com/dd/img2-03/img625_j01.jpg
ttp://www.kajisoku-f-2.com/dd/img2-03/img626_j02.jpg
0568デフォルトの名無しさん
2007/09/11(火) 11:27:29以下のようなコードを書きました。
//using namespace std;
//hoge pHoge = new hoge();
//pHogeList.push_back(pHoge);
list<hoge*>::iterator it = pHogeList.begin();
while(it != pHogeList.end()){
if (/*消滅条件が整ったら*/){
delete *it;
*it = NULL;
}
it++;
}
pHogeList.remove(NULL);
しかし、なぜかhogeオブジェクトを生産し続けると動作が極端に遅くなります。
双方向リストを使用し続けると動作が遅くなるということはあるのでしょうか?
このやり方が悪いのでしょうか? もしくは、別の原因があるのでしょうか?
0569デフォルトの名無しさん
2007/09/11(火) 12:01:450570デフォルトの名無しさん
2007/09/11(火) 21:41:350x00と"\x00"って何が違うんですか?
0571デフォルトの名無しさん
2007/09/11(火) 21:44:53数値と文字(列)の違い
0572デフォルトの名無しさん
2007/09/11(火) 22:01:11std::cout << typeid("\0x00").name() << std::endl;
0573デフォルトの名無しさん
2007/09/11(火) 22:13:320574デフォルトの名無しさん
2007/09/11(火) 23:16:31C++の場合、値としては同じ0でも前者はint型で、後者はchar型という違いがある。
0575デフォルトの名無しさん
2007/09/12(水) 00:32:31(この用語自体C++からみたいだけど)はcharなのね。
0576デフォルトの名無しさん
2007/09/12(水) 01:03:12IOストリーム作っていたときにそうすべきと感じたそう。
D&Eに書いてある。
0577デフォルトの名無しさん
2007/09/12(水) 03:26:380578デフォルトの名無しさん
2007/09/12(水) 03:40:04( 0x0)b
ノ| ,ノ|
(; 0x0)a
0579デフォルトの名無しさん
2007/09/12(水) 19:55:32int だったり wchar_t だったりもするけど
0580デフォルトの名無しさん
2007/09/12(水) 21:41:34/* main.cpp */
#inlucde "test.h"
main()
{
int a=1,b=2;
inlinetest(a,b);
}
/* test.h */
inline void inlinetest(int x,int y);
/* test.cpp */
#inlucde "test.h"
inline void inlinetest(int x,int y)
{
return;
}
上記の具合にinline関数を使おうとすると
「未定義のシンボル」とコンパイルエラーがでてしまいました。
inlineの使い方が間違っているのでしょうか?
ご指南お願いいたします。
0581デフォルトの名無しさん
2007/09/12(水) 21:55:52そうです。
0582デフォルトの名無しさん
2007/09/12(水) 23:14:20#inlucde
これは試したソースではちゃんとしてるんだろうか?
0583デフォルトの名無しさん
2007/09/12(水) 23:20:500584デフォルトの名無しさん
2007/09/12(水) 23:24:30inline関数はその呼び出された場所に展開されることが前提になりますから、
呼び出し元でその定義が分かるようにしなければなりません。
したがって、通常はヘッダ内で定義し、そのヘッダを#includeします。
>>580の場合は、test.hで定義するのが適当かと思います。
0585580
2007/09/12(水) 23:40:58頭の靄がいっぺんに貫かれて光が差し込まれたような晴々しい気分になりました。
丁寧な説明ありがとうございます。
0586デフォルトの名無しさん
2007/09/12(水) 23:53:530587register
2007/09/12(水) 23:56:060588デフォルトの名無しさん
2007/09/13(木) 00:25:43そう言えばconstも、今はプログラマ側の変更不可、副作用不可という側面が際立って紹介されてるけど
K&R読むとキャッシュへの最適化を促すregisterの様に、殆ど読み込みしかしないメモリに配置されて速度的に有利になる様な
最適化を、コンパイラへ促す効果があると記述されてたね。今のハードウェアの観点から考察すするとどうかは知らないけど。
0589デフォルトの名無しさん
2007/09/13(木) 16:50:41昔のコンパイラには良くある振舞い。まぁ今でも似たようなものか。
プロセス間で場合共有可能なページという感じで。
0590,588
2007/09/13(木) 21:06:230591デフォルトの名無しさん
2007/09/13(木) 22:26:55いいえ。
0592デフォルトの名無しさん
2007/09/13(木) 23:33:350593デフォルトの名無しさん
2007/09/13(木) 23:43:150594デフォルトの名無しさん
2007/09/14(金) 00:01:100595デフォルトの名無しさん
2007/09/14(金) 00:03:350596デフォルトの名無しさん
2007/09/14(金) 11:29:420597デフォルトの名無しさん
2007/09/15(土) 19:56:060598デフォルトの名無しさん
2007/09/15(土) 21:39:520599デフォルトの名無しさん
2007/09/17(月) 03:19:16スマートなやり方が思いつきません。
今は
vector<string> str;
テキストファイルから1行読み込み
str.push_back(読み込んだ文字列);
for(int i=str.size()-1;i>=0;i--) cout << str[i] <<endl;
こうしてるんだけど、これだとファイルが数百MByte以上になったときにバッファを大量に食うので避けたい。
打開策として、インプットファイルを終端からReadするって手があるのですが、
これ以外でいい方法はありませんか?
0600デフォルトの名無しさん
2007/09/17(月) 03:29:230601599
2007/09/17(月) 03:41:50あーなるほど!
それも一つの手ですね!
0602599
2007/09/17(月) 04:01:35お礼を言い忘れました。
どうもありがとうございました。
0603デフォルトの名無しさん
2007/09/17(月) 05:15:30元ファイルを調べて、「改行の次の位置」をvector<ifstream::pos_type>型のコンテナにでも詰め込めば、
あとは好きな行を取り出せる。
同じテキストファイルを、毎度毎度ひっくり返して表示する仕様の場合、
そのインデックスを、a.txtに対してa.indexとか名前付けて保存しておけば、2度目以降は速いよね。
0604デフォルトの名無しさん
2007/09/17(月) 07:14:59このスレの範疇からは外れるが。
0605デフォルトの名無しさん
2007/09/17(月) 08:23:03でもさ、>>599の場合だと、
結局は、一度は最初から最後まで全部読み込まないといけないことには変わりないし、
先頭から読んでいくのと違いあるのかな。
普通のモダンなOSはディスクアクセスから予測した先読みのキャッシュぐらいあるだろうし
0606デフォルトの名無しさん
2007/09/17(月) 09:16:070607デフォルトの名無しさん
2007/09/17(月) 12:10:29tail: オプションが違います -- r
詳しくは `tail --help' を実行して下さい.
0608デフォルトの名無しさん
2007/09/17(月) 13:31:440609デフォルトの名無しさん
2007/09/17(月) 13:34:05手ごろな内容なんじゃないかな。
0610デフォルトの名無しさん
2007/09/17(月) 13:35:000611デフォルトの名無しさん
2007/09/17(月) 14:05:180612デフォルトの名無しさん
2007/09/17(月) 14:18:170613デフォルトの名無しさん
2007/09/17(月) 14:26:420614デフォルトの名無しさん
2007/09/17(月) 14:32:090615デフォルトの名無しさん
2007/09/17(月) 14:35:550616デフォルトの名無しさん
2007/09/17(月) 15:17:220x00000F00
こってどういう意味なんでしょうか?
16進法かなと思うんですが
0617デフォルトの名無しさん
2007/09/17(月) 15:27:260x00000F00は10進数の3840だ。
0618デフォルトの名無しさん
2007/09/17(月) 15:29:330619デフォルトの名無しさん
2007/09/17(月) 15:31:05その数値自体の意味までは判らんよ。
0620デフォルトの名無しさん
2007/09/17(月) 15:37:410621デフォルトの名無しさん
2007/09/17(月) 15:39:47何がOKかさっぱりわからん。3840(10)=F00(16)ってだけだ。
わからんならWindows標準の電卓でも使ってくれ。
0622デフォルトの名無しさん
2007/09/17(月) 15:44:17一応C++の質問になるなじゃない?
CやC++など一部の言語では16進数を表記する文法として0x〜を採用しているだけで、
一般的に16進数を0x〜と表記するという規則はないでしょ。
0623デフォルトの名無しさん
2007/09/17(月) 15:50:1216進数だと思うけど。
0624デフォルトの名無しさん
2007/09/17(月) 15:56:260625デフォルトの名無しさん
2007/09/17(月) 15:58:360626599
2007/09/17(月) 16:00:52どうも、ありがとうございました。
勉強になります。
学校の課題とかではないです(私はもう学生ではないので…)
株と為替の時系列データを処理するプログラムを書いているのですが、
データの入手先によって、系列の時間が上り順のものと下り順のものの2種類あるので、
一方を並べ替えることで1つの書式にそろえようとしたわけです。
0627デフォルトの名無しさん
2007/09/17(月) 16:04:3617進数〜36進数という可能性も。
0628デフォルトの名無しさん
2007/09/17(月) 16:13:470629デフォルトの名無しさん
2007/09/17(月) 16:52:10死ね
0630デフォルトの名無しさん
2007/09/17(月) 16:57:010xDEAD
とか書かないと
0631デフォルトの名無しさん
2007/09/17(月) 17:01:140xDEAD=57005
実はお前さんの書き込み時間は、57分00.5秒だったのでは…
0632デフォルトの名無しさん
2007/09/17(月) 17:29:460633デフォルトの名無しさん
2007/09/17(月) 19:23:110634デフォルトの名無しさん
2007/09/18(火) 19:51:520635デフォルトの名無しさん
2007/09/18(火) 19:54:440636デフォルトの名無しさん
2007/09/18(火) 20:19:580637デフォルトの名無しさん
2007/09/18(火) 20:21:27C++はマルチパラダイム言語だ。そんな意味のない目標は捨てて身軽になろう。
OOPなんて所詮たくさんある道具の内の一つに過ぎない。
0639デフォルトの名無しさん
2007/09/18(火) 22:36:41というのはかなり納得した。特にC++のはそうだよな。
0640デフォルトの名無しさん
2007/09/18(火) 22:40:040641デフォルトの名無しさん
2007/09/18(火) 22:43:20概念だろ
0642デフォルトの名無しさん
2007/09/19(水) 00:03:17具体的には
std::list<int> a;
std::list<double> b;
func( a );
func( b );
のようにしたいです
0643642
2007/09/19(水) 00:12:490644デフォルトの名無しさん
2007/09/19(水) 00:17:08{
};
こんな感じ?
0645デフォルトの名無しさん
2007/09/19(水) 00:17:590646デフォルトの名無しさん
2007/09/19(水) 00:30:380647デフォルトの名無しさん
2007/09/19(水) 12:05:470648デフォルトの名無しさん
2007/09/19(水) 12:15:120649デフォルトの名無しさん
2007/09/19(水) 12:43:44それはOOPっていうか、古くは各種アプリのプラグイン(DLL)に始まる
インタフェイス抽象とかコンポーネント化とかの特徴のような気が・・・
0650デフォルトの名無しさん
2007/09/19(水) 20:34:13それは呼び出される側の再利用でなくて?
0651デフォルトの名無しさん
2007/09/19(水) 21:28:470652デフォルトの名無しさん
2007/09/19(水) 21:48:45今流行りのアスペルガーですか?
0653デフォルトの名無しさん
2007/09/19(水) 21:48:590654デフォルトの名無しさん
2007/09/19(水) 21:49:310655デフォルトの名無しさん
2007/09/19(水) 21:54:150656デフォルトの名無しさん
2007/09/20(木) 05:03:48とはどういういみですか?
0657デフォルトの名無しさん
2007/09/20(木) 05:09:02What abhorring is of of display of the value before it executes it by the guy of
exchanging numerical values it?
憎悪が交換数値の奴でそれを実行する前の価値の表示のものであること、それ?
(゚Д゚)?
0658デフォルトの名無しさん
2007/09/20(木) 06:20:59お前があほという意味じゃ
0659デフォルトの名無しさん
2007/09/20(木) 07:09:57例えばこんな感じ↓
class A {
public:
virtual int GetX() const = 0;
};
class B : public A {
public:
virtual int GetX() const { return x_; }
private:
int x_;
};
const A*型を使う場面があるのかが気になります。
0660デフォルトの名無しさん
2007/09/20(木) 07:20:550661デフォルトの名無しさん
2007/09/20(木) 07:31:21つけられるconstは全てつけるべき。
非constである必要ができたら、非const版を追加するかconstを外すか熟考すべし。
0662659
2007/09/20(木) 07:36:330663kkptcnZciZ
2007/09/20(木) 12:34:390664マターリ ◆AbENcvTP5o
2007/09/20(木) 14:27:35ttp://sports2.2ch.net/test/read.cgi/entrance2/1190215633/l50
0665デフォルトの名無しさん
2007/09/20(木) 14:57:12マルチすんな。
0666デフォルトの名無しさん
2007/09/20(木) 15:16:10ん?
プラグインやインタフェイス抽象は主として呼び出す側の再利用に繋がると思うけど。
呼び出される方の利用の仕方がまちまちだと、
呼び出す側はいちいちそれに合わせなくてはならないわけだけど、
インタフェイスや呼び出し規約(API)という形に抽象化し共通化しておくことによって、
呼び出し側を変更せずに機能を追加してゆくことができる。
もちろん呼び出される側を再利用する仕組みでもあるんだけど、
呼び出される側の再利用だけのためであれば単にAPI公開で十分なわけで。
0667デフォルトの名無しさん
2007/09/20(木) 16:37:16{
public:
void (A<T>::*func)();
};
template<class T> class B
{
public:
static void (B<T>::*func)();
};
template<class T> void (B<T>::*B<T>::func)() = NULL;
template<class T, class U> class C
{
public:
void (U::*func)();
};
template<class T, class U> class D
{
public:
static void (U::*func)();
};
template<class T, class U> void (D<T, U>::*U::func)() = NULL;
クラスDのようにしたいんですけど、どなたかわかる方いませんか?
Visual Studio2005 SP1
0668デフォルトの名無しさん
2007/09/20(木) 16:38:310669デフォルトの名無しさん
2007/09/20(木) 16:49:48{
public:
static void (U::*func)();
};
template<class T, class U> void (U::*D<T, U>::func)() = NULL;
こうだろ?
0670デフォルトの名無しさん
2007/09/20(木) 17:19:20ありがとう!!
昨日からずっと考えてたよ。
0671デフォルトの名無しさん
2007/09/20(木) 18:48:48template<class T, class U> void (U::*D<T, U>::func)() = NULL;
ってどういう意味?
0672デフォルトの名無しさん
2007/09/20(木) 19:04:46単なる、staticなメンバー変数funcの定義だよ。
NULLで初期化してるだけ。
0673デフォルトの名無しさん
2007/09/20(木) 19:05:530674デフォルトの名無しさん
2007/09/20(木) 20:44:48見る機会があったんだけど
そのどっちも、どう考えても継承ツリーの最底辺、絶対継承されっこないし実際されてない
javaだったらfinalがついてもおかしくないクラスのメンバで
継承元の仮想関数をオーバーライドしている関数にvirtualがついてた
薄々感じてはいたんだけどどんな状況でもオーバーライドした関数にはその目印にvirtualをつけるっていう
暗黙のコーディングルール(というかおまじない?)のようなのが流行してるのかな?
それともvirtual修飾子の意味をほとんどの人が誤解している?
0675デフォルトの名無しさん
2007/09/20(木) 20:51:490676デフォルトの名無しさん
2007/09/20(木) 20:56:410677デフォルトの名無しさん
2007/09/20(木) 20:58:33C# なんか存在しない頃から流行ってるよね。
0678デフォルトの名無しさん
2007/09/20(木) 21:24:070679デフォルトの名無しさん
2007/09/20(木) 21:26:070680デフォルトの名無しさん
2007/09/20(木) 21:27:370681デフォルトの名無しさん
2007/09/20(木) 21:40:33ということに最近気づいた
0682デフォルトの名無しさん
2007/09/20(木) 21:41:32俺はいつもコメントにoverrideって書くけど
C#がうらやましいぜ
0683デフォルトの名無しさん
2007/09/20(木) 21:53:43継承が深くなるとvirtualかどうか確認するのにいくつもヘッダーファイルを遡ることになるから、
overrideしたところにもvirtualがあるとわかりやすい。
いま基本クラスと書いたが途中からvirtualっていうのもありなんだよな。
#include <iostream>
using namespace std;
class A { public: void Say() { cout << "hello A" << endl; }};
class B : public A { public: virtual void Say() { cout << "hello B" << endl; }};
class C : public B { public: void Say() { cout << "hello C" << endl; }};
int main(){
A *a = new C(); a->Say();
B *b = new C(); b->Say();
return 0;}
結果
hello A
hello C
0684デフォルトの名無しさん
2007/09/20(木) 21:59:49俺はドキュメントなんか鼻から探すつもりもありませんがw
0685デフォルトの名無しさん
2007/09/20(木) 22:01:01理由は>>683と一緒。
0686デフォルトの名無しさん
2007/09/20(木) 22:01:120687デフォルトの名無しさん
2007/09/20(木) 22:06:180688デフォルトの名無しさん
2007/09/20(木) 22:26:150689デフォルトの名無しさん
2007/09/20(木) 22:35:25sealedは継承禁止じゃね?
0690デフォルトの名無しさん
2007/09/20(木) 22:36:54{
T.Hoge();
}
っておかしい?
型Tは何かわからないからそのメソッドHoge()を呼ぶのはおかしい?
0691デフォルトの名無しさん
2007/09/20(木) 22:37:32{
param.Hoge();
}
の間違いでした
0692デフォルトの名無しさん
2007/09/20(木) 22:38:24って仕様だとうれしいんだけど
小規模で作ってる分にはいらないけどさ
0693デフォルトの名無しさん
2007/09/20(木) 22:42:09オープンソース物みたいにソースがドキュメントって感じのだと、
そういう言語によるディレクティブは役に立つとは思うけど。
0694デフォルトの名無しさん
2007/09/20(木) 22:56:14メソッドに対するシールド。
class A { public virtual void Say() { .. ; }}
class B : A { public override sealed void Say() { .. ; }}
0695デフォルトの名無しさん
2007/09/20(木) 23:03:45それ上書き禁止で隠蔽とはいわないんじゃねーかと。
0696デフォルトの名無しさん
2007/09/20(木) 23:09:03やりたいことはこうよ。
class A { virtual F
class B : A { sealed F // Aに対するoverrideだが、この後の継承は上書き扱い(非virtual)になる。
0697デフォルトの名無しさん
2007/09/20(木) 23:10:36class A { public: void a() {}; };
class B : public A { public: template<typename> void a(); /*not implement*/ };
0698デフォルトの名無しさん
2007/09/20(木) 23:13:04それは隠蔽とは言わんだろ。
AやBにキャストしたら そのまま使えるんだし。
Javaだと覆い隠し(shadowed)とか言ってるような。
0699デフォルトの名無しさん
2007/09/20(木) 23:18:46プログラムそのものを変質させてしまう形でやってしまうのだろう
いったい誰がこんな風習を広めたのか気になって眠れない
0700デフォルトの名無しさん
2007/09/20(木) 23:19:09ぁーなるほど。
void (U::*)()の、D<T,U>::funcを。ってことね。
了解しますた。さんくす
0701デフォルトの名無しさん
2007/09/20(木) 23:19:49C#だとこれのことを隠蔽と言うだけどね。VBだとShadows。
sealedといったのは例えが悪かった。このnewがC++に欲しいという話。
class A { public virtual void Say() { .. ; }}
class B : A { public override void Say() { .. ; }}
class C : B { public new void Say() { .. ; }}
0702デフォルトの名無しさん
2007/09/20(木) 23:20:25問題ない。
もしTがメンバHogeを持っていなければ、エラーになる。
それなんて動的言語と言いたいところだが、
そこはC++なんでコンパイルエラー。
0703デフォルトの名無しさん
2007/09/20(木) 23:43:21悪い、それ隠蔽だわ。カプセル化の文脈で出てくるデータ隠蔽と勘違いしてた。
0704デフォルトの名無しさん
2007/09/20(木) 23:58:00死ね
0705デフォルトの名無しさん
2007/09/21(金) 00:28:53サンキュ
0706fIIPJstQwl
2007/09/22(土) 03:23:44[URL=http://www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=big0484.html]pussy[/URL]
<a href="http://www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=big0531.html">big cocks</a>
[URL=http://www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=big0531.html]pussy[/URL]
<a href="http://www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=big0682.html">big dick</a>
[URL=http://www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=big0682.html]pussy[/URL]
<a href="http://www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=big0731.html">big dicks</a>
[URL=http://www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=big0731.html]pussy[/URL]
<a href="http://www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=big0874.html">big naturals</a>
[URL=http://www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=big0874.html]pussy[/URL]
0707デフォルトの名無しさん
2007/09/22(土) 06:54:59{
void *a = (void*)new char[n];
/*...*/
delete[] (char*)a;
}
これってメモリリークを起こさずにうまく開放されるんでしょうか?
0708デフォルトの名無しさん
2007/09/22(土) 06:57:27メモリリークは開放処理を試みた後に発生する。
0709Kusakabe Youichi
2007/09/22(土) 07:16:590710デフォルトの名無しさん
2007/09/22(土) 10:27:23途中で例外が投げられてfuncを抜けるなどといった事態が起これば、
メモリリークするね。
0711デフォルトの名無しさん
2007/09/22(土) 11:06:37http://pc11.2ch.net/test/read.cgi/tech/1188748806/770
に書き込んでしまいました。
宜しくお願いします。
0712デフォルトの名無しさん
2007/09/22(土) 11:22:090713デフォルトの名無しさん
2007/09/22(土) 12:05:23>つけられるconstは全てつけるべき。
自分が読んだ本ではconst使いましょうという感じだったので
今までconst使っていたのですが、会社でconstを使うなといわれました。
const推奨派とconst禁止派みたいなのがあるのでしょうか?
0714デフォルトの名無しさん
2007/09/22(土) 12:18:58「(概念や仕様から考えて)変更しない」って理由でつけるべき
0715デフォルトの名無しさん
2007/09/22(土) 12:23:08全部付けた方が分かりやすいという考え方もある。
0716デフォルトの名無しさん
2007/09/22(土) 12:34:26const禁止とかどれだけ低脳なんだwww
取り合えず禁止になりうる理由として考えられるのは、
・API等に非constポインタを渡す必要があり、キャストの排除が最優先ルール
・クラスのconstメンバ関数にコンストラクタで代入できない
(↑もちろんメンバ変数の初期化は代入じゃなく初期化子並びを使うべきだが
C転向者が多くて教育コストがかかる)
・宣言が長くなるのでちょっと読みにくくなる
・メンバ関数の適切なconst指定も必要になってくるが、C転向(以下略
・既に非constで作り上げてしまった社内ライブラリを作り直せない。
・論理バグはコーディング工程で見付ける(コンパイルえらー)のではなく、
デバッグ工程で評価チームが見付けるものとして
スケジュールやら人員配分やらが組まれていて直せない。
・上位の人が勉強嫌い
0717デフォルトの名無しさん
2007/09/22(土) 12:39:23実際にはnew[]するときに、sizeof (T) * 要素数よりも
もう少し余分に確保されている可能性がある。
主にデストラクタを呼ぶ回数を記録するため。
もちろん、delete[]ではそれも含めて解放される。
0718NXRoXAzeEmJXNM
2007/09/22(土) 12:50:13[URL=http://www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=big0942.html]pussy[/URL]
<a href="http://www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=big1022.html">big tits</a>
[URL=http://www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=big1022.html]pussy[/URL]
<a href="http://www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=big1155.html">big tits round asses</a>
[URL=http://www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=big1155.html]pussy[/URL]
<a href="http://www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=black0124.html">black lesbians</a>
[URL=http://www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=black0124.html]pussy[/URL]
<a href="http://www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=black0284.html">black pussy</a>
[URL=http://www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=black0284.html]pussy[/URL]
0719デフォルトの名無しさん
2007/09/22(土) 12:51:29>delete[] は type* (この場合 char* )から
>sizeof(type) * (プログラマからは見えない、確保された要素数)
>の分だけのバイトを開放するという挙動でしょうか?
確実に言えるのは new[] で確保された領域が解放される、ということだけ。
サイズについては例えば 16 バイト単位とかに切り上げられてるかもしれない。
なお、delete[] については、静的な型と動的な型が一致することが要請されている。
> 14882:2003 5.3.5/3
>In the second alternative (delete array) if the dynamic type of the
>object to be deleted differs from its static type, the behavior is undefined.
で、気にしているだろうキャストについては、一度 void* にキャストした後、
元の型に戻した場合、値が一致することは保証されているので問題ない。
> 14882:2003 5.2.9/10
>A value of type pointer to object converted to “pointer to cv void” and
>back to the original pointer type will have its original value.
0720デフォルトの名無しさん
2007/09/22(土) 12:53:500721デフォルトの名無しさん
2007/09/22(土) 13:01:43静的な型とはソースコード上の型、
動的な型とは実際の型のこと。
例えば、クラスDがクラスBを継承していたとして、
こういうことはやめてということ。
B* p = new D[n];
delete[] p;
0722713
2007/09/22(土) 13:05:16なるほど、参考になります。ありがとうございます。
私のところではconstは一切禁止のようです。
「constを使うとコードの量が増えて読みにくい」
「constを使わずに読みやすいコードを書けば、コーディングミスも少ないから効率がよい」
という理由だそうです。
0723デフォルトの名無しさん
2007/09/22(土) 13:09:35質問させてください。
C++でリングバッファを作成しようと思っています。
Read PointerとWriter Pointer、そしてBufferを用意し、
Bufferから"複数バイト"を取得する、という処理です。
for(int i = 0; i < num; i++)
if(ReadPointer != WritePointer){
value = Buffer[ReadPointer];
ReadPointer = (ReadPointer + 1)%BufferSize;
}
else
break;
}
上記のように1バイトずつ読み込むならこれでいいとおもうのですが、
これでは1バイトごとに条件文+インクリメントが入るため避けたいです。
一気に複数バイトを読み込むことを考慮した場合、
"ReadPointerがWritePointer"を
越えないことを判断して、バッファを参照することが必要です。
複数バイトを読み込む場合を考慮したリングバッファを実現する
スマートなアルゴリズムはあるのでしょうか?
ReadPointer < WritePointerの位置関係からバッファ読み込みを
一気に行うことは容易ですが、ReadPointer > WritePointerの
位置関係からバッファ読み込みを一気に行う処理で詰まっています。
0724デフォルトの名無しさん
2007/09/22(土) 13:11:12組み込みでCを使ってるって言うのならまだ分かるが、
それでC++かよ。
0725デフォルトの名無しさん
2007/09/22(土) 13:15:23コードの量が増えるとは思わないけど。
constにも色々とあるけどさ。
0726デフォルトの名無しさん
2007/09/22(土) 13:32:05auto_ptr 使えば。
0727723
2007/09/22(土) 13:33:38ご返信ありがとうございます。
特に組み込みなどではありません。
通常リングバッファはどのようにして実装するのが通例となっているので
しょうか?セオリーなどが確立しているのでしょうか?
0728デフォルトの名無しさん
2007/09/22(土) 13:42:40new[]したものをdelete[]しないのは駄目だろ。
scoped_arrayとかshared_arrayとか結局Boost頼み。
0729デフォルトの名無しさん
2007/09/22(土) 13:46:48BufferSize-ReadPointer 分だけ memcpy してから、
ReadPointer をゼロにして続きを処理すればよい。
C++ では普通テンプレートベースの汎用クラスを用いる。
高速化の必要がある場合には自前で書く。
(ココに高速化の必要がある場合には、リングバッファから取り出して
別の場所へコピーなどしないでバッファを直接読んで処理する方が
良いことが多いけど)
0730デフォルトの名無しさん
2007/09/22(土) 13:52:42一度に20バイトずつコピー出来ても大して変わらないだろ
0731723
2007/09/22(土) 13:57:09ご返信ありがとうございます。確かに2回に分けてBufferを取得すれば
可能です。
テンプレートベースの汎用クラスを用いる、というのはdequeなどを
使用するということでしょうか?
高速化を目指しております。
>(ココに高速化の必要がある場合には、リングバッファから取り出して
>別の場所へコピーなどしないでバッファを直接読んで処理する方が
>良いことが多いけど)
汎用クラスを用いず、地道にmemcpyなどを使ってデータを取得したほうが
よいのでしょうか?繰り返しの質問になってしまいますが。
0732デフォルトの名無しさん
2007/09/22(土) 14:00:44>B* p = new D[n];
>delete[] p;
これダメなの? これに対応する為にvirtualデストラクタがあるんだと思ってたけど。
0733デフォルトの名無しさん
2007/09/22(土) 14:04:13そうではなくて、ココをチューニングする必要があるのは
おそらく数M〜数十Mバイト毎秒の処理を行う場合なわけで、
そんなものをメモリ上でこっちからあっちへコピーする処理自体
無駄なのでやらないようにする、ということです。
例えば映像のデコーダの入力段でリングバッファを用いるような場合、
read(buf, n) などとしていちいちバイト列をコピーして取り出すのではなく、
char* peek(size_t n) のように直接内部のバッファを覗くための関数を用意して、
リングバッファ終端以外では直接バッファ内のバイト列を処理するようにする、等。
0734デフォルトの名無しさん
2007/09/22(土) 14:09:24n番 からdバイトコピーするとする
if ( n + d - 1 > N){ memcpy(*,*, N - n - d); memcpy(*,*, n + d - N);}
else memcpy(*,*, d);
のようにすれば良い
0735723
2007/09/22(土) 14:11:23ご返信ありがとうございます。理解が乏しいかもしれないので
確認させてください。
readはmemcpyにより格納されたほかのバッファを利用する、ということで
peekはmemcpyで移さずにそのまま参照するということですね。
そして、リングバッファ自体はC++の汎用クラスを使って問題ないという
ことでしょうか?
>リングバッファ終端以外では直接バッファ内のバイト列を処理するようにする、等。
リングバッファ終端以外はpeak()、終端ではmemcpyなどを使って処理する、
ということでしょうか?
リングバッファの実装が初めてでなかなかイメージがわいてこない状況です。
何度も質問してしまって申し訳ありません。
0736713
2007/09/22(土) 14:13:21>>724は私(>>722または>>713)に対するレスかと思ってしまいましたw
違ったのですねw
>>725
仮引数とかにconstをつけるとコードの量が増えて読みにくいから禁止なのだそうです。
0738723
2007/09/22(土) 14:18:17実際のサンプルを教えてくださってありがとうございます。
ぜひ参考にさせていただきます。
0739デフォルトの名無しさん
2007/09/22(土) 14:19:42コードは間違ってる所あるけど、
終端を乗りこえていたら、分割して先頭からコピーすればいいだけ
0740デフォルトの名無しさん
2007/09/22(土) 14:30:07Q1.前半 Yes. 後半 No.
Q2.
用途によります。動画のデコーダなどの場合は一度にリニアに
アクセスするのは高々数十バイト程度なので、一時的なバッファに
コピーしてそこのポインタを返す、あるいは内部バッファを余分に
確保しておいて、バッファ先頭にある続きのデータをそこに複製して
リニアに読めるようにする、等。
読む側の処理が簡単なものなら、終端をまたぐケースだけ
前半、後半に分けて処理するようにしても良いでしょう。
Q1. の後半とも関連するのですが、ただひとつ言えることは
ここを自前で実装すべきなのは、レアケースであって、その場合には
プロファイラやテストなどを行って確かめつつ最適なコードを書く必要があり、
定石みたいなものは無いということです。
ただまぁmemcpyは各社最適化されていて早いコードで実装されてるので、
チューニングしたいんだけど時間がないとかいうときには便利。
0741デフォルトの名無しさん
2007/09/22(土) 14:32:000742デフォルトの名無しさん
2007/09/22(土) 14:33:50>724はあんた宛だと思うよ。
で、正直そんな会社は私の仕事関係なら出入り禁止にします。
0743デフォルトの名無しさん
2007/09/22(土) 14:34:05>コードの量が増えて読みにくい
本当にこれだけの理由なら↓これらに当てはまりそうだ。
http://pc11.2ch.net/test/read.cgi/prog/1139753744/
http://pc11.2ch.net/test/read.cgi/prog/1179420838/
http://pc11.2ch.net/test/read.cgi/prog/1169432098/
constがない→何らかの変換が行われる、と予想してそのつもりで読むからな。
constがあることは読み手への助けになるのだよ。
0744デフォルトの名無しさん
2007/09/22(土) 15:14:29仮想デストラクタがある場合に OK なのはこっち。
B* p = new D;
delete p;
0745デフォルトの名無しさん
2007/09/22(土) 15:19:04内容の是非はともかくこういう言い方ってDQNじみてると思うんだが
0746デフォルトの名無しさん
2007/09/22(土) 15:21:320747デフォルトの名無しさん
2007/09/22(土) 15:23:02これは仮想デストラクタがなくても領域自体は確保されるんですよね?
Dのデストラクタが呼び出されないのでコンストラクタとかでnewしててそれをデストラクタでdeleteしてる場合はだめだけど
0748713
2007/09/22(土) 15:28:43やはり私に対するレスなのですか。
では改めて・・・
>>724
組み込みではないけど、昔はCを使っていたそうなのでその名残でしょうか?
const以外にもいろいろ禁止されました。
私はfor文を
for(int i = 0; i < size; i++)
{
}
と書いていたのですが、これもダメで
int i;
for(i = 0; i < size; i++)
{
}
とか書かなければならないそうです。
理由は、私の書き方だと「速度が遅くなる」「使用するメモリが増える」からだそうです。私にはなぜそうなるのかよくわかりません。
>>743
確かに辞めたくなりますが・・・
いろいろダメだと言われても私は低スキル(頭が悪い)なので理由が良く理解できなくて
それでここで質問してみようかと・・・。
スレ違いでしょうか?
0749デフォルトの名無しさん
2007/09/22(土) 15:31:23おめーと同僚や上司は頭悪いよ
空白は無視されるのが規則なんだよ 速度に違いは出ない
0750デフォルトの名無しさん
2007/09/22(土) 15:34:57>理由は、私の書き方だと「速度が遅くなる」「使用するメモリが増える」からだそうです。私にはなぜそうなるのかよくわかりません。
寧ろ、あなたの書き方の方が速くなったりメモリが減るかも知れません。まぁ、大抵は同じでしょう。
いずれにしろ、一概には言えません。そんな根拠もないようなことを言っているようではお郷が知れると言うものです。
>確かに辞めたくなりますが・・・
私と一緒に働きませんか?w
>スレ違いでしょうか?
まぁ、宜しいのではないかと。
0751デフォルトの名無しさん
2007/09/22(土) 15:35:530752デフォルトの名無しさん
2007/09/22(土) 15:37:51>空白は無視されるのが規則なんだよ 速度に違いは出ない
i の宣言場所の違いが判らん香具師は黙ってらっしゃい。
0753デフォルトの名無しさん
2007/09/22(土) 15:41:37VCだと
for(int i = 0; i < size; i++)
って書いても
int i;
for(i = 0; i < size; i++)
こう書いてるように動くね
0754デフォルトの名無しさん
2007/09/22(土) 15:42:21それはVC6とかの話じゃないのか
0755デフォルトの名無しさん
2007/09/22(土) 15:48:42まじかー、紛らわしいというか不便だな。
B* p = new D[n];
delete[] dynamic_cast<D*>(p);
めんどくちゃいけど、これなら大丈夫だろうか。
まあ、ことさら >>732みたいに敢えて基底クラスのポインタで確保/解放する意味もないんだろうけどなぁ...
>>748
ちなみにそのfor文は上と下で i のスコープが変わると思うが、
for文に入る度にiが確保しなおされるとしたら速度変わるカモな。
使用メモリが増えるかどうかは分からん。
0756デフォルトの名無しさん
2007/09/22(土) 15:51:130757デフォルトの名無しさん
2007/09/22(土) 15:54:34>>753はVC(6以前)でスコープが同じになる事を言ってるんだよ
メモリ・速度云々は関係なく
0758デフォルトの名無しさん
2007/09/22(土) 15:57:58i, jで何か文句あんのか?
0759デフォルトの名無しさん
2007/09/22(土) 15:59:46単なるループ変数にたいそうな名前が付けられると
かえって読みにくくなるよね。
0760デフォルトの名無しさん
2007/09/22(土) 16:04:07実際こんがらがって間違える事例を数件目撃したことがある。
慣れてくりゃなんともないが初学者にiやjで教えるのはどうかと思うんだよなぁ
0761デフォルトの名無しさん
2007/09/22(土) 16:07:07俺は目視デバッグでチェック項目の一つになってるわ
0762デフォルトの名無しさん
2007/09/22(土) 16:10:24今じゃお決まりの変数として定着しているが
0763デフォルトの名無しさん
2007/09/22(土) 16:10:26それだけなら動くだろうけど、
p経由で扱えるのは先頭要素だけ。
メモリ上にDのインスタンスが連続して並んでいるので、
p[1]が指す位置は、先頭の次の要素ではなく、
おそらくDの配列の先頭要素内の中途半端な位置。
0764723
2007/09/22(土) 16:14:51ご返信ありがとうございます。
やりたいこととしては、参照用のリングバッファを書き込み用のリングバッファに
定期的に10KB〜300KB程度のデータを移したいと思っております。
(まず初めに最終的にやりたいことを書かなくてすいません)。
この場合は、終端をまたぐケースを考慮して(734さんのコードを参考、
2回の処理に分けるなどをする)、memcpyを使う、という方向で
考えたいと思います。
ただ一点、やはりC++の汎用クラスを使うのがいいのか、単純に
配列を使ってリングバッファを実装すればいいのか悩んでいるところです。
>ここを自前で実装すべきなのは、レアケースであって、その場合には
ここっていうのはreadとかpeak()のことですよね?
>言い切ってやる。高速化すべきポイントはそこじゃない。
この部分ばかりに注目するのではなく、
他の処理アルゴリズムをもっと最適化しろってことでしょうか?
確認ばかりのレスになってすいません。
0765デフォルトの名無しさん
2007/09/22(土) 16:15:05> これは仮想デストラクタがなくても領域自体は確保されるんですよね?
はい。
> Dのデストラクタが呼び出されないのでコンストラクタとかでnewしててそれをデストラクタでdeleteしてる場合はだめだけど
規格上は delete しちゃうと未定義動作。
>755
配列は polymorphic に扱わないというのが基本。理由は >763
0766713
2007/09/22(土) 16:16:59>私と一緒に働きませんか?w
そう言われるとなんだか嬉しいですwでも私は足引っ張りまくると思いますよ?w
>>755
>for文に入る度にiが確保しなおされるとしたら速度変わるカモな。
なるほど、私の上司は速度についてはそれを言っていたのかもしれません。
私はiのスコープをループの中だけに限定するつもりで
そのように書いていました。(これも本で読んだので・・・)
>>756
私はiやjを使っています。
0767デフォルトの名無しさん
2007/09/22(土) 16:25:30速さに違いが出るようなコンパイラなんて
窓から投げ捨ててしまえ。
そんなことで速さに違いが出るのだったら、
設計思想的に、はなからこんな機能導入されていない。
0768デフォルトの名無しさん
2007/09/22(土) 16:28:36for ( int i= )の方が速いのでは?
その都度変数を確保すればレジスタに乗りやすいが、確保してあったままではHDDやメモリに乗っている可能性が高い
0769755
2007/09/22(土) 16:31:58>>755は>>753に対して何か言ったつもりはないけど、
その話は(他のスレだったかで)聞いたことがアルよ。
>>762
多分 i = index のi じゃないかな。配列で使うことが多い気がする。
jは単にiの次の文字。
>>763,>>765
なるほど、このスレ見なければそのまま使ってたところだ。
勉強中でg++では問題なさそうに見えたからね。情報ありがとう!
>>767,>>768
まあ実際には気にするほどな差が出るとは思わないよね。
0770デフォルトの名無しさん
2007/09/22(土) 16:34:23いつの時代のコンパイラ使ってるんだ? お前は。
0771デフォルトの名無しさん
2007/09/22(土) 16:36:43intでは無くiteratorだった場合差が出ても果たして糞コンパイラ未満と言えるだろうか。
0772デフォルトの名無しさん
2007/09/22(土) 16:36:58C(とCが全盛だった時代の貧弱なコンパイラ)ならまだ分かるかもしれないが、
今の時代のC++でやることじゃないだろ。
絶対に関わりあいたくないから、どこで働いているのか晒してくれないか?w
0773デフォルトの名無しさん
2007/09/22(土) 16:38:09君には入社できないから
0774デフォルトの名無しさん
2007/09/22(土) 16:39:42前提を変えるなアホ。
そのイテレータのコンストラクタが100MBぐらいメモリを確保するんだったらどうだろうかとか、
いくらでも話を広げられるじゃないか。
0776デフォルトの名無しさん
2007/09/22(土) 16:42:05板違い気味だけど
>>771
俺だったら滅茶苦茶速度に過敏なコードだったら
例え速度が全く等しくてもポインタにする
0777デフォルトの名無しさん
2007/09/22(土) 16:47:58http://ja.wikipedia.org/wiki/FORTRAN
0778デフォルトの名無しさん
2007/09/22(土) 16:52:18基本的に、C/C++ではローカル変数は全てスタックに確保される。
その場合、その確保作業は関数突入時にのみ行われる。
従って、次のようなコードはどちらも確保に伴うコストに変わりはない。
但し、後者の場合は最初のiと後のiで違うメモリを確保する可能性は、ある。
--
void func()
{
int i;
...;
for (i = 0; i < N; ++i) ...;
...;
for (i = 0; i < N; ++i) ...;
}
void func()
{
...;
for (int i = 0; i < N; ++i) ...;
...;
for (int i = 0; i < N; ++i) ...;
}
--
# 勿論、後者もiの有効範囲が重ならないことは容易に判る訳で、真っ先に最適化の対象にはなりそうだが。
0779デフォルトの名無しさん
2007/09/22(土) 16:53:29私だったら、滅茶苦茶速度に過敏なケースにコンテナは使わないな。
0780デフォルトの名無しさん
2007/09/22(土) 16:57:00>後者の場合は最初のiと後のiで違うメモリを確保する可能性は、ある。
つまり関数突入時に二つのiを確保するということかな?
だとすれば、速度/メモリ量共に影響があるじゃないか!
0781デフォルトの名無しさん
2007/09/22(土) 16:58:44可読性も決して軽視出来ない要素だろ・・・条項
0782デフォルトの名無しさん
2007/09/22(土) 16:59:53馬鹿だな、全く最適化を考慮しない場合の話だぞ。
それに、速度には全く影響ないじゃないか。
0783デフォルトの名無しさん
2007/09/22(土) 17:03:16>馬鹿だな、全く最適化を考慮しない場合の話だぞ。
その場合のつもりで言ったんだ。
>それに、速度には全く影響ないじゃないか。
すまん、勘違いだった。
0784713
2007/09/22(土) 17:04:42>ぶっちゃけ日本のC++PGの何割がEffective C++とか読んでんだろうな
Effective C++は持っていますが難しくて分からないところがたくさんありました。
私の会社ではconstのことを考えるとEffective C++とか読んでるのは私だけですかねぇ・・・。
0785デフォルトの名無しさん
2007/09/22(土) 17:06:27お前の環境についてはしったこっちゃないが。
俺様の環境ではスタックポインタを4つ減らすか8つ減らすかの違いでしかないな。
あと俺様のコンパイラはお前以上に頭がいいので、ひとつしか使わないがな。
0786デフォルトの名無しさん
2007/09/22(土) 17:08:22そもそも使わない分までスタックポインタを移動しない。
0787713
2007/09/22(土) 17:39:37ブロック内でfor文やif文など以外のブロックを作成してはならないと言われました。
理由は「行数が増えたりして読みにくくなる」「変数は関数の先頭で宣言したほうが読みやすい」からだそうです。
私はこんな感じで { } を使うことがたまにあります。
void hoge(void)
{
{
}
}
私の会社では禁止なのですが、この書き方は一般的なのでしょうか?
皆さんはこのように { } を使うことはありますか?
0788デフォルトの名無しさん
2007/09/22(土) 17:45:51デストラクタの実行タイミングを細かく制御したいとき(セマフォなどの共有リソースを使ったりとか)には
よくそういう包み方することはあるな。
0789デフォルトの名無しさん
2007/09/22(土) 17:46:42変数を使う範囲を明示するために頻繁に使うよ。
その会社には仕事を頼みたくないな…。
0790デフォルトの名無しさん
2007/09/22(土) 17:47:53俺はあまりやらない。その内側のブロックを関数化するかもしれない。
0791デフォルトの名無しさん
2007/09/22(土) 17:49:02そんな会社辞めちまえ、ダメプログラマにされるぞ
0792デフォルトの名無しさん
2007/09/22(土) 17:49:28>>787
>理由は「行数が増えたりして読みにくくなる」「変数は関数の先頭で宣言したほうが読みやすい」からだそうです。
この辺でお郷が知れる。
こう書く人が多かったりしない?
--
FILE * fp;
fp = fopen(...);
0793デフォルトの名無しさん
2007/09/22(土) 17:55:17尻穴みたいな井の中の蛙になりたくないなら
学習の意欲のあるうちに辞めちまったほうがいい
あるいは部署変えてPG以外の業務勉強したほうがためになりそう
0794デフォルトの名無しさん
2007/09/22(土) 18:01:32それは禁止されてていい
0795デフォルトの名無しさん
2007/09/22(土) 18:03:07C++といいつつ実質Cとして使ってる制御系か?
VC++6.0以前とMFC使ってる業務系か?
制御で「const使うな」はありえんか
0796デフォルトの名無しさん
2007/09/22(土) 18:14:000797デフォルトの名無しさん
2007/09/22(土) 18:16:170798デフォルトの名無しさん
2007/09/22(土) 18:20:00関数内の { } は変数などのスコープを限定するツールとして役に立つよ。
スコープを限定するのがどういいのかは、話すと長いが...
グローバル変数がよくない(誰がどういうタイミングでアクセスするのか
把握できなくなる・しにくくなるから)のとおおよそ同じ理屈。
根拠のない(しかもわりと間違っている)ローカルルールが多いね。
チーム内で1人で反抗してもしょうがないとは思うけど、
ちゃんとしたプログラマになるつもりなら、
後学のためにまず初学者向けの良書を読んでおくことをお勧めする。個人でね。
Effective C++よりももうちょっと易しいものから読んだ方がよさげ。
...って何がいいんかね。C++ Coding Standardsってのも良書でお勧めできるけど、
やっぱりちょっと早いような。
0799デフォルトの名無しさん
2007/09/22(土) 18:21:020800713
2007/09/22(土) 18:24:51>>792
いいえ、C++ Builderを使っているのでファイルにアクセスするときは
みんなVCLを使っていると思います。
VCLに関連して「Delphiを使うかもしれないからC++のライブラリに依存してはならない」
という理由でSTLも禁止になりました。
STL禁止は守れそうにありません。
>>794
その理由は
「行数が増えたりして読みにくくなる」「変数は関数の先頭で宣言したほうが読みやすい」からですか?
>>795
前述のようにC++Builderを使っています。
パソコンからいろんなものを制御しています。
0801デフォルトの名無しさん
2007/09/22(土) 18:29:48悪いことはいわんからとっとと逃げ出したほうがいいんじゃないか、その会社。
正直言ってアホしかいねーだろ、どうみても。
0802デフォルトの名無しさん
2007/09/22(土) 18:34:13>>773
これなら刺身の上にタンポポを乗せる仕事のほうがまだマシだ。
0803デフォルトの名無しさん
2007/09/22(土) 18:36:110804デフォルトの名無しさん
2007/09/22(土) 18:40:08なぜそするの? → 以前からそうだから。
こう変えたほうが良いのでは? → 今までこれでうまく言っているのだから変えるべきではない。
ということが多すぎ(--;
とりあえず社内ルールだからと割り切ってるが、本来どうあるほうが良いのかという勉強は欠かさないつもり。
0805デフォルトの名無しさん
2007/09/22(土) 18:40:12テンプレートは使えるんだろうか。
というかなぜC++を使っているんだ。
もういっそのこと全部Delphiでいいだろ。
0806デフォルトの名無しさん
2007/09/22(土) 18:45:25それを決めた時点では妥当だったりそれなりの理由があったりするものだが、
その後状況が変わってもそれを盲信して変えないという状況に陥りがちなんだよな。
なぜそうするのかが忘れさられて、ただルールだからという理由で守られ続ける。
0807デフォルトの名無しさん
2007/09/22(土) 18:47:450808デフォルトの名無しさん
2007/09/22(土) 18:54:41コピペ改変コーディングしか出来ない奴が大半と見た
0809713
2007/09/22(土) 19:04:23>テンプレートは使えるんだろうか。
テンプレートは上司が知らないので使いすぎると
また禁止になる可能性があると思います。
>というかなぜC++を使っているんだ。
>もういっそのこと全部Delphiでいいだろ。
これは私の推測ですが、
C言語は知っている
↓
Windowsの時代になりGUIのソフトを作成しなければならない
↓
Visual C++は難しいのでDelphiを使う
↓
C++Builderが発売
↓
慣れたC言語を使いたくてC++Builderを使う
と、こんな感じではないかと・・・。
>>807
私の会社では組み込みのプログラミングはありません。
0810デフォルトの名無しさん
2007/09/22(土) 19:16:04上司や同僚が親切に「(このコンパイラでは)〜の方が速くてコンパクトなコードが出る」と
教えてくれてるのかもしれないし。
0811デフォルトの名無しさん
2007/09/22(土) 19:37:16とか言いながら読むんだろうな。
0812デフォルトの名無しさん
2007/09/22(土) 19:38:530813デフォルトの名無しさん
2007/09/22(土) 19:44:27Delphi移植論でいけば例外処理はありとなってほしいところだが。
0814デフォルトの名無しさん
2007/09/22(土) 19:45:11企業としての品質を維持するために共通ルールを設けるのは構わないが、ある程度の幅を持たせておき
その幅をプロジェクトごとにきめる形にするのがいい。
設計段階でのレビュー作業や、コードレビュー、プロジェクト完了時点での反省会議などをきちんとやれる会社でさえ、
コーディングルールは決まっていないことが多いから仕方ないことなのかも知れないが。
0815デフォルトの名無しさん
2007/09/22(土) 19:48:481990年だからもう20年近く前になるんだが
0816713
2007/09/22(土) 20:27:49え?>>810は私に対するレスですか?
私はパソコンで使用するソフトを作成しているので
組み込みの仕事では無いと思います。
ついでにコンパイラはC++Builderのそれです。
>>813
名前空間は使っているところをまだ見られていないと思うので分かりません。
上司が名前空間という機能を知っているかどうかも分かりません。
例外処理は勉強不足で私自身分かっていないのでなんともいえません。すみません。
>>814
私の会社はプログラマが少ないせいなのか、決まったルールは無いようです。
入社して間もない私が今まで誰もしなかった書き方をしていたので
上司は他の人も読めるようにしたかったのではないでしょうか。
また、コードレビューや反省会議といったものは特に無いようです。
0817デフォルトの名無しさん
2007/09/22(土) 21:01:470818デフォルトの名無しさん
2007/09/22(土) 21:05:08話になってるな
そういうのはマ板でやってくれんか
0819デフォルトの名無しさん
2007/09/22(土) 21:29:570820デフォルトの名無しさん
2007/09/22(土) 21:45:550821713
2007/09/22(土) 21:59:46>>818>>820
すみません。
>>819
それはconstのかわりにということですか・・・。
見つかるとそれも禁止になると思います。
スレ違いになってきたようなのでこの話はこのへんで止めます。
レスして下さった皆様、今日はありがとうございました。
0822デフォルトの名無しさん
2007/09/22(土) 22:23:460823デフォルトの名無しさん
2007/09/22(土) 22:25:240824デフォルトの名無しさん
2007/09/22(土) 22:27:55現状はそれですが、プロファイラが遅いと言っています。
0825デフォルトの名無しさん
2007/09/22(土) 22:28:04cout << setw(n) << ' ';
0826デフォルトの名無しさん
2007/09/22(土) 22:32:57ソレダ
どうもありがとうございました。
0827デフォルトの名無しさん
2007/09/22(土) 23:20:47meta-x なんちゃら
でDebugからclass構造のブラウズ、リファクタリングまで
なんでもできちゃう環境とか作れるのでしょうか?
elispは最近おぼえました
0828デフォルトの名無しさん
2007/09/23(日) 00:28:450829デフォルトの名無しさん
2007/09/23(日) 00:32:300830デフォルトの名無しさん
2007/09/23(日) 00:33:300831デフォルトの名無しさん
2007/09/23(日) 00:50:31愛だね。
0832デフォルトの名無しさん
2007/09/23(日) 01:37:410833デフォルトの名無しさん
2007/09/23(日) 01:39:20Effective C++, Effective STL, Exceptional C++, Exceptional C++ Style
くらいは読んでね。同僚の迷惑にならんよう。
0834デフォルトの名無しさん
2007/09/23(日) 01:43:32Effective C++, Effective STL, Exceptional C++, Exceptional C++ Style
を読めるようになるまで5年はかかる
0835デフォルトの名無しさん
2007/09/23(日) 01:45:46オマイラなんでそんな意地悪なことばっか言うわけ?
0836デフォルトの名無しさん
2007/09/23(日) 01:46:460837デフォルトの名無しさん
2007/09/23(日) 01:48:243番めのはちょっと難しいかなとは思うけど、読まないとダメダメなコード
書いちゃうのがC++なんだから読むしかないべ。
新入社員に読ませてるけど、あんまり脱落しないよ?
0838デフォルトの名無しさん
2007/09/23(日) 01:52:490839デフォルトの名無しさん
2007/09/23(日) 01:53:410840デフォルトの名無しさん
2007/09/23(日) 02:12:25日本人だとエピスがちょっと書けるかな?
程度
0841デフォルトの名無しさん
2007/09/23(日) 02:14:490842デフォルトの名無しさん
2007/09/23(日) 02:25:07上司「俺の知ってるCの一部の機能だけで書け」
ってことか・・・
0843デフォルトの名無しさん
2007/09/23(日) 03:40:50なんかで読んだ。
ついでに、private継承を使う人もすくなくC#では
結局public継承だけにしたらしい。
ま、ようは、C++は、そんだけ難解ってことなんだろうな。
0844デフォルトの名無しさん
2007/09/23(日) 03:44:29代替手段がありすぎてまずしようとは思えないな
0845デフォルトの名無しさん
2007/09/23(日) 03:47:08boost::noncopyable
0846デフォルトの名無しさん
2007/09/23(日) 05:16:580847デフォルトの名無しさん
2007/09/23(日) 10:19:02実際は「Javaっぽく+テンプレート少々」ぐらいだろ。
本当にC++でしかできないような変態コード書かれたらかえって大迷惑
0848デフォルトの名無しさん
2007/09/23(日) 10:33:150849デフォルトの名無しさん
2007/09/23(日) 10:34:55JavaっぽいC++のコードってこんなんか?
RAII?何それ。何でもかんでもnewするよ
ただの関数(オブジェクト)でいい場合でもいちいちクラスを作るよ
関数ポインタ?boost::function?いや、インタフェースでしょ
不要な場合もいちいちシングルトンを作るよ
テンプレートよりも継承、ポリモーフィズム、オブジェクトコンポジションを
多用するよ
ゲーって感じだな
0850デフォルトの名無しさん
2007/09/23(日) 10:36:200851デフォルトの名無しさん
2007/09/23(日) 10:42:520852デフォルトの名無しさん
2007/09/23(日) 10:50:520853デフォルトの名無しさん
2007/09/23(日) 10:54:210854デフォルトの名無しさん
2007/09/23(日) 10:54:47C++のテンプレートほど強力ではないけれども
0855デフォルトの名無しさん
2007/09/23(日) 10:58:09普通にC++っぽいと思うよ
GC型のほとんどのOO言語にも勿論Cにも真似の出来ないことだ
0856デフォルトの名無しさん
2007/09/23(日) 11:13:24そういえばC++はガベコレに最も適している言語だ。と語っている文章を見たことがある。
理由:「ガベージコレクタが管理すべきリソースが最小になるから」
0857デフォルトの名無しさん
2007/09/23(日) 11:38:26いやさすがにそこまでじゃないが自分のコードに超汎用は求めないってことよ。
0858デフォルトの名無しさん
2007/09/23(日) 11:58:13だったらC++使う必要なくね?
0859デフォルトの名無しさん
2007/09/23(日) 12:00:23俺もアプリ部分は気楽に書いちゃう
0860デフォルトの名無しさん
2007/09/23(日) 12:02:120861デフォルトの名無しさん
2007/09/23(日) 12:02:510862デフォルトの名無しさん
2007/09/23(日) 12:04:37動作変えるにも引数で十分な場合がほとんどじゃね
0863デフォルトの名無しさん
2007/09/23(日) 12:04:580864デフォルトの名無しさん
2007/09/23(日) 12:48:220865デフォルトの名無しさん
2007/09/23(日) 12:54:170866デフォルトの名無しさん
2007/09/23(日) 13:08:420867デフォルトの名無しさん
2007/09/23(日) 13:11:460868デフォルトの名無しさん
2007/09/23(日) 13:22:47ブラウザの「Firefox」はC++言語で書かれていると聞きましたが、本当でしょうか?
さらに、文字列の処理に標準のものを使わず、自前で文字列処理を作ってしまったと
聞きました。これも本当なのでしょうか?
情報が錯綜しすぎてて、何が何だか分からなくなってしまいました。
(さらに、それはなぜなの?とか聞くのは、厚かまし過ぎるかな・・・)
0869868
2007/09/23(日) 13:32:19錯綜してるってのはただの言い訳で、自分に基礎知識と読解力が無いだけですよね。
自分が聞いた情報というのは、
・以前はそうでもなかったが、現在ではC++よりJavaで書いた方が
優れたソフトウェアを作る事が出来る
・標準の処理が用意されているのに、自前で処理を作ってしまう事は
「車輪の再生産」と呼ばれ、忌み嫌われている
です。
この情報か、あるいはFirefox製作者のスタンスのどちらかが間違っているのか
あるいは両方とも間違いではなくて、Firefoxは「そうせざるを得ない」特殊な状況にあるのか
判断の材料が無いのです。
0870デフォルトの名無しさん
2007/09/23(日) 13:41:01ソースはダウンロードできるからあらぬ妄想を膨らませないで調べてみたら
http://developer.mozilla.org/ja/docs/Download_Mozilla_Source_Code
0871デフォルトの名無しさん
2007/09/23(日) 14:17:20「優れた」の評価方法にも拠るが、言語による優劣はつかないと考えるのが一般的。
例えばパフォーマンス最優先ならJavaの不利な点が顕在化するかもしれないし、
機種依存性を排除したいのならC++には言語仕様にグラフィックを含まないことが問題になるかもしれない。
> ・標準の処理が用意されているのに、自前で処理を作ってしまう事は「車輪の再生産」と呼ばれ、忌み嫌われている
標準ライブラリの実装に不満がある場合は、忌み嫌うかどうかに関わらず作る必要がある。
それはまた、言語に拠らない。
0872デフォルトの名無しさん
2007/09/23(日) 14:37:10>>871 標準ライブラリの実装に不満がある
このような場合車輪の再発明(再生産?)には当たらないと思うよ。
URLエンコードとか特殊な文字列処理かもしれないしね。
あと、このネタはソフトウェア板の方がふさわしい気がする。
0873デフォルトの名無しさん
2007/09/23(日) 15:49:53class A {
private:
int a;
public:
A() { a = 10; }
void put() { printf("%d\n", a); }
virtual ~A() {}
};
class B : public A {
private:
int b;
public:
virtual ~B() {}
};
0874デフォルトの名無しさん
2007/09/23(日) 15:50:27class D : public B {};
void a(A* d)
{
for (int i = 0; i < 3; i++) { d[i].put(); }
}
int main(int argc, char* argv[])
{
D* d = new D[3];
a(d);
delete [] d;
return 0;
}
の時出力されるaの値は全て10を表示すると思ってるんですが・・・。
ならないのは何でなんでしょうか?
Visual Studio2005 SP1
0875デフォルトの名無しさん
2007/09/23(日) 15:59:56関数a()の中では、引数として渡された配列をA型の配列としてアクセスしているが、
実際はD型の配列なので、A::aとは違うところのメモリを読んで出力している可能性が高い。
0876デフォルトの名無しさん
2007/09/23(日) 16:02:200877デフォルトの名無しさん
2007/09/23(日) 16:15:16と言う事は配列ではなく1つ1つnewする必要があるってことですね?
0878デフォルトの名無しさん
2007/09/23(日) 16:16:25出力される値は
10
4290540
-842150451
です。
875さんが言ってるとおりの動きをしてますね
0879デフォルトの名無しさん
2007/09/23(日) 16:31:200880デフォルトの名無しさん
2007/09/23(日) 16:35:25STLではどうするんでしょうか?
今調べていたら、More Effectiveの項目3に書いてあるとネットでみたんですが
解決方法は規定クラスのポインタの配列で扱えば大丈夫ってわかりました。
0881879
2007/09/23(日) 16:41:090882デフォルトの名無しさん
2007/09/23(日) 16:49:19規定クラスのポインタの配列で試したらうまく動きました!!
ありがとうございました
0883デフォルトの名無しさん
2007/09/23(日) 21:19:03webで情報を集めようと思いましたが、
「Cをやってから」とか書いてあるところしか見つかりません。
良いサイトを教えていただけますか。
0884デフォルトの名無しさん
2007/09/23(日) 21:27:30何が悪くて何が良いのか、こっちは知らないわけだが。
エスパーにでも頼め。
0885デフォルトの名無しさん
2007/09/23(日) 21:34:07じゃあCをやってから読むといいとおもうよ
0886デフォルトの名無しさん
2007/09/23(日) 21:36:03「わかりやすくきれいにまとめてあって、
間違った説明がなく、
C++についてのみまとめてある」
webページをご存知でしたら教えてください。
0887デフォルトの名無しさん
2007/09/23(日) 21:43:140888デフォルトの名無しさん
2007/09/23(日) 21:46:34「わかりやすく」も「きれいに」も主観なので、残念ながらだれもご存知ないでしょうね。
0889デフォルトの名無しさん
2007/09/23(日) 21:47:160890デフォルトの名無しさん
2007/09/23(日) 21:50:20http://ja.wikipedia.org/wiki/C++
分かり難かったり汚かったりしたら自分で修正できるしさらにC++についてのみ書かれた夢のようなサイトがあったわwwwwww
0891デフォルトの名無しさん
2007/09/23(日) 21:51:10名前が名前だから仕方ない
0892デフォルトの名無しさん
2007/09/23(日) 22:19:28コンパイラの最適化レベルによらずにコンパイル時に計算になる例が欲しいです。
よろしくおねがいします。
0893デフォルトの名無しさん
2007/09/23(日) 22:27:25T array[Size];
std::cout << sizeof(array) / sizeof(* array);
0894デフォルトの名無しさん
2007/09/23(日) 22:31:21各要素のサイズで割れば要素数が得られる。
でもsizeofがポインタ変数のサイズを返さないで配列全体のサイズを返すのって文法として正しいの?
コンパイラ依存じゃないよね?
っつーか内部でどうやってんだろ
0895デフォルトの名無しさん
2007/09/23(日) 22:36:15sizeofはコンパイル時に評価するのだから、オペランドが配列かポインタかは判別できるだろう。
ポインタならポインタのサイズだし、配列なら配列全体のサイズになるだけ。
0896デフォルトの名無しさん
2007/09/23(日) 22:37:20最適化前提でいいなら、
template<class T, int N> int len(T (&)[N]){return N;}
というのがわりと有名。
>892,895
sizeofを使うマクロに比べてこの関数がよいのは、配列以外をこの関数に
与えるとコンパイルエラーになること。
最適化無しで数値にできる方法は知らない。
Boostスレのほうがいいかもな。
0898デフォルトの名無しさん
2007/09/23(日) 22:50:42コンパイラ依存ではない
基本的にarrayは宣言以外はポインタだが
sizeof演算子のオペランドの場合は配列になる。
0899892
2007/09/23(日) 22:54:17ありがとうございます。
これでもいいんですが、できれば array が配列名以外の場合(ポインタとか)の場合に
コンパイルエラーになってほしいです。
boostスレ逝ってきます
0900デフォルトの名無しさん
2007/09/23(日) 22:55:21この len いいね。
最適化〜のくだりが分からないんだけど、何か問題があるのですか?
0902デフォルトの名無しさん
2007/09/23(日) 22:57:220903デフォルトの名無しさん
2007/09/23(日) 23:02:30template<typename T, size_t N> char (&lengthof_helper_char_array(T (&a)[N]))[N];
#define lengthof(a) (sizeof(lengthof_helper_char_array(a)))
0904デフォルトの名無しさん
2007/09/23(日) 23:03:06static int g_x=len(g_array);
としたときに、デバッグ時などで最適化をかけないでコンパイルすると、g_xは
len関数呼び出しによって動的に初期化されることになってしまう。sizeofの割
り算だとそういうことにはならない。すると、初期化のコストはともかく、g_x
が未初期化(0)の状態で(他の翻訳単位のグローバル変数の初期化などで)参照さ
れてしまうケースが生じるかもしれず、マズ-。
ということだと思われ。グローバル変数関係ないんだったら、lenをバシバシ
使えばよさげ。
0905903
2007/09/23(日) 23:09:17ぐぐればすぐ見つかると思ってたけど意外と見つからなかったんで
ここにメモがき。
0907デフォルトの名無しさん
2007/09/23(日) 23:13:030908900
2007/09/23(日) 23:18:02そうか、あくまで関数だってこと忘れてた。
グローバル変数については、「初期化の順序を勝手に想定するな」みたいなことは本で読んだことがあるよ。
自分流に書き直したバージョン載せてみる。
template<class T, std::size_t N> inline std::size_t len(const T(&)[N]){return N;}
0909デフォルトの名無しさん
2007/09/23(日) 23:18:360910892
2007/09/23(日) 23:24:35かー。わかりました。
0911デフォルトの名無しさん
2007/09/23(日) 23:28:02いやちがう,910だとしたら
template<typename T, size_t N>
char (*lengthof_helper_char_array(T(&)[N]))[N];
だ。&lengthof_... というのはいったい?
0912903
2007/09/23(日) 23:29:10関数テンプレートの引数については >>896 といっしょね。
903 は戻り値で値を返すんじゃなくて元の配列と同じ長さの char 型の配列を
返すように宣言してる。 sizeof(char) は 1 なので、この配列に sizeof を
かければ元の配列の長さが得られる。 sizeof の引数の式は実際に実行される
ことがないので、定義は要らない。
typedef とか使ってもっと簡単なコードにしたいところだけど、 template のせいで
同じ記述を何度か繰り返すことになり、あんまりすっきりしない。
0913デフォルトの名無しさん
2007/09/23(日) 23:33:24C++ではテンプレート引数で指定した型に固有のメソッドを呼び出すことは文法的に正しいのでしょうか?
例えば
struct Printable {
void print() { std::cout << "hello" ; } } ;
template <typename T> class Foo : public T {
public: void echo() { print() ; } } ;
と定義した時に、Foo<Printable>のオブジェクトがPrintableのメソッドを呼ぶのはC++の文法として正しいのでしょうか?
cygwinのg++だと怒られるのですが、solarisのCCだと素通りされるので正しく書いているのかよくわからないのです。
0914デフォルトの名無しさん
2007/09/23(日) 23:33:35&lengthof_... は配列への参照を返すようにしてる。 C/C++ で配列を返す関数は
宣言できないから。で、参照でも sizeof に渡せば同じことになってくれる。
0915デフォルトの名無しさん
2007/09/23(日) 23:36:15http://gcc.gnu.org/gcc-3.4/changes.html
↑の "unqualified names will no longer find members of a dependent base" でしょ。
this->print() にしてみたらどう?
0916デフォルトの名無しさん
2007/09/23(日) 23:42:01ありがとうございます。
もうすこしだけ教えていただけませんか?
理解の為、まず
char c3[] = {1,2,3};
char (&rc3)[3] = c3;
int main(){}
こう書いてみたらこれはコンパイルできました。
次に、
char (&f(int))[3]; // これは何.....
int main(){}
こう書いてみたら、これもコンパイルできてしまったんですが、
私は一体何を宣言したことになるのでしょうか?
0917デフォルトの名無しさん
2007/09/23(日) 23:45:03普通、配列を返す関数は作れないよね?
この宣言が許されるのが不思議だ...。
0918912
2007/09/23(日) 23:47:230920913
2007/09/23(日) 23:49:13どうもありがとうございました
0921デフォルトの名無しさん
2007/09/23(日) 23:51:12何がわかったの?
916の実験続き
char (&f(int))[3];
int main() {
return sizeof(f(10000));
}
は3が戻った。
次に、
char (&f(int))[3];
int main() {
f(100);
としてみたら、
undefined reference to `f(int)'
でリンクできなかった。とりあえずここまで。
0922デフォルトの名無しさん
2007/09/23(日) 23:53:50こんな関数の定義方法があるのか!企画のどこに書いてあるんだろう?
char (&f(int))[3] {
static char x[3];
return x;
}
int main() {
f(100);
びっくりしました。ありがとうございました。みなさま。
0923デフォルトの名無しさん
2007/09/24(月) 00:05:070924デフォルトの名無しさん
2007/09/24(月) 00:06:120925>>917-919
2007/09/24(月) 00:08:191.関数は配列を返すことは出来ないが、配列の参照ならば返すことができる。
その宣言方法は
char (&f())[3]; //char[3]の参照を返す関数fを宣言。
2.sizeof に関数呼び出しを与えても、関数呼び出しを行わない。返り血のサイズを返すのみ。
sizeof(f()); //この値は 3
これをtemplateで応用して上記1の配列サイズ(3)をNとし、Nはテンプレートのパラメータにする。
さらに、任意の型で仕様できる用に、typename Tもパラメータに加え、関数fの引数に与えオーバーロードさせる。
使いやすい様に sizeof(〜)全体を囲って #defineすれば>>903の出来上がり。
こんな形で実体の関数が使えるなんて知らなかった。sizeofめ。
0926デフォルトの名無しさん
2007/09/24(月) 00:10:380927デフォルトの名無しさん
2007/09/24(月) 00:13:08class Foo{
void Bar();
}
このBarって関数は、Tを全く使ってない
超巨大な関数なんですが、
exportが実装されてないコンパイラでは
これもヘッダに入れなきゃいけないんでしょうか…
あるいはBarの中身をなんか別のとこに追い出して
単純にそれを呼ぶだけの関数にするしかないですか。
0928デフォルトの名無しさん
2007/09/24(月) 00:19:04> 単純にそれを呼ぶだけの関数にするしかないですか。
もっとも分かりやすい解決法はこれだと思うが
避ける理由は?
0929デフォルトの名無しさん
2007/09/24(月) 00:19:24はい。
T 使ってないなら何も問題なく追い出せるでしょ。
0930デフォルトの名無しさん
2007/09/24(月) 00:28:13ひょっとしたらコンパイラの実装次第によっては、
出来るかもしれません。
もれなく鼻から悪魔が出てきますが、
0931デフォルトの名無しさん
2007/09/24(月) 12:40:350932デフォルトの名無しさん
2007/09/24(月) 13:12:360933デフォルトの名無しさん
2007/09/24(月) 13:15:55メンバ変数がすべてテンプレートパラメータに依存した型でなくてもいいだろ。
ついでにそういうメンバ変数のためのメンバ関数があってもおかしくないだろ。
0934デフォルトの名無しさん
2007/09/24(月) 13:40:37>>927のようなとき
Foo<int> a;
Foo<char> b;
があるとBar()は2個作られてしまいますか?
0935デフォルトの名無しさん
2007/09/24(月) 13:45:45vectorのsizeとかのことかな
0936デフォルトの名無しさん
2007/09/24(月) 13:46:58そこまで頭のいいコンパイラはなかなかないんじゃない?
0937デフォルトの名無しさん
2007/09/24(月) 14:01:14おれもテンプレになってる理由が分からなかったが、
ひょっとしてこのクラス Bar以外にメンバーあるの?
0938デフォルトの名無しさん
2007/09/24(月) 14:02:50という噂をcppllあたりから又聞きしたような気がしないでもないけど。
そういう実装は普及してるのかな。(というか本当にやってる?)
0939デフォルトの名無しさん
2007/09/24(月) 16:24:16VC6ではそれをやってるのを確認したよ
別々に作られると思ってて、ポインタ型のを<void*>にまとめる
とかやってたんだが無駄な努力だった
当時のg++はやってなくてバンバンふくれてた
今はどうだかしらない
0940デフォルトの名無しさん
2007/09/24(月) 18:31:43みなさん使ってます?
0941デフォルトの名無しさん
2007/09/24(月) 18:43:050942デフォルトの名無しさん
2007/09/24(月) 18:45:01Cのstderrはunbuffered決め打ちだったけど、C++では選べると。
0943デフォルトの名無しさん
2007/09/24(月) 19:35:27別にCだってsetvbuf()すりゃいいだけだがな
0944デフォルトの名無しさん
2007/09/24(月) 20:32:470945デフォルトの名無しさん
2007/09/24(月) 21:05:16...
try{
Instance = new Class;
...いろいろ処理...
}
catch( ExceptionA& ){...}
catch( ExceptionB& ){...}
delete Instance;
こんな書き方って普通?
bool status = true;
try{ なんか処理 }
catch( ... ){ status = false; }
return status;
とか。
0946デフォルトの名無しさん
2007/09/24(月) 21:12:520947デフォルトの名無しさん
2007/09/24(月) 21:15:210948デフォルトの名無しさん
2007/09/24(月) 21:16:25少なくとも上は普通ではない。
boost::scoped_ptr<>とかstd::auto_ptr<>とか使って
deleteを隠匿するのが普通。
0949デフォルトの名無しさん
2007/09/24(月) 21:17:08お前病気じゃね
いやまじで
0950デフォルトの名無しさん
2007/09/24(月) 21:26:000951デフォルトの名無しさん
2007/09/24(月) 21:50:56tribool関係ねーだろカスはすっこんでろ
0952デフォルトの名無しさん
2007/09/24(月) 21:56:410953C ◆jGKdrJZSEs
2007/09/24(月) 21:57:290954デフォルトの名無しさん
2007/09/24(月) 22:35:00なんかもぅよくわからなくなってきました。
0955デフォルトの名無しさん
2007/09/24(月) 22:39:10boost::mplを使ってみろ。話はそれからだ。
0956デフォルトの名無しさん
2007/09/24(月) 22:46:49そこまで行くのがまず大変だな。
0957デフォルトの名無しさん
2007/09/24(月) 22:56:34そこまでいってすらいないど素人です。
0958デフォルトの名無しさん
2007/09/24(月) 22:57:320959デフォルトの名無しさん
2007/09/24(月) 23:00:320960デフォルトの名無しさん
2007/09/24(月) 23:05:020961デフォルトの名無しさん
2007/09/24(月) 23:07:07http://www.google.com/
0962デフォルトの名無しさん
2007/09/24(月) 23:07:23わかりました。
0963デフォルトの名無しさん
2007/09/24(月) 23:14:490964デフォルトの名無しさん
2007/09/24(月) 23:17:540965デフォルトの名無しさん
2007/09/24(月) 23:27:25MPLをまともに使おうとは思わない俺はヘタレ。
いやまあ、確かに面白いけどねぇ。
0966デフォルトの名無しさん
2007/09/25(火) 01:03:580967デフォルトの名無しさん
2007/09/25(火) 01:36:42using namespace std;
template < typename T >
class Hoge
{
typedef list< T > listT;
typedef listT::iterator listTit;
};
これをVC2003でコンパイルしても
構文エラー : ';' が、識別子 'listTit;' の前に必要です。
ってエラーになるんですがC++の仕様ですか?
0968デフォルトの名無しさん
2007/09/25(火) 01:38:510969デフォルトの名無しさん
2007/09/25(火) 01:41:53なんだかよくわからんけどコンパイル通りました
ありがとうございます
0970デフォルトの名無しさん
2007/09/25(火) 01:50:26このdependent nameの問題、会社でもよく聞かれるんだけど、詳しく解説してる日本語のサイトご存知ないですか?
"typename"だけじゃなくて、できれば"template"が必要な件にも触れてあると嬉しいです。
0971デフォルトの名無しさん
2007/09/25(火) 01:53:42Hogeの定義の部分ではlistTが具体的にどのクラスかは確定していなくて
コンパイラにはiteratorというのが型なのか値なのかがわからないかららしい。
0972デフォルトの名無しさん
2007/09/25(火) 08:27:480973デフォルトの名無しさん
2007/09/25(火) 16:50:53キャラクタークラスからゲーム管理クラスにアクセスする必要がある場合、
ゲーム管理クラスへのポインタをstaticで持つべきか悩んでいます。
// 設計1
class CharacterOwner {...};
class Character {
protected:
static CharacterOwner* owner_;
...
};
class GameManager : CharacterOwner {
public:
...
private:
std::vector<Character*> characters_;
};
class CharactorA : Charactor {...};
// 設計2
class CharacterOwner {...};
class Character {...};
class GameManager;// 設計1と同じ
class CharacterA : Character {
private:
CharacterOwner* owner_;
...
};
0974デフォルトの名無しさん
2007/09/25(火) 16:51:30設計1の問題点
・CharacterAのインスタンスが生成されるより前に、Character::owner_が初期化されることが保障されていない
・基底クラスのメンバは仮想関数だけにしたい(拘る必要なし?)
設計2の問題点
・CharacterAのインスタンス毎にポインタを保持するオーバーヘッドが気になる
一般的にどちらの設計にするべきですか?
0975デフォルトの名無しさん
2007/09/25(火) 19:40:25循環依存もダメだろ。
一回引き出しにしまって一週間後に見直してみよう。
0976デフォルトの名無しさん
2007/09/25(火) 20:53:02{
public:
virtual A* f(){ return new A; }
};
class B : public virtual A
{
public:
virtual B* f(){ return new B; }
};
class C : public virtual A
{
public:
virtual C* f(){ return new C; }
};
class D : public B, public C
{
public:
virtual D* f(){ return new D; }
};
多重継承(仮想継承)すると vc8 だと「あいまいな継承」とコンパイルエラーになるんですが
C++仕様的にはどうなんですか?因みに cygwin の gcc ではコンパイル通ります。
0977デフォルトの名無しさん
2007/09/25(火) 21:17:15GameManagerをシングルトンにして、
static GemeManager *GameManager::GetInstnace()
{
static GameManager instance;
return &instance;
}
とかするのはどう?
GameManager派生クラスを作るなら、これじゃだめだけど。
0978デフォルトの名無しさん
2007/09/25(火) 21:22:460979デフォルトの名無しさん
2007/09/25(火) 21:27:08・表記法が乱雑になるので参照にすべき
・両方考慮して両方共に実装すべき
0980デフォルトの名無しさん
2007/09/25(火) 21:29:57NULLが返ることなんかないし、オマエみたいなボケがdeleteしたり
しないためにも参照で返せアホ
0981デフォルトの名無しさん
2007/09/25(火) 21:33:350982デフォルトの名無しさん
2007/09/25(火) 21:34:520983デフォルトの名無しさん
2007/09/25(火) 21:34:55>・表記法が乱雑になるので参照にすべき
どっちも何が言いたいのかワカラン
0984デフォルトの名無しさん
2007/09/25(火) 22:42:23一般的には個々の状況において、自分で責任を持って判断すべきでしょう。
とはいえ、俺なら何となく設計2を選びたくなるかな。
一番素直だし。
個々のCharacterがGameManagerにアクセスする必要性があるんでしょ?
(他のキャラクターを検索して行動を決めるとか、別の物体(弾とか?)を追加したり)
キャラクターが自分が所属する空間を認識したり影響を与えるのは自然のことのように思えるし。
メモリの無駄が気になるならstatic(やシングルトン等)にするか、毎回引数で引き渡すか。
前者はGameManagerのインスタンスが一つと決まっているならわりとよくある手。
後者は複数のGameManagerが同時に存在して、かつ、メモリの無駄を省く必要性があるなら、仕方ないところ。
というか、設計1と2だったら関数一つ挟めば、いつでも切り替えられるように出来るでしょう。
とりあえずシンプルな方を選んでおけば?
0985デフォルトの名無しさん
2007/09/25(火) 23:01:55いろいろクラスを設計してみているのですが、
なんか継承を使う機会がなかなかありません
継承かなと思ってもいやこれは継承じゃなくてメンバ変数に他のクラスが入ってるだけだなってなります
メンバ変数に他のクラスが入ってるようなときにがんばれば継承でも書けるような気がしないでもないのですが
そうするのって正しいのでしょうか?
0986デフォルトの名無しさん
2007/09/25(火) 23:08:460987デフォルトの名無しさん
2007/09/25(火) 23:12:540988デフォルトの名無しさん
2007/09/25(火) 23:24:56たとえばどんなクラスを設計した?
0989デフォルトの名無しさん
2007/09/25(火) 23:25:27継承の利点は、ベースクラスの再利用というのもあるけど、
ポリモーフィズムで既存のコードを修正せずにどんどん拡張できるというのが一番大きい。
だから、大規模なプログラムでサブクラスがたくさん必要になるようなケースじゃないと
継承の利点はあまり出てこない。
0990デフォルトの名無しさん
2007/09/25(火) 23:50:42初めてちゃんと継承にお礼が言えた。
0991デフォルトの名無しさん
2007/09/26(水) 00:05:07どっちでもいいんじゃないかな言いたいことは伝わってくるよ
俺は無神論者なんでownerみたいなのを個体に置きたくなかったから
他の個体を調べたりownerへの参照が必要な操作はstatic関数としてまとめてしまった
>>974
生命体の群みたいのを扱うとどうしても循環参照ができちゃうんだよ
こいつらは目ん玉がついてて自分で自分たちのことを認識するんだからしようがない
0992デフォルトの名無しさん
2007/09/26(水) 00:07:07ここをちゃんと理解できたって思うまで継承は絶対に使っちゃダメだよ。
0993デフォルトの名無しさん
2007/09/26(水) 00:29:28ベースクラスに何もしないフィルタを作っておいて、それを継承して暈しフィルタや色フィルタ、
更にそれらを継承してバリエーションを持たせるとか。
0994973
2007/09/26(水) 01:17:37なるほど、シングルトンはすっかり忘れていました。
>>984
参考になります。
最初に考えたGameManagerへのアクセスが、まさに弾などの追加でした。
>>991
static関数を使う方法もあるんですね。
シングルトンにするか、設計2の方法でいくか、もう少し考えてみます。
どうもありがとうございました。
0995デフォルトの名無しさん
2007/09/26(水) 02:00:39一例としては、クラスAが別のクラスBを使う時、クラスBが行う処理を実行時に
変更できるようにしたい場合に継承が必要になる。
つまり、
class A {
void foo(B &b) { b.bar(); }
};
class B {
virtual void bar();
};
class B1 : public B { /* ... */ };
// ...
int main() {
A a;
B1 b1;
B2 b2;
// Aを変更しなくてもBを継承したクラスを新しく作る事で
// A::fooの動作を変更できる
a.foo(b1);
a.foo(b2);
}
AとBが同じクラスならTemplateMethodパターンと言う奴になる。
0996v(^・^)v
2007/09/26(水) 04:10:54http://pc11.2ch.net/test/read.cgi/tech/1190745673/
0997デフォルトの名無しさん
2007/09/26(水) 07:12:250998デフォルトの名無しさん
2007/09/26(水) 10:26:250999デフォルトの名無しさん
2007/09/26(水) 10:29:181000デフォルトの名無しさん
2007/09/26(水) 10:35:3910011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。