トップページ⇒tech
1001コメント308KB

C++相談室 part56

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん2007/07/26(木) 00:33:07
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前には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:43
■Books■
amazon.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:54
■Books(Templateまわり)■
Effective 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
■Libraries■
[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:15
STLつかうと一気に実行ファイルサイズが10倍に?!
0007デフォルトの名無しさん2007/07/26(木) 00:41:50
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない
0008デフォルトの名無しさん2007/07/26(木) 00:42:25
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
0009デフォルトの名無しさん2007/07/26(木) 00:42:55
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
0010デフォルトの名無しさん2007/07/26(木) 00:46:14
#include <stdafx.h>
後死ね。
0011デフォルトの名無しさん2007/07/26(木) 00:46:44
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
0012デフォルトの名無しさん2007/07/26(木) 00:49:27
1 ttp://piza.2ch.net/tech/kako/980/980175292.html
2 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:22
31 ttp://pc5.2ch.net/test/read.cgi/tech/1086185282/
32 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:45
BOOTSを語れゴラァ part2
http://pc11.2ch.net/test/read.cgi/tech/1139266461/
0016デフォルトの名無しさん2007/07/26(木) 05:49:15
>>1ぬるぽ乙
0017デフォルトの名無しさん2007/07/26(木) 10:42:40
>>1
乙

>>15
靴は関係ねぇだろ、靴は!
また↓みたいなことにしたいのか?
http://pc11.2ch.net/test/read.cgi/tech/1139266461/58-76
0018デフォルトの名無しさん2007/07/26(木) 18:23:15
注:私の有意義な発言に対し、自分の理解不足を棚に上げ煽り、1行レス
で返す方が多いようですが、そのような方はスレの皆様を混乱させるだけでなく
スレの雰囲気を崩しかねないのでお黙り下さい。
また質問者は回答者に知識を披露する場を与える貴重な存在なので、
質問者を見下した回答、あまりにも儀礼を欠いた回答も厳重に禁止いたします。
忙しい中、少ない時間の合間を縫って質問しに来てるわけですので、
その辺ご承知下さい。なお、当方が質問に対して有意義な答えであると
判断した方には評価いたしますので各自よく調べ、よく考え正確な回答をするように。
0019デフォルトの名無しさん2007/07/26(木) 18:27:49
けちがついたことだし、改めて57立てるかね。
0020デフォルトの名無しさん2007/07/26(木) 20:43:14
君2ちゃん初心者?
0021デフォルトの名無しさん2007/07/26(木) 23:59:54
潔癖症だな
俺は資源は再利用する派だな
0022デフォルトの名無しさん2007/07/27(金) 06:17:22
テンプレじゃなかったのか。
0023デフォルトの名無しさん2007/07/27(金) 09:43:25
ブーツを脱いで朝食を
0024デフォルトの名無しさん2007/07/27(金) 18:12:47
STLのmapのキーにstringとかって指定できないんですか?
map<string, CHoge *>
みたいにして、文字列で検索をかけたりしたいのですがどうすればいいのでしょうか?
0025デフォルトの名無しさん2007/07/27(金) 18:19:25
できるだろ。
0026デフォルトの名無しさん2007/07/27(金) 18:20:11
とりあえずやってみれ。
0027デフォルトの名無しさん2007/07/27(金) 18:20:57
前スレをぬるぽで埋めてきました。
0028デフォルトの名無しさん2007/07/27(金) 18:27:36
うむ、ごくろうであった。

   ☆  ガッ
    ヽ■━⊂(・∀・ )
   (´・ω・`)
0029242007/07/27(金) 18:27:51
>>25-26
すいません。できました。
*.insert(pair<string, CHoge *>())
のCHogeの名前(ホントは違う名前)が間違ってましたww
ご迷惑おかけしました。
0030デフォルトの名無しさん2007/07/27(金) 19:05:41
だからstd::make_pairを使えと
0031デフォルトの名無しさん2007/07/27(金) 19:58:51
>>30
はいw
0032デフォルトの名無しさん2007/07/28(土) 00:19:52
関数の引数を参照にしても内部的にはポインタと同じになるの?
0033デフォルトの名無しさん2007/07/28(土) 00:23:49
ならん。
0034デフォルトの名無しさん2007/07/28(土) 00:46:07
なるかどうかは実装次第
0035デフォルトの名無しさん2007/07/28(土) 01:21:06
参照は単にコンパイル時に一意に決まるインスタンスへの別名ということ?
ポインタとは違う実装というのは具体的にどんなものがあるの?
0036デフォルトの名無しさん2007/07/28(土) 07:50:55
ポインタで書くよりも参照で書いた方が最適化が利き易い。
最適化の結果、(関数のインライン化などで)差がつくこともしばしば。
0037デフォルトの名無しさん2007/07/28(土) 10:23:56
STLのvectorに関して質問があります。
main() {
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:41
>>37
int v[] = {0, 1, 2,};
std::vector<int> vec(v, v + sizeof(v) / sizeof(* v));
じゃいかんの?
0039デフォルトの名無しさん2007/07/28(土) 10:34:37
std::copyとか?
0040デフォルトの名無しさん2007/07/28(土) 10:43:24
std::copy(v, v + sizeof v / sizeof *v, vec.begin());
0041デフォルトの名無しさん2007/07/28(土) 10:50:19
>>38-40
レスありがとうございます。
書き忘れましたが、std::vector<int> vec;は別のところで宣言しているため
>>38さんのやり方では無理でした・・・すいません。

なので、copyについてググってたら答えが、、
>>40さんありがとうございます。

sizeof vとかっていう()の無い使い方初めて見たのですが、sizeof()と同じですか?
0042デフォルトの名無しさん2007/07/28(土) 10:52:37
sizeof はカッコ不要。
つけたければつけていいけど。
0043デフォルトの名無しさん2007/07/28(土) 10:53:35
>>41
対象が型名でないsizeofは括弧を必要とはしていない。
0044デフォルトの名無しさん2007/07/28(土) 10:54:42
>>42-43
そうだったんですか。。勉強不足でした。ありがとうございます。
0045デフォルトの名無しさん2007/07/28(土) 11:04:36
>>37 assign()
0046デフォルトの名無しさん2007/07/28(土) 11:16:34
>>45
vectorにassign()というのも用意されてたんですね、、
ありがとうございます。
0047デフォルトの名無しさん2007/07/28(土) 11:27:52
こうやって参照渡しにNULLが渡せるのは規格として正しい動作なんですか?
gcc4.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
>>47
未定義動作。
0049デフォルトの名無しさん2007/07/28(土) 11:37:28
>>48
ありがとうございます。

具体的にどの部分が未定義動作になりますか?

1, *str (NULLの参照外し)
2, 参照型にNULLアドレスの実体が渡る事
3, funcのif条件で&strとして参照型のアドレスを見に行った事

1と2で合ってますか?
そもそも1が未定義なので2は起こる事はあり得ないはずという認識の方がいいんでしょうか?
0050デフォルトの名無しさん2007/07/28(土) 11:44:59
1 は、参照先にアクセスしたり参照の初期化に使ったりしない限りは未定義じゃない。
例えば main 内で &*str がヌルポインタになるのは well-defined 。
だから、未定義なのは 2 と 3 。
0051デフォルトの名無しさん2007/07/28(土) 11:45:49
良く分かりました。ありがとうございました。
0052デフォルトの名無しさん2007/07/28(土) 12:16:54
>>50
それって↓ここにある話だよね?
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#232

現行の規格では 1 も未定義動作と読めるから、ダメだと考えておいた
ほうがいいんじゃない?
0053デフォルトの名無しさん2007/07/28(土) 12:22:51
DirectX SDKに以下のクラスがあって
D3DVECTOR(Cバージョン。float x,y,zのみ)
D3DXVECTOR3(C++バージョン。上記にメンバ関数が付いた)

後者を引数として受け取る関数
func( D3DXVECTOR3 &v )
に前者D3DVECTORを渡そうとしているのですが、型が違うという
エラーがでるので、func( (D3DXVECTOR3)v )とキャストしています。

問題なく動いているのですが、こういうキャストって文法的に問題無い
のでしょうか?なんとなく違和感があって
func( *((D3DXVECTOR3*)&v) )
こっちに直そうかと思っているのですが…
0054デフォルトの名無しさん2007/07/28(土) 12:32:14
ちょっと試してみたのですが、メンバ変数が異なるクラスを
func( (D3DXVECTOR3)hoge );
とするとちゃんとエラーが出ますね。ということはコンパイラが
ちゃんとそこまで判断して通してくれているのでやはり合法
なのかな?
0055デフォルトの名無しさん2007/07/28(土) 12:32:50
>>52
あら、そうだったんだ。すまん。
0056デフォルトの名無しさん2007/07/28(土) 12:38:55
>>53
http://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
>>53
>>56
とりあえずVC7.1で試してみた感じだと、
「組み込み型では通らないけどユーザー定義型なら通る」っぽい。
0058デフォルトの名無しさん2007/07/28(土) 13:55:59
>>56>>57
なるほど、やぱり駄目な書き方なのですね。私も最初エラーになると
思ったのですが、動いてしまったのでむしろ驚きました。
ちなみにこちらは.NET2003です。

>メンバ変数が異なるクラスは駄目
ここら辺はVCの独自拡張なのかな?
とりあえず以下の書き方に直します。
func( *((D3DXVECTOR3*)&v) );
0059デフォルトの名無しさん2007/07/28(土) 16:40:05
どこをどうすればそこまで誤読できるんだ?
0060デフォルトの名無しさん2007/07/28(土) 16:44:32
>>59
それが説明できるくらいなら誤読しないだろ。
0061デフォルトの名無しさん2007/07/28(土) 17:33:43
あれ?誤読してます?
文法的に問題ないということでしょうか?

func()の引数にconst付ければ問題ないということです?
0062デフォルトの名無しさん2007/07/28(土) 20:54:10
無名構造体のコンストラクタ、デストラクタはどうすればじっそうできるの
0063デフォルトの名無しさん2007/07/28(土) 21:19:58
無名をやめればいい
0064デフォルトの名無しさん2007/07/28(土) 22:00:17
無名でなければならない時は?
0065デフォルトの名無しさん2007/07/28(土) 22:03:48
適当な名前を付けろ。
0066デフォルトの名無しさん2007/07/28(土) 22:17:25
>>64
どんなとき?
0067デフォルトの名無しさん2007/07/28(土) 22:19:42
  \ /   ヽ     l   |   /         \_人从__
    ヘ、    ヽ  _..≧=ヽ|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:57
何故だ
0069デフォルトの名無しさん2007/07/28(土) 22:29:49
>>66
好きなものは好きと言える気持ち抱きしめてたいとき
0070デフォルトの名無しさん2007/07/28(土) 22:37:43
>>69
俺の胸に飛び込んで来い
0071デフォルトの名無しさん2007/07/28(土) 23:01:58
まんゆうき懐かしいな
0072名無しさん@そうだ選挙に行こう2007/07/29(日) 14:36:28
perlだと1行でできた・・・
0073名無しさん@そうだ選挙に行こう2007/07/29(日) 16:18:36
C++始めたばかり何でちょっと分からないことがあります。
class 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:39
代入演算かコピーコンストラクタか…その辺でググレば幸せかもしれない?
0075名無しさん@そうだ選挙に行こう2007/07/29(日) 16:43:15
>>73
エラーも吐かずに普通に実行できてしまった。
再現方法は?
0076名無しさん@そうだ選挙に行こう2007/07/29(日) 16:46:38
B b = a->Get();
↑これをポインタで受け取れば?
0077名無しさん@そうだ選挙に行こう2007/07/29(日) 16:48:41
返事ありがとうございます。

>>74
ちょっと調べてみます。

>>75
試しに、Releaseビルドで実行したら普通に実行できました・・・。
Debugビルドだとエラー吐きます・・・
一応環境は、VS2005 pro です。

>>76
ポインタで受け取ってみたらエラー吐かずに実行できました。

どういう事なんでしょうか??
0078名無しさん@そうだ選挙に行こう2007/07/29(日) 16:51:32
C++の初心者はnew/deleteを使わないほうがいいと思うんだ。
0079名無しさん@そうだ選挙に行こう2007/07/29(日) 16:53:22
問題はそっちじゃなくて、class BのCポインタが2回削除されていること。
#delete aと、B bがdeleteされるとき

メンバーポインタはけっこう難しいので、最初は使わないほうがよろしいかと。
boost::shared_ptrがお勧め
0080792007/07/29(日) 16:57:41
あと、C++の場合は「このインスタンスの所有者は誰?」というのを常に意識すると良いよ。
あと、RAIIを調べると幸せになれるかも。
0081名無しさん@そうだ選挙に行こう2007/07/29(日) 17:01:31
ここで返したいのはprivateのBだよね?
B Get() {return b;}
これだとここでコピーが行われて新しくメモリ作られるよ

ポインタで返すようにして
B* Get() { return &b; }
こうやってポインタで受け取るべき
B* b = a->Get();
0082名無しさん@そうだ選挙に行こう2007/07/29(日) 17:01:59
>>78-80
返事ありがとうございます。

boost::shared_ptrですか、、聞いたこと無いな、、
ググってきます。

アドバイスなどありがとうございます。
参考にさせていただきます。
0083名無しさん@そうだ選挙に行こう2007/07/29(日) 17:03:58
>>81
>B Get() {return b;}
>これだとここでコピーが行われて新しくメモリ作られるよ

あっ、そういうことですか。
難しいですね、、
ありがとうございます。
0084名無しさん@そうだ選挙に行こう2007/07/29(日) 17:11:24
>>83
>難しいですね、、
だから、>78。
そもそも、なんでnew/deleteを使うのか理解している?
#Javaじゃあるまいし、new/delete[]と違ってnew/deleteの必然性なんてそんなにないだろうに。
0085名無しさん@そうだ選挙に行こう2007/07/29(日) 17:14:37
そんなにnew/delete使わせたくないならnew/deleteについて語れよ。
0086名無しさん@そうだ選挙に行こう2007/07/29(日) 17:22:24
こういうノウハウを覚え続けないとまともに使えないのがC++
0087えいいち ◆GRGSIBERIA 2007/07/29(日) 17:22:56
MS-DOSのようなコマンド入力を受け付けるようなプログラムを組んでいるのですが、

char 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
>>73
コピーされては困るクラスでは代入演算子やコピーコンストラクタをprivateにしよう。

class B {
C *c;
public:
略
private:
B(const B&);//禁止
const B&operator=(const B&);//禁止
};

詳しくはEffective C++でも読んでくれ。
0089名無しさん@そうだ選挙に行こう2007/07/29(日) 17:26:53
new/delete使う使わないは好き嫌いの問題でおk?
0090名無しさん@そうだ選挙に行こう2007/07/29(日) 17:27:26
>>87
多重分岐→データテーブル→データファイル化
0091えいいち ◆GRGSIBERIA 2007/07/29(日) 17:28:17
修正

if(*p == 'b'){
j = 1;
}

↓

if(*p != 'b'){
j = 0;
}
0092792007/07/29(日) 17:29:45
new/deleteも便利だから、まったく使わないのはもったいない。

new/deleteで問題なのは所有者がはっきりしないことなので、そこに注意していればいい。
何だかんだ言って、boost::shared_ptr使うのが良いけどね。
0093名無しさん@そうだ選挙に行こう2007/07/29(日) 17:31:47
>87
つ Commandパターン
0094名無しさん@そうだ選挙に行こう2007/07/29(日) 17:41:24
shared_ptr便利そうだけど
STLだけでやりたい漏れはいらないや。。
0095えいいち ◆GRGSIBERIA 2007/07/29(日) 17:44:12
>>90,93
ありがとうございます。
0096名無しさん@そうだ選挙に行こう2007/07/29(日) 17:50:08
>>94 auto_ptr 使え。
0097名無しさん@そうだ選挙に行こう2007/07/29(日) 17:56:30
>>94
std::tr1::shared_ptr
0098名無しさん@そうだ選挙に行こう2007/07/29(日) 18:04:17
>94 そうすると、auto_ptr + 生ポインタかね。
ライセンス制限ないんだから素直にboost使えばいいんじゃね?とは思うけど。
0099名無しさん@そうだ選挙に行こう2007/07/29(日) 18:05:02
boostインスコめんどいよめんどいよ
0100名無しさん@そうだ選挙に行こう2007/07/29(日) 18:48:13
shared_ptrぐらいならビルドする必要ないだろ。
インクルードパスを通しておくだけ。
0101デフォルトの名無しさん2007/07/29(日) 18:57:05
このプログラムのエラーがわからなくて困っています

hash_set<string> h;
string s = "Hoge";

h.insert(s);

stringじゃないものを指定した場合にはinsertではエラーが出ないんですが、stringだと出てしまいます。
コンパイラはg++を使っています。
原因は何でしょうか?また、対応策はあるのでしょうか?わかる方がお願いします。
0102名無しさん@そうだ選挙に行こう2007/07/29(日) 19:20:21
>>101
エラーメッセージは?
0103名無しさん@そうだ選挙に行こう2007/07/29(日) 19:31:22
boostってライブラリとソース落としてこないと使えないでしょ?
0104名無しさん@そうだ選挙に行こう2007/07/29(日) 19:39:55
一部を除いてヘッダをインクルードするだけで使える
0105名無しさん@そうだ選挙に行こう2007/07/29(日) 19:41:45
>>101
>原因は何でしょうか?
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
>>103
じゃ今後ともどんなプログラムも頑張って標準関数だけで書いていって下さい
01071052007/07/29(日) 19:49:47
あぁ105では動くけど速くないかも知れんよ
0108名無しさん@そうだ選挙に行こう2007/07/29(日) 19:59:10
vs2008がboostのライブラリを2,3個破壊しないか心配
0109名無しさん@そうだ選挙に行こう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:45
シングルスレッドならいいんじゃね
0112名無しさん@そうだ選挙に行こう2007/07/29(日) 20:14:28
>>109
2つのソースから include して使ってみろ。うまくいかない。
0113名無しさん@そうだ選挙に行こう2007/07/29(日) 20:16:26
>>109
> static CTest* test(){

このstaticは余計なんじゃねーの
0114名無しさん@そうだ選挙に行こう2007/07/29(日) 20:16:37
>>110
ポインタが遅いから参照ってのが大間違い。そんなの信じてるようじゃ
「いろいろ駄目」ってのも疑わしい。ヌル返したいなら素直にポインタ使え。

本当に参照が適切なら、失敗を例外で伝えるという手もある。
0115名無しさん@そうだ選挙に行こう2007/07/29(日) 20:19:56
ポインタって参照に比べて遅いの?
一番早い書き方は?
0116名無しさん@そうだ選挙に行こう2007/07/29(日) 20:20:38
>>103
Boost Consultingにインストーラあったと思ったが
0117名無しさん@そうだ選挙に行こう2007/07/29(日) 20:21:47
ポインタが遅いってなんだ?
エイリアスが無いと判断しにくいから最適化しにくいとかそういう話?
0118デフォルトの名無しさん2007/07/29(日) 20:26:48
>>113
コンストラクタがprivateなのにどうやってインスタンス化しろっての。
0119デフォルトの名無しさん2007/07/29(日) 20:38:07
>109
一昔前ならLoki::Singletonをお勧めしていたところだけど……
boostにSingletonあったっけ?
0120デフォルトの名無しさん2007/07/29(日) 20:40:12
つーかそもそもシングルトン、要るか?
0121デフォルトの名無しさん2007/07/29(日) 20:41:02
いらねーよ。今でも要らないシングルトンが量産されてるってのに。
0122デフォルトの名無しさん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
>>118
それ static 関係ない。 friend が指定してある。

あれ? friend に内部リンケージの関数って不味くないか?
0124デフォルトの名無しさん2007/07/29(日) 20:47:46
それ、翻訳単位毎にtest関数とその中の
CTestのinstが存在することにならね?
0125デフォルトの名無しさん2007/07/29(日) 20:52:14
>>119
ttp://boost.cppll.jp/HEAD/libs/pool/doc/implementation/singleton.html
0126デフォルトの名無しさん2007/07/29(日) 21:27:24
>>109
テンプレートクラスなら普通にstaticなメンバ変数をヘッダ内に書ける(ODRに違反せずに「定義」できる)んじゃ無かったっけ?
それなら前にやったことがあるけど。
っていうかこれってどうやってるんだろう。やっぱリンカががんばってるんだろうか。

テンプレートじゃなきゃ、別にヘッダだけで収めようとしたことはないなぁ。
0127デフォルトの名無しさん2007/07/29(日) 22:16:17
>>109 コピーコンストラクタを禁止しないのはまずいと思う
0128デフォルトの名無しさん2007/07/30(月) 00:34:51
>>116
いや、便利ライブラリが嫌いなんじゃなくって
STL以外だと会社にもってって使えないいんよね。
便利なパーツは単体で、尚且つインクルード/コピペするだけで
リンカの設定弄らなくてもさくっとコンパイルできるのがいい。

ソース管理されてる環境だとプロジェクトファイルすら弄れないしね。。
0129デフォルトの名無しさん2007/07/30(月) 00:39:49
>>128
同意
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:53
BSTRかwchar_t使えば?
0132デフォルトの名無しさん2007/07/30(月) 00:50:28
>便利なパーツは単体で、尚且つインクルード/コピペするだけで
>リンカの設定弄らなくてもさくっとコンパイルできるのがいい。

Boostは大概インクルードだけで使えるけど……
0133デフォルトの名無しさん2007/07/30(月) 00:53:04
インスコで環境を変えないなら使う
01341302007/07/30(月) 00:56:53
>>131

できませんでした。
wint_tも2バイト変数なのでfgetwcで2バイト読み込んでないということだと思うのですが、
fgetwcでは2バイト読み込むことは出来ないのでしょうか?
0135デフォルトの名無しさん2007/07/30(月) 01:00:43
>>130
C言語の上にバグ持ちのVC++8.0か

環境依存スレ向きの話題じゃないのか
0136デフォルトの名無しさん2007/07/30(月) 01:08:11
TCHAR s; //<--1バイト?2バイト?
wsprintf(&s, TEXT("%d"), ch);

TCHARってコンパイルの環境によって定義かわらない?
0137デフォルトの名無しさん2007/07/30(月) 01:11:05
TCHARの定義はUNICODEが定義されているかどうかで変わるし
fgetwc()とfgetc()を混ぜこぜにしてるし
> TCHAR s;
> wsprintf(&s, ...
って何だそら
ムチャクチャだ
0138デフォルトの名無しさん2007/07/30(月) 01:14:30
Cのwchar_tがらみの関数はsetlocale()を実行しておかないと
まともに動かん

VC++8.0の場合はバグのせいで、どっちみちw系のコンソール入出力が
腐るので諦めろ
0139デフォルトの名無しさん2007/07/30(月) 01:17:31
VC++8ってそうなのかw
TCHAR WCHARとかじゃなく
明示的にchar wchar_tとか書いてもだめなん?
0140デフォルトの名無しさん2007/07/30(月) 01:19:18
imbue
0141デフォルトの名無しさん2007/07/30(月) 01:20:09
>>139
有名な話だよ。SP1でも直ってない。
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=250724&SiteID=7
参照。
0142デフォルトの名無しさん2007/07/30(月) 01:23:53
>>140
Cには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:08
ほんまやw
MSだせーな
BCC32マンセーしててしらんかったわw
01441302007/07/30(月) 01:38:26
みなさんアドバイスありがとうございました。

VC++8.0にはバグがあったんですね…

bccでコンパイルしてみることにします。
0145デフォルトの名無しさん2007/07/30(月) 01:39:52
>>130
ざっくり見直してみたけどこれでどうよ?

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:26
>>145
WEOFにしないと無限ループ
01471452007/07/30(月) 01:42:18
ああスマン
01481302007/07/30(月) 02:07:48
>>147

このソースでも文字コードが0x82と0xA0いうふうに分かれて表示されてしまいました

やはりBCCを使ったほうがいいということなのでしょうか…
0149デフォルトの名無しさん2007/07/30(月) 02:09:19
ん?もしかして
fopen/fcloseじゃなくて、wfopen/wfcloseじゃないとだめとかある?
0150デフォルトの名無しさん2007/07/30(月) 02:09:55
>>148
setlocale(LC_CTYPE, "");
をプログラムのドアタマで実行汁。
0151デフォルトの名無しさん2007/07/30(月) 02:10:37
>>149
関係ねー
それらはUTF-16なパス名でストリームを開く、というだけだ
01521302007/07/30(月) 02:30:11
>>150

出来ました!
ロケールというものを設定しないといけなかったんですね!

ロケールについて調べてみたらよくわからなかったんですが、
ロケールとはパソコンの情報の表示形式みたいなものと考えていいのでしょうか?
0153デフォルトの名無しさん2007/07/30(月) 02:37:35
>>152
ロケールは貨幣や数値、時刻の形式なども扱うが、この場合は
LC_CTYPEというカテゴリを指定してやることで、
文字エンコーディング(SJISだのEUC-JPだの)をCランタイムに
教えてやっている。「""」は、「実行環境に応じて良きにはからえ」という
意味だ。Cランタイムはそれに応じてワイド文字とマルチバイト文字の
変換を行う。
01541302007/07/30(月) 03:02:24
>>153

なるほど、だからロケールを設定してないときの読み込み方がおかしかったんですね

わかりやすく教えていただきありがとうございました!
0155デフォルトの名無しさん2007/07/30(月) 08:17:11
型Tから型Uへの変換が存在するかどうかを調べるtemplateの手法ってありますか?
具体的には次のようなことをやりたいのですが…

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:19
template <typename T, typename U>
class 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
iGoogleで複数のコンテンツを追加してみると、
追加したコンテンツをドラッグ&ドロップで移動できるのですが、
そのUIを、WinXPSP2上のVS2005 C++ Windowsフォームにて実装してみたくて調査中なのですが、
技術的に停滞中です。

フォームにPanelを配置し、そのパネルをドラッグ&ドロップすればよいのかと思うのですが、
パネルのドラッグ&ドロップが出来ません。。

何かサンプルありませんか?
0158デフォルトの名無しさん2007/07/30(月) 16:26:33
MFCのCOleDropTargetクラスあたりかなぁ?
0159デフォルトの名無しさん2007/07/30(月) 17:46:58
ありがとうございます。
COleDropTargetですか。ちょっとみてみましたが、
楽チンポンとは行かないみたいですね。
ちょっと勉強にいそしみます。
0160デフォルトの名無しさん2007/07/31(火) 00:30:10
>>156
ありがとう!
ていうか解説読んで感動しました…
0161デフォルトの名無しさん2007/07/31(火) 09:22:22
>160
どうせ中では同じようなことをやってるはずだけど、使えるなら Boost TypeTraits を使うのが楽。この場合は is_convertible
0162デフォルトの名無しさん2007/08/01(水) 05:03:00
placement delete は
対応する placement new の実行中に例外が発生した場合に呼ばれるからという
ただそれだけのために存在する、という認識で問題ありませんか?
0163デフォルトの名無しさん2007/08/01(水) 06:18:29
え
0164デフォルトの名無しさん2007/08/01(水) 06:24:12
struct s{ s(){puts("s");} };
と定義して
struct s s_obj();
としてもコンストラクタが呼ばれないんですが、
俺何か間違ってるんでしょうか?
0165デフォルトの名無しさん2007/08/01(水) 06:31:42
それは「struct sを返す関数」の宣言
0166デフォルトの名無しさん2007/08/01(水) 11:23:21
struct s s_obj; としないといけない。
もっとも、s s_obj; で十分だが。
0167デフォルトの名無しさん2007/08/01(水) 12:24:54
>>162
どうせ君は使わないだろうから問題ないよ。
人と話すときにはその話題避けてればいいんだし。
0168デフォルトの名無しさん2007/08/01(水) 12:32:58
>>162
違う。正しくは
対応する placement new が成功した後のコンストラクタで例外が発生した場合に以下同文。
0169デフォルトの名無しさん2007/08/01(水) 13:11:18
placement new というと、規格を見ると new の構文は

new-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
Ruby のイテレータみたいなもんか。繰り返さなくてもイテレータ。
っつーことは、「いつもの placement delete」 には特に呼ぶ価値ないけど、
それ以外の placement delete には十分価値があるかもしれんっつーことか。
0172デフォルトの名無しさん2007/08/01(水) 21:46:24
RUBYYYYYYYYYYYYYYYYYYYYYYYY
0173デフォルトの名無しさん2007/08/01(水) 21:53:00
pythonでおk
0174デフォルトの名無しさん2007/08/01(水) 22:31:34
AnsiString GetReg(AnsiString Key, AnsiString Name, HKEY RootKey)
{
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:06
テラBCB
01761742007/08/02(木) 00:57:40
書き込みが途中までしか出来てませんでした。
↓続き
関連する項目をググって、上記ソースを見つけたのは良いのですが、
得た値"Value"をstrcpy(a,b)のbで使おうとすると、
AnsiString型からキャストできず、エラーとなります。
AnsiString型をキャストすること自体がよろしくないようなのですが、
キャストか、他に良い方法がありましたら教えてください。

長文すみません。よろしくお願いします
0177デフォルトの名無しさん2007/08/02(木) 01:01:43
strcpy(dst, AnsiString("あひゃ").c_str());
0178デフォルトの名無しさん2007/08/02(木) 01:13:55
>>177は
Value.c_str()でやれということ
01791742007/08/02(木) 07:30:49
>>177=>>178さん
どうもありがとうございます。
助かります。
0180デフォルトの名無しさん2007/08/02(木) 22:26:11
プログラム中から現在のCPUのクロック数を測定したいのですが
どうすればいいでしょうか?
0181デフォルトの名無しさん2007/08/02(木) 22:29:12
>>180
Win32APIのQueryPerformanceFrequencyは?
0182デフォルトの名無しさん2007/08/02(木) 22:32:00
あれはかなりいい
しかしモバイル用CPUとか動的にクロックが変化するCPUだとちょっと困る
0183デフォルトの名無しさん2007/08/02(木) 22:42:28
すいません>>182の理由により別の方法をおねがします
もしかして不可能?
0184デフォルトの名無しさん2007/08/02(木) 22:45:00
条件があったのなら初めに言えよ
0185デフォルトの名無しさん2007/08/02(木) 22:46:46
cpuid命令を呼ぶ
レジスタに信用なら無いモデルナンバーが返って来る
メーカーの資料と照らし合わせる
周波数を知る
0186デフォルトの名無しさん2007/08/02(木) 22:51:17
CPUとは違う固定周波もってるハードに割り込みかけてもらうぐらいしか思いつかん……
0187デフォルトの名無しさん2007/08/02(木) 22:56:08
>現在のCPUのクロック数を測定
だから>>181でFA
0188デフォルトの名無しさん2007/08/02(木) 23:08:53
>>185
ああ、その方法もありますね。しんどいけど。
どこかに cpuid --> cpu clock 変換表みたいなのありませんか?

クロック自体はrdtscで読めるんですが、
最近のCPUは省電力モードとかで
クロック自体が落ちてることもあって
正確なクロックが取得できないんです
0189デフォルトの名無しさん2007/08/02(木) 23:15:32
CPU毎の定格周波数が知りたかったのか?
0190デフォルトの名無しさん2007/08/02(木) 23:24:10
CPU に意図的に負荷かけてから測定するとか。
0191デフォルトの名無しさん2007/08/02(木) 23:40:09
asmでおk
0192デフォルトの名無しさん2007/08/03(金) 16:33:06
可変長のメンバ配列変数は C99 で規格合致になったけど、
C++ だと 9.2p8 を見る限り対応されてなさそうな雰囲気を感じる。
これは、非静的メンバ配列変数のサイズは必ず指定する必要があるという記述だから
ここだけじゃ実際のところはっきりとは分からんけど。

でも、次期 C++ ドラフトを見るとこの記述が削られてる。
これは C99 と同様に可変長のメンバ配列変数に対応された現れだと見ているけど、
そのことが書いてある箇所が見つからない。

C++ での可変長のメンバ配列変数への対応具合の状況はどんな感じなんじゃろか。
0193デフォルトの名無しさん2007/08/03(金) 20:55:47
可変長配列がないならvector使えばいいじゃない(マリー
0194デフォルトの名無しさん2007/08/03(金) 21:23:30
それなら C でも malloc 使えるしー。
でも、本気でそれでも問題ないと思うんだよな。
正直可変長メンバってどのくらい意味があるのか分かんないな。
Windows API とか可変長メンバを要求するところがあるから
しゃーなしで使わんといかんこともあるんだが。
0195デフォルトの名無しさん2007/08/03(金) 21:33:07
ポインタ使うかわりに可変長メンバ使うとメモリ上のレイアウトがフラットに
なるから、そのままファイルに読み書きしたりできて便利な場合もあるでそ
0196デフォルトの名無しさん2007/08/03(金) 22:04:00
stlのアロケータってrealloc操作がないのな。
vectorやstringのサイズ増加時にコピーが走りまくって参った。
0197デフォルトの名無しさん2007/08/03(金) 22:16:19
reserveとかあるだろ
そういうハナシじゃない?
0198デフォルトの名無しさん2007/08/03(金) 22:19:34
ふつうdeque
0199デフォルトの名無しさん2007/08/03(金) 22:25:23
>>195
書き込みは一発だけど、
読み込む時は一旦サイズを読み出さないといかんのだよな。
状況によってサイズが分かる場合もあるけどさ。
そこまでの利点には思えんのよなあ。
昔だとその僅かな差も重要だったんだろうか。
0200デフォルトの名無しさん2007/08/03(金) 22:27:52
>>196
<cstdlib>のreallocも、その場で拡張できなければ、
新しい領域を確保して、そこへ元の記憶域の内容をコピーすることになっている。
クラスインスタンス相手にコピーコンストラクタを使わず複写なんて
やるわけには行かないから、アロケータにrealloc相当の操作がないのも妥当な判断。

仮にやるとしたら、その場で拡張できるときだけ成功するrealloc操作
なんてことになるんだろうな。

0201デフォルトの名無しさん2007/08/03(金) 22:33:47
>>199
malloc()/free()一発で確保・解放できるのも「Cでは」便利
で、特にデメリットも無いわけで
まあ可変長に出来るのは最後のメンバだけ、という制限があるけどな

ま、基本的に言語サポートが貧弱なCで特に生きるテクニックという気がする
0202デフォルトの名無しさん2007/08/03(金) 22:35:49
記憶域の内容がコピーされても、
その後にちゃんとコピーコンストラクタを placement new で呼べば一応正常に動作する。

問題は二度手間になることと、
realloc による管理は C++ っぽくないってところだな。
0203デフォルトの名無しさん2007/08/03(金) 22:36:31
PODのときはrealloc or memcpyするぐらいの配慮が欲しかったなあ
パフォーマンスに関わるんで結局手書きしちゃったよ
無駄にT()でfillするし・・・
0204デフォルトの名無しさん2007/08/03(金) 22:37:30
>>201
どっちゃにしろ動的に確保する場合は
確かに一発で済むから便利か。なるほど。
0205デフォルトの名無しさん2007/08/03(金) 22:40:24
でもまあバッファを拡大するときも、必要な量ぎりぎりではなく、
例えば倍々に増やしていったりする実装の存在なんかを考えれば、
やっぱりコンテナがrealloc相当のことをやっているんだよなと思う。
0206デフォルトの名無しさん2007/08/03(金) 22:42:15
なんでC++にnew/deleteがあってrealloc()相当物が無いのかってのは
Stroustrupが説明してた気がするが、忘れた
0207デフォルトの名無しさん2007/08/03(金) 22:45:50
placement new でコピーコンストラクタ使ってオブジェクト作ってるよ。
0208デフォルトの名無しさん2007/08/03(金) 22:49:31
Win32 APIのVirtual Allocみたいなの使ってアドレス空間だけ予約しとけ
0209デフォルトの名無しさん2007/08/05(日) 02:02:59
シグナルって何に使えばいいの?
中で特別な関数以外の関数呼んだら未定義とか規格に書いてるんだけど。
0210デフォルトの名無しさん2007/08/05(日) 02:04:27
ぶっちゃけsignalがCの標準に含まれているのはどうかと思う
0211デフォルトの名無しさん2007/08/05(日) 02:04:59
マジ?あの欠陥品が?
0212デフォルトの名無しさん2007/08/05(日) 02:05:32
>>209 Unixの規格を読むんだ
0213デフォルトの名無しさん2007/08/05(日) 02:09:07
Posix的にはsignal()は推奨されないでしょ
sigaction()を使うべき

Windowsのコンパイラが提供するsignal()は、規格を満たすためだけの紛い物で
何の役にも立たない

つまりsignal()なんて要らない子
0214デフォルトの名無しさん2007/08/05(日) 02:10:34
いやシグナルという仕組み自体が正直勘弁だ
0215デフォルトの名無しさん2007/08/05(日) 02:11:28
まあスレッド登場前の化石だよな
0216デフォルトの名無しさん2007/08/05(日) 02:14:57
signal handlerからlongjmpがunixの作法ですが何か?
0217デフォルトの名無しさん2007/08/05(日) 02:15:53
おk。大体分かった。
0218デフォルトの名無しさん2007/08/05(日) 02:17:24
それが今となっては最悪の作法だよねって話でしょ
スレッドと相性が非常に悪いし
それでなくとも
シグナルハンドラが再インストールされるかどうかとか
システムコールが再送されるかどうかとか
シグナルハンドラ内であれをやってよいこれはよくないとか
バッドノウハウのすくつやん
0219デフォルトの名無しさん2007/08/05(日) 02:23:03
write一つとっても、linux/*bsd/solaris/hp(dec)でそれぞれ挙動が違うからねえ
posixもM$がサーバ戦略に本腰いれて慌てて始めたもんだしなあ
0220デフォルトの名無しさん2007/08/05(日) 03:22:10
set_terminate ってどういう場合に使う?
main で全ての例外補足してから異常終了した方が
ローカル変数のデストラクタが呼ばれていいと思うんだけど。
0221デフォルトの名無しさん2007/08/05(日) 03:24:59
そういうまともな例外処理が出来ないときのためにあるのでは

例外処理中に例外が出たとか
0222デフォルトの名無しさん2007/08/05(日) 03:27:03
>>220
2行目以降の意味がわからん。 set_terminate() 関係ないだろ。
0223デフォルトの名無しさん2007/08/05(日) 03:36:23
>>221
ああ、二重例外に対応する場合か。なるほど。
0224デフォルトの名無しさん2007/08/05(日) 12:41:24
VS2005 MFCなんだけど、アクセスバイオレーションの例外処理を
捕らえたいんだけど、
try{}
catch( ... ){}
この構文では捕えられないんだけど、どうしたらいい?
0225デフォルトの名無しさん2007/08/05(日) 12:44:09
アクセスバイオレーションて単純にソフトウェアのバグじゃないか?w
0226デフォルトの名無しさん2007/08/05(日) 12:54:51
/EHaとか/EHcがらみじゃないの?

でもデフォルトから変更した場合、
ミドルウェアとか依存するライブラリ絡みの整合性が心配だな。
0227デフォルトの名無しさん2007/08/05(日) 15:14:37
ttp://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpdndeepc/htm/deep060399.asp
まあC++の範疇じゃないな。
0228デフォルトの名無しさん2007/08/06(月) 06:55:48
構造化例外で捕まえた方が良いと思うヨ。
0229デフォルトの名無しさん2007/08/06(月) 18:19:11
_set_se_translatorという手もある。
いずれにせよVC++くらいしか使えるものがないというのに変わりはないけどな。
0230デフォルトの名無しさん2007/08/06(月) 21:25:46

スレ違いだったらすいません。

アプリ開発の依頼スレが見つからなかったのでこちらに書かせて頂きました。
当方所有のウェブアプリケーションソフト
(以前プログラマに依頼して作ってもらったものですが今は連絡が取れません)
がURL先の変更?で突然使えなくなってしまいました。

そこで、緊急で本日中に改変が出来そうな方是非お願いできないでしょうか?
当方、全くの知識不足で言語が C++ということ以外分かりません。
ソースファイルは持っております。料金は2万円でお願いします!

[email protected]
0231デフォルトの名無しさん2007/08/06(月) 21:29:58
マルチはよくないな
0232デフォルトの名無しさん2007/08/06(月) 21:47:57
やすっ
0233デフォルトの名無しさん2007/08/06(月) 23:11:47
>>230
ソースがあるならソースを晒せよ。ロハでできるぞ。
ソースを晒せないから有料でということなら、2万円なんて人を見下したようなことをするもんじゃない。
0234デフォルトの名無しさん2007/08/07(火) 06:33:04
void foo(char *p, size_t len)
{

}
0235デフォルトの名無しさん2007/08/07(火) 06:34:28
すみません途中で送信してしまいました。

void foo(char *p, size_t len)
{
// ここでpとlenからistreamを作りたい
}

実際には、basic_istreamの派生クラスを作るしかないのでしょうか?
02362352007/08/07(火) 06:44:00
最初は、std::istringstreamを使って実装していたのですが、バイナリを扱う必要があるので、見送りました。
0237デフォルトの名無しさん2007/08/07(火) 07:39:56
俺判定

↓エスパー1級
0238デフォルトの名無しさん2007/08/07(火) 07:48:18
>>236
ファイルストリーム以外でバイナリとテキストの問題なんて起こらないだろ?
istringstream でいいと思うよ。
0239デフォルトの名無しさん2007/08/07(火) 07:50:42
>>236
なんでバイナリを扱う必要があったら istringstream を見送るの?
0240デフォルトの名無しさん2007/08/07(火) 09:01:36
stringという名前が付いてるからバイナリは扱えないと思っているんだろうな
0241デフォルトの名無しさん2007/08/08(水) 20:13:23
義務教育もしっかり受けてるのに
x = x +1
が疑問でもなんでもない俺は負け組
0242デフォルトの名無しさん2007/08/08(水) 20:15:25
柔軟な思考は大事
固定観念はよくない
0243デフォルトの名無しさん2007/08/08(水) 21:16:13
もう疑問を持ったかどうかすら覚えてないわ
0244デフォルトの名無しさん2007/08/08(水) 21:57:28
>>241
x = x * x + Cならマンデルブロ集合なんだけどね。
0245デフォルトの名無しさん2007/08/09(木) 10:46:54
>>241
むしろそのへんの切り替えが高速にできない子は算数のできない子
0246デフォルトの名無しさん2007/08/09(木) 19:51:16
リアル演算子オーバーロードだよな。
0247デフォルトの名無しさん2007/08/09(木) 19:59:43
要は「今まで習った常識・ルール」に囚われてしまっていて、
新しいルール、新しい前提の上でのゲームには一歩も踏み出せないってことだからな

その程度の頭の柔軟性が無いのでは算数やプログラミングに限らず
何やってもだめ
0248デフォルトの名無しさん2007/08/10(金) 09:40:31
何でも受け入れるのもあれだけどな。
そこに疑問を持ち、考察し、納得する、というプロセスをだな・・・
0249身の程知らず2007/08/10(金) 12:01:33
C++の文法に疑問を持つのは、よほどの天才か身の程知らずのどちらかだろ。
もちろんもっと人間にもコンパイラにも分かりやすくて、すばらしい文法は作れただろうが、
今のような位置を占めているかどうかは疑問だ。


以下、俺様演算子を定義できる機能とか、
Cのプリプロセッサなんかより、もっとプログラマブルで、文法を考慮するマクロとか、
↓禿のお気に入りだったマルチメソッドなどについて語ろう↓
0250デフォルトの名無しさん2007/08/10(金) 12:04:48
>以下、俺様演算子を定義できる機能とか、
演算子オーバロードではお気に召しませんか?

>Cのプリプロセッサなんかより、もっとプログラマブルで、文法を考慮するマクロとか、
C99のプリプロセッサではお気に召しませんか?

それならDをどうぞ。
0251デフォルトの名無しさん2007/08/10(金) 12:06:05
Lispじゃねぇの
0252デフォルトの名無しさん2007/08/10(金) 12:10:18
開発当時はのんびり言語仕様考えるヒマなかったんだろう。
シェア争いを制するために時間を惜しんだんだろ
結局当時は高級言語に負けたが。
0253デフォルトの名無しさん2007/08/10(金) 12:11:29
俺様演算子っていうと、Prolog みたいなやつか。
0254デフォルトの名無しさん2007/08/10(金) 14:42:56
俺様演算子っていうと、Haskell みたいなやつか。
0255デフォルトの名無しさん2007/08/10(金) 14:58:06
Forth なら何でもありだな
0256デフォルトの名無しさん2007/08/10(金) 15:05:03
禿は演算子オーバーロードは必要最小限に抑えたほうが良いと言ってなかったか
0257デフォルトの名無しさん2007/08/10(金) 15:54:28
おまいは禿が死ねって言ったら死ぬのか?
0258デフォルトの名無しさん2007/08/10(金) 16:32:06
詭弁のガイドライン
0259デフォルトの名無しさん2007/08/10(金) 17:05:23
おまいは「おまいは禿が死ねって言ったら死ぬのか?」ってレスを見たら詭弁だと短絡的に思うのか?
0260デフォルトの名無しさん2007/08/10(金) 17:07:20
次の相談者の方、どうぞ↓
0261デフォルトの名無しさん2007/08/10(金) 17:10:30
禿はC++に関しての第一人者だけど、死に関しての第一人者じゃない。
詭弁じゃないと言うなら、何をもって
「禿は演算子オーバーロードは必要最小限に抑えたほうが良いと言ってなかったか」
「おまいは禿が死ねって言ったら死ぬのか?」
というのが同じ重みがあるとするのかを明確化しろ。
0262デフォルトの名無しさん2007/08/10(金) 17:44:52
物事の良し悪しは他人任せにせずに自分で考えましょう、
と注意する場合の定型句だと思うが。
0263デフォルトの名無しさん2007/08/10(金) 18:16:58
ならそう書けばいいんじゃないかなw
0264デフォルトの名無しさん2007/08/10(金) 18:21:40
なんでも平たく書き下すんじゃなく、
慣用句等あれば使うのが文化って奴だろ
その点APLなんかすごいぞ
0265デフォルトの名無しさん2007/08/10(金) 18:26:07
論点ずらしの天才
0266デフォルトの名無しさん2007/08/10(金) 18:34:21
演算子と人の生死を結びつけるところが正直よく分からん
0267身の程知らず2007/08/10(金) 18:45:10
禿があれほどD&Eで多くのページを割いて、規格に入らなかったことを悔しがっているのに、
一言も突っ込まれないマルチメソッド哀れ。

まあ、正直言ってまず使わないと思うけど。
0268デフォルトの名無しさん2007/08/10(金) 19:05:50
(動的)マルチメソッドマジ欲しい。
Lokiにもマルチディスパッチの実装あるけど、さすがに面倒だ。
でも、コンパイラの実装大変そうだよね。

演算子オーバーロードはPEGとかEBNFを実装するためにあると思うんだ。
0269デフォルトの名無しさん2007/08/11(土) 12:00:15
質問があります。
class 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:32
つ 静的局所変数
0271デフォルトの名無しさん2007/08/11(土) 12:45:41
>>269
CRTP が使える場面かもしれない。
でも、そんなに静的変数が要るのかどうかが疑わしい。
クラス外に定義が必要なのが嫌だというのも理解しかねる。
0272デフォルトの名無しさん2007/08/11(土) 16:51:02
template<UINT nID>.
class Base
{
 static C s_c;
};
template<UINT nID>
C Base<nID>::s_c;

class A : public Base<0>
{};
class B : public Base<1>
{};
02732692007/08/11(土) 19:13:13
>>270-272
返事が遅れてしまい申し訳ありませんでした。
レスありがとうございます。

CRTPってデザインパターンの一種みたいですね。
>>272のソースがCRTPなのでしょうか?
面白そうなので試してしみようと思います。
0274デフォルトの名無しさん2007/08/11(土) 19:43:47
それは全然違う。
CRTPはベースクラスが、継承クラスの型を知ること
02752692007/08/11(土) 19:55:41
>>274
なるほど。どもです。
ちょっとググって来ます。
0276デフォルトの名無しさん2007/08/11(土) 23:40:11
CRTPてこんなの

   template<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>;
   };

けっこう有名なテクニックだとおもうけど?
02772692007/08/12(日) 02:50:34
>>276
ありがとうございます。
まだ、実装はしてませんが、>>276さんのソースを弄った感じ私が求めてたモノかもしれませんw
ただ、1行目のtemplate<class derived_t>って言うのがよく分からないのですがなんなのでしょうか??
0278デフォルトの名無しさん2007/08/12(日) 03:00:57
>>277
ごく普通のテンプレート宣言だよ。これぐらいは調べてくれ。
0279デフォルトの名無しさん2007/08/12(日) 03:03:18
>>278
あ、なるほど、template<class T>みたいなもんですかw
てっきり、特殊なことやってるのかと思いましたw
すいません。
02802692007/08/12(日) 15:09:02
また、質問させていただきたいのですが、>>276さんのソースを簡易化して、
template<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
>>280
コンテナに入れたいだけならもういっこ基底クラスを置くだけでいいだろう。
コンテナの要素に対して何をしたいのかによっては、それじゃ不満だろうが。

ソース貼るなら、ちゃんと問題(エラー)が再現できるコード作れよ。
0282デフォルトの名無しさん2007/08/12(日) 15:50:20
どうもtemplateとclassの関係を判っていないようだな。
テンプレートのポインタ(TLogPolicy *)なんてのは無いよ。

TLogPolicy<TManager>とTLogPolicy<UManager> は別の型だから、
同じ基底クラスとして扱うことは出来無いし。

面倒だから簡単にboost::anyのコンテナ使う手もあるかね。
02832692007/08/12(日) 19:54:07
>>281-282
レスありがとうございます。

>ソース貼るなら、ちゃんと問題(エラー)が再現できるコード作れよ。
申し訳ありません。以後気を付けます。

templateとclassの関係などもうちょっと勉強し、
レスを参考に少し考えてみることにします。
0284デフォルトの名無しさん2007/08/12(日) 23:02:30
>>283
多分コンパイル通そうと尋常じゃない時間を割くと思われるので一つ教えてあげる。

テンプレート関数はこう書く。
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
>>284
メンバテンプレートって呼び名が付いてるのに書くことはできないんだ。ふーん。
コンパイラ何使ってるの?
0286デフォルトの名無しさん2007/08/12(日) 23:19:40
たしかVC5か6かなんかでは出来なかっただけ。
0287デフォルトの名無しさん2007/08/12(日) 23:45:41
vc6 では出来る。
が、一部文法が通らないな。

hoge h;
h.f(1); // OK
h.f<float>(1); // NG

vc5 は知らん。
02882842007/08/12(日) 23:46:09
あ゛ぅ、手元のコンパイラでやってみたらできた・・・
>>283 すまん、284 は全くのマチガイ。忘れてくれ m(_ _)m

>>285 VC2005。
>>286 今試したら VC6 ではできた。VC 5 以前はわからんけど。

いぢめないで。。。
0289デフォルトの名無しさん2007/08/12(日) 23:59:00
ちょっと興味が湧いたので実装してみた。

   template<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はクラス内クラスにしてファイナル化しといた方が安全そうだ。
02902892007/08/13(月) 00:01:46
というよりもVC5,6はステだろ。
未だに保守でVC5,6使わされているプログラマは可哀想でしょうがない。
0291デフォルトの名無しさん2007/08/13(月) 00:03:03
class TLogPolicy { public: void foo() { ::std::cout << "Hello"; } };
class 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
>>290
この前、VC3の案件が回ってきて笑った。
02932892007/08/13(月) 00:15:30
うわ……ありゃc++とは言えないだろう……


良く良く考えたらテンプレートメンバ関数要らんな。
ただ危険にしているだけだった。
   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:29
>>293
TLogPolicyとContはどこいった?
0295デフォルトの名無しさん2007/08/13(月) 11:17:36
規格読んでたらよく分かんなくなってきた。

std::complex<double> c = std::complex<double>(1, 2);

とした時、コピーコンストラクタが呼ばれるかどうかに関する規定がよく分からない。

これは「コピー初期化」であって「std::complex<double>(1, 2)がcにコピーされる」らしいんだが、
実際やってみると、どうもコピーコンストラクタは呼ばれない。
この「コピー」というのがコピーコンストラクタを呼ぶことを意味していないのか、
それともコピーコンストラクタを呼ばない最適化が規格で許されてるのか、
どうもよく分からない。

このあたりどうなってるのか詳しく知ってる人はいる?
0296デフォルトの名無しさん2007/08/13(月) 11:22:35
>>295
ttp://www.kmonos.net/alang/cpp/glossary.html#RVO
0297デフォルトの名無しさん2007/08/13(月) 11:27:38
1)T a = T(...)
2)T a(...)
は同じじゃなかったっけ
0298デフォルトの名無しさん2007/08/13(月) 11:45:31
>>295
つまり、これも戻り値最適化に含まれる、というわけ?
0299デフォルトの名無しさん2007/08/13(月) 12:05:27
>>297
いいえ。前者はコピーコンストラクタが呼ばれる可能性があります。
# >296参照。
0300デフォルトの名無しさん2007/08/13(月) 12:06:17
>>298
正しく、RVOですね。
0301デフォルトの名無しさん2007/08/13(月) 12:07:59
規格には何箇所かコピーコンストラクタの省略を許す箇所が挙げられている。
戻り値最適化もコピー初期化時の省略もそのひとつ。

って、他にあったっけ?
0302デフォルトの名無しさん2007/08/13(月) 12:09:56
>>300-301
これで安心して眠れます。
まだ寝ないけど。
0303デフォルトの名無しさん2007/08/13(月) 12:10:44
>>295
これかしらん?

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
>>303
おおー。それですね。完璧ですね。
0305デフォルトの名無しさん2007/08/13(月) 12:31:03
規格 8.5.14 内のここは?

if 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
>299
ええ? >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
>>306
「ということで」じゃねーよ。何を確認したんだよ。

= に続けて置かれた初期値の型が同じなら、動作上は direct-initialization と
同じに最適化されるが、意味上は依然として copy-initialization なので、
たとえばコピーコンストラクタが private になってたりすると >>297 の 1 は
コンパイルエラーになる。
03083062007/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:26
ためになるなあ
0310デフォルトの名無しさん2007/08/14(火) 01:11:10
おもしろいな、copy constructorへのaccess checkがかかるけど、
実際には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
>>310
これは RVO とは呼ばない。
0312デフォルトの名無しさん2007/08/14(火) 01:55:03
>>308
規格のドラフトでいいんじゃないの? >>2
0313デフォルトの名無しさん2007/08/14(火) 02:39:08
JIS に行けばドラフトじゃなくてちゃんとしたのを一応読める。色々と不便ではあるけど。
0314デフォルトの名無しさん2007/08/14(火) 02:45:47
日本の未来に絶望する配布形式
0315デフォルトの名無しさん2007/08/14(火) 08:29:54
不要なものは使いにくくなっている
C++的には正しい配布形式
0316デフォルトの名無しさん2007/08/14(火) 10:19:47
const int i[10];
という配列をメンバーに持っていた場合、どうやって初期化すればよいのでしょうか? 
0317デフォルトの名無しさん2007/08/14(火) 10:21:52
>>316
できません。 const 外すか、パフォーマンスに問題なければ std::vector を使うか。
0318デフォルトの名無しさん2007/08/14(火) 10:23:08
int i[10]; という配列をメンバーに持つクラス X を作って、
const X x; として、その x のコンストラクタで初期化する。
0319デフォルトの名無しさん2007/08/14(火) 10:40:09
残念ながらコンストラクタ内で代入することになるね。
0320デフォルトの名無しさん2007/08/14(火) 23:11:20
ご意見伺いたいです。

C++にてシングルトンを実装するに当たって、インスタンスの解放を明示的に実装しますか?

私は、実装します。
プログラムの終了まで存在するものとしても解放するべきだと思っています。

実装しないという人の理由が、解放される順番が難しい、
というのですがそれは理由にはならないのではと。

解放しない派で、もっとこう積極的な理由があるなら教えてください。
0321デフォルトの名無しさん2007/08/14(火) 23:19:43
明示的な解放が必要ってことは
static HogeClass *s = new HogeClass;
return s;
とかするのか?
0322デフォルトの名無しさん2007/08/14(火) 23:25:57
Modern C++ Design読め。

言語に頼れるのならば任せるのがベターだろうと思うよ。
それができない(例外的な)ケースのときだろうね。明示的に実装することを考えるのは
0323デフォルトの名無しさん2007/08/15(水) 02:20:59
mallocしたメモリは確実に解放しますか?

私は、解放します。
プログラムの終了まで存在するものとしても解放するべきだと思っています。
0324デフォルトの名無しさん2007/08/15(水) 03:29:48
だからModern C++ Design読めって。そもそもmallocなんか使わないよ。
ローカル関数内のstaticオブジェクトを使うのが簡単じゃない?
0325デフォルトの名無しさん2007/08/15(水) 04:20:38
「リソースは解放する」「順序は守る」「両方」やらなくちゃならないのがのC++のつらいところだな。
0326デフォルトの名無しさん2007/08/15(水) 05:39:13
シングルトンの解放に関する話は結構ややこしいからな。
Modern C++ Design 読め、で済ますしかない。
0327デフォルトの名無しさん2007/08/15(水) 07:29:15
機械翻訳のような妙な日本語。
0328デフォルトの名無しさん2007/08/15(水) 08:00:51
>>323
C++でmalloc()使う方がどうかしている。
0329デフォルトの名無しさん2007/08/15(水) 08:43:20
>>324>>328
有名な「malloc/free論争」と同じ
不毛な議論だということを述べているのだと思うが
0330デフォルトの名無しさん2007/08/15(水) 08:46:56
不毛も何も、C++ならnew/deleteがあるのだからmalloc()なんて使わないだろって話だが。
そんなに毛が欲しければCを使っていればいいだけのことだ。
0331デフォルトの名無しさん2007/08/15(水) 09:25:19
論点はmallocかnewか、ではなく
newしたものは必ずdeleteする必要があるか、という点なのだけど。

「mallocではなくnew」などというのは、本質を外れた揚げ足取りに過ぎないと
気が付いているんだろうけど、引っ込みがつかないんだろうね。
0332デフォルトの名無しさん2007/08/15(水) 09:33:22
相手が呆れて去っていきさえすれば勝ちだから、そりゃあ頑張るさ。

「勝者とは強い者のことを言うのではない、戦場に最後まで立っていた者のことを言う」
と、妖魔司教ザボエラ様も仰ってる。
0333デフォルトの名無しさん2007/08/15(水) 09:48:46
deleteするか否かは時と場合による。
0334デフォルトの名無しさん2007/08/15(水) 10:04:49
placement new なら delete しない代わりにデストラクタ呼ぶ、という話か?
0335デフォルトの名無しさん2007/08/15(水) 10:34:09
時と場合で移り気なの
0336デフォルトの名無しさん2007/08/15(水) 10:34:36
スマートポインタ使えよ
RAIIの原則に従っておけば何も考えなくていいんだから
0337デフォルトの名無しさん2007/08/15(水) 10:41:01
newしたらdeleteするのは当たり前だが、mallocしたものはfreeしないと言うこともあるかも知らん。
0338デフォルトの名無しさん2007/08/15(水) 11:10:57
あーあ、mallocやっちゃった。スレタイ読めない馬鹿発見。
0339デフォルトの名無しさん2007/08/15(水) 11:13:18
というのは、レスが読めてない馬鹿の言うことなんだけどね、この場合。
0340デフォルトの名無しさん2007/08/15(水) 11:20:33
delete はデストラクタ呼ぶから、free とは問題が別だよという話だろう。
0341デフォルトの名無しさん2007/08/15(水) 12:09:46
newしたメモリは確実に解放しますか?

私は、解放します。
プログラムの終了まで存在するものとしても解放するべきだと思っています。
0342デフォルトの名無しさん2007/08/15(水) 12:15:10
あーあ、newやっちゃった。スレタイ読めない馬鹿発見。
0343デフォルトの名無しさん2007/08/15(水) 12:31:17
ティンコティンコティンコ
0344デフォルトの名無しさん2007/08/15(水) 12:38:33
デストラクタでOSが自動でやる以上に何か意味のある仕事をするんなら
勿論deleteすべきだろうな
0345デフォルトの名無しさん2007/08/15(水) 12:48:37
RAIIとかリソース所有の概念を知らないやつが混ってるな。
C++必須の概念のはずなのに、知らないやつってホント多いよな。
0346デフォルトの名無しさん2007/08/15(水) 12:52:51
>>345
決め付けは良くないですyo
0347デフォルトの名無しさん2007/08/15(水) 12:53:03
解放しないとデバッガがメモリリークを報告しまくってうっとうしい
0348デフォルトの名無しさん2007/08/15(水) 12:53:52
>>347
それはデバッガがクソ
0349デフォルトの名無しさん2007/08/15(水) 13:01:34
いずれにせよnewしたメモリは全部スマートポインタに突っ込むのが常識だろ。
今時手動deleteとかありえねえ
0350デフォルトの名無しさん2007/08/15(水) 13:04:15
今時ガベコレも無い言語なんて時代遅れもはなはだしい
0351デフォルトの名無しさん2007/08/15(水) 13:25:50
ライブラリでいくらでも実装できるLispとC++は最高、ということですね?
0352デフォルトの名無しさん2007/08/15(水) 13:40:39
スマートポインタが万能だとでも思ってるんだろうか
0353デフォルトの名無しさん2007/08/15(水) 13:42:58
RAIIあれば大抵は処理できるよ。 >350
ガベコレも結局無限リソース(メモリ)しか上手く処理できないしな……
0354デフォルトの名無しさん2007/08/15(水) 13:44:47
循環参照があっただけでおしまいじゃん
0355デフォルトの名無しさん2007/08/15(水) 14:01:29
シングルトンどうしが循環参照してても解放すべきです。
私はそう考えます。
0356デフォルトの名無しさん2007/08/15(水) 14:29:38
おまえいいこと言うな
0357デフォルトの名無しさん2007/08/15(水) 14:48:33
>354
ちゃんとリソース所有権を考えれば循環参照はめったにおこらない。
まあ、考えるのが面倒だからガベコレに頼りたくなるんだけどね。

>355
どういう状況だよ。シングルトンわかってないだろ。
0358デフォルトの名無しさん2007/08/15(水) 14:49:34
>>355
そんなシングルトンが存在すること自体、設計が変だと思わないか
0359デフォルトの名無しさん2007/08/15(水) 14:51:45
寝具る�d�d�d
0360デフォルトの名無しさん2007/08/15(水) 14:57:57
>>357-358
可哀相なくらい行間が読めないコンビだな。
0361デフォルトの名無しさん2007/08/15(水) 15:35:05
読む気ねぇ。ここはマ板じゃねぇし。なんで技術的な部分以外を気にしなきゃいかんのかね?
いい加減夏厨相手にするのも飽きたなぁ
0362デフォルトの名無しさん2007/08/15(水) 15:51:47
馬鹿を晒すぐらいなら書かなきゃいいのに
0363デフォルトの名無しさん2007/08/15(水) 15:54:14
行間なんてものは要するに書き漏らしただけ
ちゃんと伝えたきゃ書け
0364デフォルトの名無しさん2007/08/15(水) 15:56:26
行間っつーか、ギャグだろ。
0365デフォルトの名無しさん2007/08/16(木) 06:38:10
>>361
日本語でコミュニケーションする能力が
技術的な部分と両輪で機能してない間抜けなぞ問題外。
0366デフォルトの名無しさん2007/08/16(木) 14:56:08
(゚ー゚*)ダッコ♪
0367デフォルトの名無しさん2007/08/16(木) 15:29:53
reddit 経由「透過的プログラマ指向ガベコレ for C++」
ttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2310.pdf

Boehm らによる言語機能としてのガベコレ提案。ちょっと期待。
0368デフォルトの名無しさん2007/08/16(木) 18:15:46
class SUBCLASS {
public:
   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:39
あんまり真面目に読んでないけど、とりあえずこうじゃね?
 return (*aaa.subclass)["bbb"]; 
03703682007/08/16(木) 18:44:26
>>369
どうもー
やってみましたがだめでした
0371デフォルトの名無しさん2007/08/16(木) 18:53:11
>>370
エラーメッセージが変わっただろ。ちゃんとその辺を書けよ。
で、戻り値の型がLPSTRなんだから、らreturn文で呼ばずに単独で呼んでみな。
03723682007/08/16(木) 19:00:40
>>371
うーんエラーメッセージは変化なしです
0373デフォルトの名無しさん2007/08/16(木) 19:06:17
aaa.subclass->operator[]("bbb")
03743682007/08/16(木) 19:08:45
>>373
コンパイル通りました
ありがとうございました
0375デフォルトの名無しさん2007/08/16(木) 19:11:26
意味があるかは知らんが、(*aaa.subclass)["bbb"] でコンパイルは通るぞ。
0376デフォルトの名無しさん2007/08/16(木) 19:11:34
>>373
俺もそうだと思ったけど、関数形式で呼ぶのがなんか嫌だから書かなかった
なんか解決策ないかね
03773712007/08/16(木) 19:13:21
>>372
そうか? 前者は引き数が合わなくて関数が見つからないが、後者は戻り値の型が合わなくてエラーになると思うのだが。
つーか、なんでまたmain()のreturnなんかで試すんだ? >371の後半は読んでないのか?
03783762007/08/16(木) 19:13:31
ああそうか、違和感の理由が分かった。
連想配列にしたくて添え字をオーバーロードしているはずなのに
opreator[]で呼んだら意味を成さなくなっちゃうからだ。
03793762007/08/16(木) 19:15:59
つうことで解決案

subclassをカプセル化して、参照越しにoperator[]を呼ぶ
0380デフォルトの名無しさん2007/08/16(木) 19:23:44
(*aaa.subclass)["bbb"] でコンパイル通らず、
aaa.subclass->operator[]("bbb") でコンパイル通るってあり得ないと思うんだが。
03813682007/08/16(木) 19:28:22
>>375
あわわ間違って(*aaa.subclass["bbb"])としちゃってたようです

>>377
エラー部分だけ抜き出そうとして型違いのreturnになってました、ごめんなさい…

>>379
単語の意味がわかってないので検索してやってみます、ありがとうございました
0382デフォルトの名無しさん2007/08/16(木) 19:35:38
でもなんでchar *じゃなくて、char * &なんだろう。
constでないということは、こういうことがやりたいんだろうか。


(*aaa.subclass)[''bbb"] = new char[10] ;

いや、ひょっとしたらこういうことがしたいのか

char * & ptr = (*aaa.subclass)[''bbb"] ;
ptr = static_cast<char *>( realloc(ptr) ) ;
0383デフォルトの名無しさん2007/08/16(木) 20:59:50
class Base
{
public:
Base(int n) {}
};
class Derived : Base
{
public:
Derived(int n) {}
};
これがどうしてダメで、Base::Base()が必要なのか教えてください。
0384デフォルトの名無しさん2007/08/16(木) 21:06:38
親クラスに n を渡すなら、それをちゃんと書かなきゃいけない。

public:
Derived(int n) :Base(n) {}
0385デフォルトの名無しさん2007/08/16(木) 21:06:53
はい?
0386デフォルトの名無しさん2007/08/16(木) 21:07:27
>>383
その例のDerived のコンストラクタは結局 Derived(int n) : Base() {} の省略形だから
0387デフォルトの名無しさん2007/08/16(木) 21:21:45
そのnは親に渡さずに別に使うnかもしれないし。
0388デフォルトの名無しさん2007/08/16(木) 23:12:17
>>383
Derived クラスのインスタンスを生成するときに
Base クラスのコンストラクタを呼び出すからなんだと思います。
コンストラクタを定義していないときはデフォルトコンストラクタが呼び出されるけど
定義してると定義されたものを呼び出すから
この場合は引数のいらないコンストラクタを定義するか
Derived クラスのコンストラクタで
Derived(int n) : base(100) {}
みたいに Base(int n) を呼び出して
引数を渡さないとだめだと思うんです。

初心者なんで間違ってるかもしれません。


っていうか STL 難しすぎでうっ!
0389デフォルトの名無しさん2007/08/16(木) 23:20:25
Baseのコンストラクタにデフォルト値を書いておくのもいいかも

っていうか STL 関係ねー
0390デフォルトの名無しさん2007/08/17(金) 00:01:01
>>388
>っていうか STL 難しすぎでうっ!
でうっ?
0391デフォルトの名無しさん2007/08/17(金) 00:20:57
唐突にこれを思い出した
ttp://www.karakuri-box.com/~killer-q/file7/KITERETU0022.png
0392デフォルトの名無しさん2007/08/17(金) 00:41:05
すいません。釣りではありません。
C++ってどんな局面で使うんですか?
WinアプリならC#使ったほうが圧倒的に楽
0393デフォルトの名無しさん2007/08/17(金) 01:00:07
脳みそ沸かしたいとき
0394デフォルトの名無しさん2007/08/17(金) 01:24:19
Cで先頭アドレスと要素数がわかってるのですが
ForループじゃなくてC++のiteratorに変換してくれるtemplateとかないんですか?

ない場合どのiterator継承すればいいんでしょうか
0395デフォルトの名無しさん2007/08/17(金) 01:40:46
T*head; size_t element;が既知なんでそ?
なら、&head[0]〜&head[element]がiteratorの要件を満たしてくれるでそ?
0396デフォルトの名無しさん2007/08/17(金) 01:48:01
>>392
楽かどうかなら C# が楽だろうが、
C# は Windows にしか優しくないし、
速度も C++ に劣るし、
そういうのが必要な時には C++ が圧倒的有利。
0397デフォルトの名無しさん2007/08/17(金) 02:19:58
速度が必要になるようなミッションクリティカルな場面に出会ったことがない
最近は全部C#。
0398デフォルトの名無しさん2007/08/17(金) 02:21:20
サーバーアプリだとC#?ハァ?
0399デフォルトの名無しさん2007/08/17(金) 02:38:29
?
0400デフォルトの名無しさん2007/08/17(金) 03:59:53
つかここ#かんけーねーし
0401デフォルトの名無しさん2007/08/17(金) 05:58:45
>>392
C#を実装するのに使います
0402デフォルトの名無しさん2007/08/17(金) 12:37:18
>>401が良い事言った
0403デフォルトの名無しさん2007/08/17(金) 21:16:42
なぜ想像力がデスクトップとサーバー位にしか働かないんだ
プログラムが必要な場面はいろいろあるぞ
0404デフォルトの名無しさん2007/08/17(金) 21:39:47
class CFUNC a;
の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:50
typedef CFUNC*** PPPCFUNC
typedef 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:53
VC++では先頭の手前に要素数が格納されてた希ガス
04074042007/08/17(金) 22:59:04
なるほど、typedefを忘れてました。
ではこれで確保したpppaはdelete[] pppaで破棄できるんですねっ!
要素数は、
int pppa_len_y;
int *pppa_len_x = new int[ pppa_len_y ];
でnew時に一緒に初期化しています。
もっと手軽な方法ありますか?
04084042007/08/17(金) 23:02:44
>406
それじゃぁmallocするときに、必要size+1とってfreeのときにそれ利用してるんですねぇ。
ってことは要素数を保持しなくても、ポインタの手前の要素数使えってこと?
ちなみにc++の規定ですか?処理系依存ですか?
0409デフォルトの名無しさん2007/08/17(金) 23:17:52
処理系依存。
04104042007/08/18(土) 00:17:58
>>405
PPPCFUNC pppa = new PPCFUNC[y_len];
でnewしようとすると、PPFUNC*からPPPFUNCに変換できません
と怒られてしまいました。
PPPCFUNC pppa = (PPPFUNC)( new PPCFUNC[y_len] );
でキャストして大丈夫なのでしょうか?
04114042007/08/18(土) 00:36:14
すいません、勘違いです。typedefミスってました。OTL
04123832007/08/18(土) 11:08:57
>>384-389
ありがとうございました。よくわかりました。

最近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
>>412
生でnewを使うからそういう羽目になる。
std::stringを使うなり、std::vectorを使えばいい。
せめて、スマートポインタを使え。
0414デフォルトの名無しさん2007/08/18(土) 11:34:02
コピーコンストラクタや代入演算子をちゃんと書かないから・・
0415デフォルトの名無しさん2007/08/18(土) 12:19:01
C++を使う時は、リソースの所有権を常に意識する必要がありますな。
RAIIはちゃんと勉強しといたほうが良いよ
0416デフォルトの名無しさん2007/08/18(土) 12:37:37
そうだな、コピーコンストラクタと代入演算子は常に書くべき。
0417デフォルトの名無しさん2007/08/18(土) 12:40:35
Java→C++とか死亡ルートじゃね?
Java→C→C++って回るべきだと思うんだが
0418デフォルトの名無しさん2007/08/18(土) 13:32:09
GC付きC++って選択肢もあるんでないの(w
0419デフォルトの名無しさん2007/08/18(土) 14:17:34
Javaなんか使うから頭が馬鹿になるんだよ。
GC付きの言語を使うと変な癖が付く。
0420デフォルトの名無しさん2007/08/18(土) 15:08:22
時代に逆行している人
0421デフォルトの名無しさん2007/08/18(土) 16:59:23
>>417
自分は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
>>422
コンストラクタの中でキャッチするか、プログラムが死ぬか。
0424デフォルトの名無しさん2007/08/18(土) 17:36:05
>422
staticをやめる
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:49
>>425
basic_ostream っていうクラステンプレートに対して定義されている。
char もテンプレート引数になってるからちょっと探しにくいだろうね。
ヘッダ ostream に対応するファイルで定義されているはず。

ごちゃごちゃしたヘッダを読むのがいやなら >>2 から規格のドラフトでも見るといい。
0427デフォルトの名無しさん2007/08/19(日) 17:00:46
教えてください。
0428デフォルトの名無しさん2007/08/19(日) 17:31:07
何をだ
0429デフォルトの名無しさん2007/08/19(日) 18:41:48
>>428
事故解決すますた
0430デフォルトの名無しさん2007/08/19(日) 21:20:33
>>426
ありがとうございます。
ファイル見てみたんですけど
今の僕にはまだ難しくてよくわかんないんで規格もみたんですけど
いまいちわからなくて
検索してたら説明されてるページをみつけました。
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:28
そんなに文句あるんならnamespace使うなりClassAとClassBを統合するなりすれば?
0434デフォルトの名無しさん2007/08/20(月) 16:20:59
初心者だからよくわかんないんですけど
DataClass をメンバとして持つんですか?
ClassA と DataClass の関係って必要なんですか?
ClassB経由で十分なんじゃないでしょうか?
0435デフォルトの名無しさん2007/08/20(月) 16:23:07
関連のあるABのオブジェクトが同じDataClassオブジェクトと関連を持つかどうかは示されていない。
むしろ同じオブジェクトではないと考えるほうが自然。
0436デフォルトの名無しさん2007/08/20(月) 16:28:10
A, B, DataClassを保持する親クラスParentを作っておいて、A, Bのインスタンス生成時にParentへのポインタを渡し、
各インスタンスはParentへのポインタを通してDataClassへとアクセスする。
0437デフォルトの名無しさん2007/08/20(月) 16:30:25
B に入れといて、B を通して操作する。
0438デフォルトの名無しさん2007/08/20(月) 16:35:13
多重継承はやめとけ。実世界でも親の種が違う生き物は短命だ。
0439デフォルトの名無しさん2007/08/20(月) 16:36:43
どこに多重継承が出てくるんだ?
0440デフォルトの名無しさん2007/08/20(月) 16:59:47
あの矢印は関連。サブクラスは白抜き三角矢印。
0441デフォルトの名無しさん2007/08/20(月) 17:56:47
たくさんのご回答ありがとうございました。

複数の方法論に、そもそも設計の段階でご意見まで、たくさんいただきまして、ありがとうございます。

少し数があるので、それぞれについて吟味して、決めた際にまた改めてのお礼がてらご報告にきたいと思います。
ありがとうございました。
0442デフォルトの名無しさん2007/08/21(火) 09:33:29
>改めてのお礼がてらご報告にきたいと思います。
しなくていいよ。
0443デフォルトの名無しさん2007/08/23(木) 00:48:57
stringstring を途中で空にすることはできるでしょうか?
0444デフォルトの名無しさん2007/08/23(木) 00:56:17
std::stringstream?
0445デフォルトの名無しさん2007/08/23(木) 01:27:07
なんだこのバグは
http://support.microsoft.com/kb/326616/ja
>>443
stringstream.str("");
0446デフォルトの名無しさん2007/08/23(木) 02:00:38
>>445
鬱になった
やはりSTLportを入れて使(ry
0447デフォルトの名無しさん2007/08/23(木) 02:10:08
std::coutで、時々アドレスのような文字列("0xABCDEF12"みたいな)が出力されたり、
std::wcoutで何も出力されなかったりして困ってたんだけど、445が原因?
でもVS2005 Proだから違うか
0448デフォルトの名無しさん2007/08/23(木) 02:34:28
>>447
coutにwchar_t*食らわしたり、localeを適切に設定せずに日本語文字列食わしてるならお前が悪いだけ。
0449印字ケータ2007/08/23(木) 14:31:20
バイナリエディタでファイルを開くと

保存してある漢字の"日"という文字は16進数で93 FAと表示されてますが、

コレを読込んで、配列に入れると-109と-6となります。

16進数で表示させたいので、変換する方法を教えてください。

お願いします。
0450デフォルトの名無しさん2007/08/23(木) 14:35:18
unsignedにキャストすればいいんじゃね。
0451デフォルトの名無しさん2007/08/23(木) 14:40:35
93 FA を2進数であらわすと
1001 0011 1111 1010
10010011 を符号付き10進数であらわすと
-109
11111010 を符号付き10進数であらわすと
00000110
-6

そのまま16進にすれば同じ
気にしないで突き進め

char を intにするなら符号拡張がおきるので>>450のとおりunsigned にしとけばいい
0452印字ケータ2007/08/23(木) 14:42:15
>>450

返答ありがとうございます。

早速やってみましたが、変換後に4294967187というデカイ数値になりました。

ちなみに、unsignedの変数にキャストして代入してみました。

もしかして私のやり方が間違ってますか。

0453デフォルトの名無しさん2007/08/23(木) 14:54:41
4294967187 ってのは16進に直すと ffffff93
93 はマイナスだから、そのままint にもってくと 符号拡張するんだよ
unsigned にキャストってどこでどうやったの?
unsigned な変数に入れてやってみ。
0454デフォルトの名無しさん2007/08/23(木) 14:56:17
符号拡張されてるんだろう
10010011→11111111111111111111111110010011
0455デフォルトの名無しさん2007/08/23(木) 15:04:05
char ch = 93;
int n = (unsigned char)ch;
0456デフォルトの名無しさん2007/08/23(木) 18:34:31
>>445
Dinkum版stringの短文字列最適化がアダになったな。
実装としては面白くて好きなんだがな。
0457デフォルトの名無しさん2007/08/23(木) 22:36:57
2005SP1で直ってるっぽいが
0458デフォルトの名無しさん2007/08/30(木) 08:15:51
vector< struct X > Func_A();
vectorとかコレクションを返す関数って効率悪い?
0459デフォルトの名無しさん2007/08/30(木) 08:30:10
>>458
コンテナを参照で受け取ったほうがいいんじゃないか?
0460デフォルトの名無しさん2007/08/30(木) 08:44:11
そこでRVOに期待、右辺値参照にもっと期待。
0461sage2007/08/30(木) 10:25:41
>>459
参照で受け取るっていうのは
void Func_A( vector< struct X >& );
か、
vector< struct X >& Func_A();
ってことですか?
とりあえず上の参照を引数にする方でやってみます
0462デフォルトの名無しさん2007/08/30(木) 11:47:47
vector< struct X >& Func_A();
はどっかに所有者用意しなきゃいけないから色々と面倒じゃね?

基本はauto_ptr戻しだと思うけど。
0463デフォルトの名無しさん2007/08/30(木) 23:55:27
いや、たぶん void Func_A(std::vector<struct X>& arg) のことだろう。

仕様と実装を混同するのはよくないが、実際には多くのコンパイラにおいて
「構造体(class)を返す関数」は、暗黙の引数(返り値へのポインタ)を受け取って、
そこに書き込んで返しているわけだから。

で、return直前にインスタンスを生成する以外の場合、つまり
ローカル変数としてvectorを宣言していろいろ操作しそれを返す場合
おそらくRVOされる可能性も低いんじゃないね。知らないけど。
0464デフォルトの名無しさん2007/08/31(金) 00:49:22
>>463
よくある戻り値用のポインタが指しているのは確保されただけで
まだコンストラクタが走ってない領域ね。引数で受け取る場合は
必ず構築済みのインスタンスを指すんで、仕様的にも違いがある。

最後の場合は「可能性が低い」じゃなくて RVO は不可能。
0465デフォルトの名無しさん2007/08/31(金) 00:52:15
>>464
Named RVOはVC8がやってるらしいですぜ

http://msdn2.microsoft.com/en-us/library/ms364057(vs.80).aspx
0466デフォルトの名無しさん2007/08/31(金) 00:55:03
ずっと前の gcc に付いてたのに削除されたな。あれは仕様的に
何か問題があったんだろうか?
0467デフォルトの名無しさん2007/08/31(金) 01:09:49
http://gcc.gnu.org/gcc-3.1/changes.html
コンパイラが勝手にやるようになったから文法からは削除されただけみたい。
04684642007/08/31(金) 01:23:50
いろんな変数返されたとき困るじゃん、とか思ってたけど、そうじゃないときには
働くのね。ふーん。
0469デフォルトの名無しさん2007/08/31(金) 01:35:07
引数が同じで戻り値が違う型の関数を定義する方法って知らないですか?
できればクラスのメンバ関数でやりたいです
まえにWebで見かけたんだけど見つからなかったorz
0470デフォルトの名無しさん2007/08/31(金) 01:48:21
>>469
引数の型が同じなら関数を呼び分けることができないから、基本的に無理だろう。
戻り値の型を基底クラスのポインタにして、異なる型の派生クラスのオブジェクトの
ポインタを返すとかじゃダメ?
0471デフォルトの名無しさん2007/08/31(金) 03:13:32
>>469
こんな感じ?

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:28
浮動小数点の小数点以下を簡単に取る方法ってないですか?
0473デフォルトの名無しさん2007/08/31(金) 15:13:39
f - floor(f)
0474デフォルトの名無しさん2007/08/31(金) 16:14:22
>>472
modf
>>473は負数のとき正しくない
0475デフォルトの名無しさん2007/08/31(金) 17:35:42
f = f - (float)((int)f);
とかじゃ駄目?
0476デフォルトの名無しさん2007/08/31(金) 18:59:33
f > -1 ? f - floor(f) : aaaaaaaaa
0477デフォルトの名無しさん2007/08/31(金) 19:19:41
>>475
もともと整数部分がint範囲を超えてる場合があるので、
intにキャストするのはまずいと思われ。
0478デフォルトの名無しさん2007/08/31(金) 23:01:01
まさにそのための trunc (truncf) という関数があるんだが、
調べてみたらこれは C99 で定義されてるらしいから C++ では普通使えないな

とはいえ持ってる処理系に存在するかどうかは調べてみたらどうよ
0479デフォルトの名無しさん2007/08/31(金) 23:31:14
unsigned longにキャストは駄目なのか
0480デフォルトの名無しさん2007/09/01(土) 00:05:17
fmod(f, 1.0)
04814692007/09/01(土) 00:26:15
>>470,471
レス�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:07
vector<char> v;

for (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:18
>>482
unsigned でも警告は消えるけど、v.size()のリターン値と同じ型を使うのが普通。
0485デフォルトの名無しさん2007/09/02(日) 00:12:08
これが規格厨を黙らせる、完璧に正しい方法。

for ( vector<char>::size_type i = 0 ; i < v.size() ; ++i )
0486デフォルトの名無しさん2007/09/02(日) 00:16:44
そこでautoとか未来を先走るわけですよ。カモンC++0x
0487デフォルトの名無しさん2007/09/02(日) 00:23:34
>>486
でもこの場合どうやるんだろう。
そもそも>>482はstd名前空間のvectorではないから、自前実装の俺様vectorである可能性もあるんだよね。
ひょっとしたら、size_typeなど定義されていないかもしれない。

こういうことできるの?

decltype( v.size() ) i ;

sizeofに関数を渡すと、戻り値の型のサイズになるから、
decltypeだと戻り値の型になってくれるんだろうか。

なんてことをふと考えてしまった。
どうなるの? 教えてハゲな人。
0488デフォルトの名無しさん2007/09/02(日) 00:27:02
さすがにバカ過ぎるだろ
04894862007/09/02(日) 00:30:15
すまん、脳内フィルターで485のループがイテレータに見えていた。
for (auto i = v.begin(); i != v.end(); ++i)
0490デフォルトの名無しさん2007/09/02(日) 00:40:25
>>483-489
なるほど。さんくすです。

>> 484
やっぱりそうですよね。
安易に型決めるんじゃなくてちゃんと考えるべき何ですよね。

>> 485
感動しました。

0491デフォルトの名無しさん2007/09/02(日) 01:34:22
何でイテレータ使わないの? >482
i++使う意味も判らん……
0492デフォルトの名無しさん2007/09/02(日) 01:50:17
482じゃないが、iの値自体が処理に絡む場合はイテレータ使えんだろ

for (int i = 0; i < v.size(); i++) v[i] = i;

みたいな。
0493デフォルトの名無しさん2007/09/02(日) 01:59:53
>>491
初心者だからだろ。
そのくらいわかれよ。
0494デフォルトの名無しさん2007/09/02(日) 08:40:18
>>487
できるよ。
0495デフォルトの名無しさん2007/09/02(日) 12:06:53
>>491
そうですね。イテレータでもいけそうですね。
今はサンプルプログラム打ちながら勉強してるんで
そこまでは思いつきませんでした。

>>492
ブロック内部でローカル変数作れば解決できそうですね。

またひとつ勉強になりました。
ありがとうございます。
0496デフォルトの名無しさん2007/09/02(日) 13:35:18
>>495
そうそう、ループはイテレータで書くのが癖になると、内部でint idx = it - vec.begin()みたいなのを書くのも癖になる。
0497デフォルトの名無しさん2007/09/02(日) 13:47:29
C++に限ったことではないですけど、Map型とList型って似て非なる物だといいますけど、いざって時にList→MapにしたりMap→Listにしたりする時は
どうすればよいのでしょう。効率的に考えて
0498デフォルトの名無しさん2007/09/02(日) 13:50:09
どういう変換をしたいのかサパーリ
似て非なるっていうか、ListとMapは別物じゃ?
0499デフォルトの名無しさん2007/09/02(日) 13:55:44
>>498
変換というか、Map型を継承しているクラスがList型で取り出せたりその逆も・・・出来る感じの事。
説明下手ですまそ。
0500デフォルトの名無しさん2007/09/02(日) 13:57:46
std::map<a,b> を std::list< std::pair<a,b> >にコピーする話なら、
std::copy(map.begin(), map.end(), std::back_inserter( list ) )
でいけるんじゃね?効率なら知らん。
0501デフォルトの名無しさん2007/09/02(日) 14:26:23
list.assign(map.begin(), map.end()) だろ。
0502デフォルトの名無しさん2007/09/02(日) 14:42:28
>>499
っ アダプタパターン
0503デフォルトの名無しさん2007/09/03(月) 01:48:49
クラステンプレートに関して質問させてください、
template <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
>>503
うん。
何回も書くようなら typedef しとく。
0505デフォルトの名無しさん2007/09/03(月) 02:01:24
>>500-502
ありがとうございます。もう少し勉強してみます。
0506デフォルトの名無しさん2007/09/03(月) 02:03:57
現状だとtemplateに逃げるしかないな。
05075032007/09/03(月) 13:52:09
遅レスですみません、回答ありがとうございました。
>>506
なるほど、やっぱそうするしかないのですね・・
とりあえずはHoge.m_fuga.foo
みたいに全部書いて指定することにしました。

こういうのってテンプレートの仕様上仕方の無いことなんですかねぇ。
ヘッダにしか書けないのもそうだけど、非テンプレートコードと比べて
可読性が下がるのは、テンプレートの勉強を始めた自分にとっては
しょんぼり来てしまう(´・ω・`)
ともあれどうもありがとうございました。
0508デフォルトの名無しさん2007/09/03(月) 14:09:43
ここも将来的には auto で解決するところかな。
0509デフォルトの名無しさん2007/09/03(月) 20:01:18
どうでもいいけどC++0x::autoって従来のCのautoと被らね?><<>
0510デフォルトの名無しさん2007/09/03(月) 20:10:05
C++ソースとCソースが混在していてCソース側にautoがあった場合ってこと?
オブジェクト単位でコンパイル分ければいい
終わり
0511デフォルトの名無しさん2007/09/03(月) 20:26:45
いまさら誰がautoなんて使ってるんだ?
0512デフォルトの名無しさん2007/09/03(月) 20:33:24
俺だよワリオだよ
0513デフォルトの名無しさん2007/09/03(月) 22:17:40
>>509
暗黙のintは廃止されたから、
現在のC++での「auto x;」はコンパイルエラー。
「auto int x;」と書かないといけない。
0514デフォルトの名無しさん2007/09/03(月) 22:20:45
>509
C++ 的には(C99もそうなったけど)宣言時の int の省略が認められないから一意に解釈可能なはず。
C89 での auto i; と同じ意味を持たせるなら auto int i; と書く必要がある。
0515デフォルトの名無しさん2007/09/03(月) 22:21:25
思いっきりかぶりましたとさ。
0516デフォルトの名無しさん2007/09/03(月) 23:35:13
一つのキーワードに複数の意味なんてstaticで経験済みさ
0517デフォルトの名無しさん2007/09/04(火) 04:09:37
今、VisualC++使ってます。
たとえば、123214332っていう数字があった場合、3桁区切りで123,214,332って表示しようと思ってる。
いい関数ない?やっぱ自作?,
0518デフォルトの名無しさん2007/09/04(火) 04:13:24
>>517
マルチしないでさっさとイネ
0519デフォルトの名無しさん2007/09/04(火) 04:26:42
>>517
setlocale
0520デフォルトの名無しさん2007/09/04(火) 05:33:02
>>519
ありがとう。
調べてみる。
0521デフォルトの名無しさん2007/09/04(火) 07:51:20
>>520
死ねカス
0522デフォルトの名無しさん2007/09/05(水) 00:48:40
リリースモードでは問題なく動いてるようなんだけど
デバッグモードでアサーション?がでる。
別の似たコードでは問題ないんだけどなぁ・・・。
原因がわからん
眠い。
寝る
0523デフォルトの名無しさん2007/09/05(水) 01:04:21
>>522
リリース時も同様に値がおかしいけど、エラーとして表示されてないだけってことはないよね。
0524デフォルトの名無しさん2007/09/05(水) 02:36:54
>>522
失敗してるアサートの条件を満たさないことがあるってことだな。
デバッガで現場を押さえればおおかた原因がわかるだろ。
0525デフォルトの名無しさん2007/09/05(水) 10:39:58
わっかたああああああああああああああああああああああ
0526デフォルトの名無しさん2007/09/05(水) 11:00:35
vectorコンテナの要素を削除した後に
イテレータを取得し直さないで使おうとしたのがまずかったようだ。
うっかりやっちゃった。
リリースビルドではたまたま問題なかっただけってことかな。
0527デフォルトの名無しさん2007/09/05(水) 15:00:58
コンパイルはできるのですが、実行時にvectorの部分で止まってしまいます。
ソースは以下になります。

istream_iterator<string> start(cin);
istream_iterator<string> end;
vector<string> v(start , end);

C++を勉強始めたばかりで初歩的な質問だと思いますが、お願いします。
0528デフォルトの名無しさん2007/09/05(水) 15:19:45
標準入力から、ちゃんとEOFが出るまで読み込んでるのに止まるということ?
0529デフォルトの名無しさん2007/09/05(水) 15:25:51
>>528
デバッガで動きを確認したところ、標準入力から、
ちゃんとEOFが出るまで読み込んでいます。
しかし、vectorを作成する部分で止まってしまって
いる状況です。
0530デフォルトの名無しさん2007/09/05(水) 15:51:51
止まるってアプリが強制終了するって事か?
0531デフォルトの名無しさん2007/09/05(水) 16:20:55
入力待ちなんだと思うけどな
0532デフォルトの名無しさん2007/09/05(水) 20:33:36
>>530
vectorの実行するところでループしている感じです

>>531
入力のcinの部分は実行されていました
0533デフォルトの名無しさん2007/09/05(水) 20:48:31
>>527
私の環境では動きましたよ。
0534デフォルトの名無しさん2007/09/05(水) 22:48:50
たまにはexportを思い出してあげて下さい……。
0535デフォルトの名無しさん2007/09/05(水) 22:57:19
C++0xスレにお越し下さい
0536デフォルトの名無しさん2007/09/06(木) 12:02:54
>>533
#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
>>536
>>531
0538デフォルトの名無しさん2007/09/06(木) 12:19:41
WindowsならCtrl+Z、UnixならCtrl+Dだっけ。
C++と全く関係ない話だ。
0539デフォルトの名無しさん2007/09/06(木) 12:47:03
進まないとか止まるってのはどういう状態のことを言ってるんだ?
こっちで再現できるだけのソースを貼るんじゃなかったら
その辺キッチリ書けよ
0540デフォルトの名無しさん2007/09/06(木) 18:03:38
>>537-539
ありがとうございました。
何とか解決しました
0541デフォルトの名無しさん2007/09/06(木) 18:14:10
何がどう解決したのかも書かない。
これでは何の肥やしにもならない。
糞以下だね。
0542デフォルトの名無しさん2007/09/06(木) 18:22:47
>>541
すみません。
しかし色々いじっているうちに解決してしまったので、何がどうと言われても答えようがないのです。
0543デフォルトの名無しさん2007/09/06(木) 18:35:01
>>541
まぁまぁ、こういう奴はプログラミング向いてないから
いずれ挫折するなり淘汰されるなりしてこの分野から消えてくれるさ。
0544デフォルトの名無しさん2007/09/06(木) 18:47:54
と自分へメッセージ
0545デフォルトの名無しさん2007/09/06(木) 19:32:13
>>542=544
プログラマとしても人間としても糞以下だね
0546デフォルトの名無しさん2007/09/06(木) 20:11:09
と糞未満のものが申しております
0547デフォルトの名無しさん2007/09/06(木) 20:37:28
真性だな可哀想に
0548デフォルトの名無しさん2007/09/06(木) 20:58:04
ビクンビクン・・・!!
0549デフォルトの名無しさん2007/09/09(日) 23:45:03
>>540>>542
>色々いじっているうちに解決
いじる前後の違いを説明できないと言うのは理解できていないということ。
解決できていない可能性が高い。たまたま動いているだけのソースを直すのが...
0550デフォルトの名無しさん2007/09/09(日) 23:47:30
>>545
あと、自演乙
0551デフォルトの名無しさん2007/09/10(月) 00:19:22
「vectorの部分で止まってしまいます」
これがダウトだったんだろうな
0552デフォルトの名無しさん2007/09/10(月) 00:58:09
メンバ関数ポインタから整数型へのキャストができた試しはないけど、
どうもそれを禁止している条項が規格を洗っても見つからない。
誰か、どこにあるか知ってる人いますか?
0553デフォルトの名無しさん2007/09/10(月) 01:10:26
肯定的な形でreinterpret_castの
0554デフォルトの名無しさん2007/09/10(月) 01:55:41
ポインタは同じサイズの整数型へとキャストできるけど、結果は処理系依存、ってやつのことですよね?
処理系依存だから禁止するのも処理系次第、ってことでいいんですかね。
0555デフォルトの名無しさん2007/09/10(月) 02:02:42
僕の肛門からも悪魔が出そうです><
0556デフォルトの名無しさん2007/09/10(月) 02:03:29
ポインタを同じサイズの整数型にキャストしたときは、それを元のポインタに戻せるはずじゃ?

A pointer converted to an integer of sufficient size (if any such exists on the implementation)
and back to the same pointer type will have its original value;
mappings between pointers and integers are otherwise implementation-defined.
0557デフォルトの名無しさん2007/09/10(月) 02:04:32
いや、そもそもキャスト自体がコンパイル通らない。
VC++ でも g++ でも。
0558デフォルトの名無しさん2007/09/10(月) 02:08:24
もちろん、普通のポインタならキャストは通る。
でも、メンバポインタだと通らない。
警告じゃなくて、エラーになる。
0559デフォルトの名無しさん2007/09/10(月) 02:16:34
メンバポインタは
0560デフォルトの名無しさん2007/09/10(月) 02:20:11
>>558
だったらメンバ関数のキャストの仕方間違ってるだけだろ
0561デフォルトの名無しさん2007/09/10(月) 02:21:32
boostとかで、
namespace xxx_detail{ ふがふが }
ってのを見掛けるんですが、
これは何か意味あるんですか?
ADLの効果抑止とか?

無名namespace( namespace { げふげふ } )とかじゃダメなの?
0562デフォルトの名無しさん2007/09/10(月) 02:26:30
(C++というプライドに賭けた)保守性を考慮した結果。
彼らがあくまでC++プログラマという事を忘れてはいけない。
0563デフォルトの名無しさん2007/09/10(月) 03:40:05
>>561
ヘッダで宣言するコンポーネントに無名 namespace の名前を使ったら、
コンパイル単位ごとに個別の宣言になっちゃうから、 ODR 違反になるだろ。
0564デフォルトの名無しさん2007/09/10(月) 07:42:42
>>552
5.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
C/C++室でも出てた話題だけど、メンバポインタはvoid*には変換できないが、メンバポインタへのポインタならvoid*に変換できると誰かが言っていた。
[void*]を[整数型]として考える
0566デフォルトの名無しさん2007/09/10(月) 10:56:38
>>564
それだ! 凄いわ。ありがとう。
0567デフォルトの名無しさん2007/09/10(月) 11:03:16
人権擁護委員会が在日を擁護する時
ttp://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
質問です。hogeオブジェクトを大量に生産しつつ、いらなくなったものを削除しようとして、
以下のようなコードを書きました。

//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:45
実際にどこが遅いのかを特定するところから始めたらどうだ
0570デフォルトの名無しさん2007/09/11(火) 21:41:35
C++の話じゃないかもしれないけど、C++で書いてるので質問させてください

0x00と"\x00"って何が違うんですか?
0571デフォルトの名無しさん2007/09/11(火) 21:44:53
>>570
数値と文字(列)の違い
0572デフォルトの名無しさん2007/09/11(火) 22:01:11
std::cout << typeid(0x00).name() << std::endl;
std::cout << typeid("\0x00").name() << std::endl;
0573デフォルトの名無しさん2007/09/11(火) 22:13:32
文字は整数です。
0574デフォルトの名無しさん2007/09/11(火) 23:16:31
仮に0x00と'\x00'の違いだったとしたら、
C++の場合、値としては同じ0でも前者はint型で、後者はchar型という違いがある。
0575デフォルトの名無しさん2007/09/12(水) 00:32:31
おお、知らなかった。C++だと文字リテラル
(この用語自体C++からみたいだけど)はcharなのね。
0576デフォルトの名無しさん2007/09/12(水) 01:03:12
理由は演算子多重定義の都合。
IOストリーム作っていたときにそうすべきと感じたそう。
D&Eに書いてある。
0577デフォルトの名無しさん2007/09/12(水) 03:26:38
"\x00" == { 0x0, 0x0 }
0578デフォルトの名無しさん2007/09/12(水) 03:40:04
  ノ| ,ノ|
 ( 0x0)b

  ノ| ,ノ|
 (; 0x0)a
0579デフォルトの名無しさん2007/09/12(水) 19:55:32
>>575
int だったり 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
> inlineの使い方が間違っているのでしょうか
そうです。
0582デフォルトの名無しさん2007/09/12(水) 23:14:20
>>580
#inlucde
これは試したソースではちゃんとしてるんだろうか?
0583デフォルトの名無しさん2007/09/12(水) 23:20:50
インライン関数は、普通ヘッダに定義を書く。
0584デフォルトの名無しさん2007/09/12(水) 23:24:30
>>580
inline関数はその呼び出された場所に展開されることが前提になりますから、
呼び出し元でその定義が分かるようにしなければなりません。
したがって、通常はヘッダ内で定義し、そのヘッダを#includeします。
>>580の場合は、test.hで定義するのが適当かと思います。
05855802007/09/12(水) 23:40:58
明快に理解できました。
頭の靄がいっぺんに貫かれて光が差し込まれたような晴々しい気分になりました。

丁寧な説明ありがとうございます。
0586デフォルトの名無しさん2007/09/12(水) 23:53:53
寧ろ、inlineなんかは積極的に使わずにコンパイラの最適化に任せた方がいいと思うが。
0587register2007/09/12(水) 23:56:06
おいらのこともたまには思い出してくれないか?
0588デフォルトの名無しさん2007/09/13(木) 00:25:43
>>587
そう言えばconstも、今はプログラマ側の変更不可、副作用不可という側面が際立って紹介されてるけど
K&R読むとキャッシュへの最適化を促すregisterの様に、殆ど読み込みしかしないメモリに配置されて速度的に有利になる様な
最適化を、コンパイラへ促す効果があると記述されてたね。今のハードウェアの観点から考察すするとどうかは知らないけど。
0589デフォルトの名無しさん2007/09/13(木) 16:50:41
初期化された const T[] がROM化可能な領域に配置されるのは
昔のコンパイラには良くある振舞い。まぁ今でも似たようなものか。
プロセス間で場合共有可能なページという感じで。
0590,5882007/09/13(木) 21:06:23
なんか趣旨が伝わりにくい文章ですが、要するにregisterもconstもに多様な位置づけだよね、ってことです。
0591デフォルトの名無しさん2007/09/13(木) 22:26:55
>>590
いいえ。
0592デフォルトの名無しさん2007/09/13(木) 23:33:35
それはトムです。
0593デフォルトの名無しさん2007/09/13(木) 23:43:15
tomcat
0594デフォルトの名無しさん2007/09/14(金) 00:01:10
わろた
0595デフォルトの名無しさん2007/09/14(金) 00:03:35
べ、別にわろてなんかいません!勘違いしないでください!
0596デフォルトの名無しさん2007/09/14(金) 11:29:42
トムも仏も無い
0597デフォルトの名無しさん2007/09/15(土) 19:56:06
ところで作りかけのソースあっぷしたら虐めてくれますか?
0598デフォルトの名無しさん2007/09/15(土) 21:39:52
うん
0599デフォルトの名無しさん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:23
ファイルを分割して読み込む
06015992007/09/17(月) 03:41:50
>>600
あーなるほど!
それも一つの手ですね!
06025992007/09/17(月) 04:01:35
>>600
お礼を言い忘れました。
どうもありがとうございました。
0603デフォルトの名無しさん2007/09/17(月) 05:15:30
あとはまぁ、行頭位置のインデックスを作るとか。
元ファイルを調べて、「改行の次の位置」をvector<ifstream::pos_type>型のコンテナにでも詰め込めば、
あとは好きな行を取り出せる。

同じテキストファイルを、毎度毎度ひっくり返して表示する仕様の場合、
そのインデックスを、a.txtに対してa.indexとか名前付けて保存しておけば、2度目以降は速いよね。
0604デフォルトの名無しさん2007/09/17(月) 07:14:59
数百MB単位のファイル読むときはちゃんとmemory mapped file使おうぜ。
このスレの範疇からは外れるが。
0605デフォルトの名無しさん2007/09/17(月) 08:23:03
>>604
でもさ、>>599の場合だと、
結局は、一度は最初から最後まで全部読み込まないといけないことには変わりないし、
先頭から読んでいくのと違いあるのかな。

普通のモダンなOSはディスクアクセスから予測した先読みのキャッシュぐらいあるだろうし
0606デフォルトの名無しさん2007/09/17(月) 09:16:07
つ[tail -r]
0607デフォルトの名無しさん2007/09/17(月) 12:10:29
$ tail -r
tail: オプションが違います -- r
詳しくは `tail --help' を実行して下さい.
0608デフォルトの名無しさん2007/09/17(月) 13:31:44
つか、テキストファイルを逆順に表示する必要があるのか?
0609デフォルトの名無しさん2007/09/17(月) 13:34:05
実用的な場面はあまりないかもしれないけど、言語の勉強のための課題としては
手ごろな内容なんじゃないかな。
0610デフォルトの名無しさん2007/09/17(月) 13:35:00
tail -f /var/log/messages でいいでね?
0611デフォルトの名無しさん2007/09/17(月) 14:05:18
馬鹿はすっこんでろ
0612デフォルトの名無しさん2007/09/17(月) 14:18:17
言語の勉強ならなぜにstd::vectorを使う?
0613デフォルトの名無しさん2007/09/17(月) 14:26:42
C++の勉強ならSTLが適当だろう。C++スレだし
0614デフォルトの名無しさん2007/09/17(月) 14:32:09
勉強が目的なんでしょ?
0615デフォルトの名無しさん2007/09/17(月) 14:35:55
「言語文法の勉強」って限定してないなら標準ライブラリの使用法も範疇だろ
0616デフォルトの名無しさん2007/09/17(月) 15:17:22
c++の質問じゃないかもしれないけど
0x00000F00
こってどういう意味なんでしょうか?
16進法かなと思うんですが
0617デフォルトの名無しさん2007/09/17(月) 15:27:26
明らかにC++じゃないしプログラムの質問でもないぞ
0x00000F00は10進数の3840だ。
0618デフォルトの名無しさん2007/09/17(月) 15:29:33
.
0619デフォルトの名無しさん2007/09/17(月) 15:31:05
>>616 数値のリテラルを16進数で書きたいときの書き方。
その数値自体の意味までは判らんよ。
0620デフォルトの名無しさん2007/09/17(月) 15:37:41
3840ってことはF00ってことでおk?
0621デフォルトの名無しさん2007/09/17(月) 15:39:47
>>620
何がOKかさっぱりわからん。3840(10)=F00(16)ってだけだ。
わからんならWindows標準の電卓でも使ってくれ。
0622デフォルトの名無しさん2007/09/17(月) 15:44:17
>>617
一応C++の質問になるなじゃない?
CやC++など一部の言語では16進数を表記する文法として0x〜を採用しているだけで、
一般的に16進数を0x〜と表記するという規則はないでしょ。
0623デフォルトの名無しさん2007/09/17(月) 15:50:12
いやー、どこの言語でも0xか\xのプリフィックスが付いたら
16進数だと思うけど。
0624デフォルトの名無しさん2007/09/17(月) 15:56:26
"0x"が仮にC++特有だとしてもそれ以降はただの16進数だしな
0625デフォルトの名無しさん2007/09/17(月) 15:58:36
数字の混ざったトークンにa - fが入ってたら接頭子がなんであれ16進と解釈できるだろ。
06265992007/09/17(月) 16:00:52
>>603-615
どうも、ありがとうございました。
勉強になります。

学校の課題とかではないです(私はもう学生ではないので…)
株と為替の時系列データを処理するプログラムを書いているのですが、
データの入手先によって、系列の時間が上り順のものと下り順のものの2種類あるので、
一方を並べ替えることで1つの書式にそろえようとしたわけです。
0627デフォルトの名無しさん2007/09/17(月) 16:04:36
>>625
17進数〜36進数という可能性も。
0628デフォルトの名無しさん2007/09/17(月) 16:13:47
1バイト文字コードなら256進数までありうる
0629デフォルトの名無しさん2007/09/17(月) 16:52:10
>>616
死ね
0630デフォルトの名無しさん2007/09/17(月) 16:57:01
そこは気を利かせて
0xDEAD
とか書かないと
0631デフォルトの名無しさん2007/09/17(月) 17:01:14
>>630
0xDEAD=57005
実はお前さんの書き込み時間は、57分00.5秒だったのでは…
0632デフォルトの名無しさん2007/09/17(月) 17:29:46
0xDEADBEEF
0633デフォルトの名無しさん2007/09/17(月) 19:23:11
0xBADCAFFE
0634デフォルトの名無しさん2007/09/18(火) 19:51:52
0xBACA
0635デフォルトの名無しさん2007/09/18(火) 19:54:44
0xCPLASPLASDEOOPRASIIKODEWOKAKUNIHADOUSUREBAIIDAROUKA
0636デフォルトの名無しさん2007/09/18(火) 20:19:58
どうせなら CPLUSPLUS ってかけよ
0637デフォルトの名無しさん2007/09/18(火) 20:21:27
>>635
C++はマルチパラダイム言語だ。そんな意味のない目標は捨てて身軽になろう。
OOPなんて所詮たくさんある道具の内の一つに過ぎない。
0638デフォルトの名無しさん2007/09/18(火) 20:25:01
>>636
気づかなかったわ
>>637
okそうするよ
0639デフォルトの名無しさん2007/09/18(火) 22:36:41
そういやどっかのサイトにあったけど、「OOPは呼び出し元を再利用するための手法の一つ」
というのはかなり納得した。特にC++のはそうだよな。
0640デフォルトの名無しさん2007/09/18(火) 22:40:04
定義なんぞどうでもいい
0641デフォルトの名無しさん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 );

のようにしたいです
06436422007/09/19(水) 00:12:49
自己解決しました
0644デフォルトの名無しさん2007/09/19(水) 00:17:08
template <typename T> void func(std::list<T> x)
{
};
こんな感じ?
0645デフォルトの名無しさん2007/09/19(水) 00:17:59
そんなちょっと考えたら解決するようなことをいちいち・・・
0646デフォルトの名無しさん2007/09/19(水) 00:30:38
馬鹿だからなんだぜ?
0647デフォルトの名無しさん2007/09/19(水) 12:05:47
KODE
0648デフォルトの名無しさん2007/09/19(水) 12:15:12
氷結しよっ!
0649デフォルトの名無しさん2007/09/19(水) 12:43:44
>>639
それはOOPっていうか、古くは各種アプリのプラグイン(DLL)に始まる
インタフェイス抽象とかコンポーネント化とかの特徴のような気が・・・
0650デフォルトの名無しさん2007/09/19(水) 20:34:13
>>649
それは呼び出される側の再利用でなくて?
0651デフォルトの名無しさん2007/09/19(水) 21:28:47
今ポインタの宿題をしていて  数値を交換するというやつで実行前の値の表示とでたのですがどういういみですか?
0652デフォルトの名無しさん2007/09/19(水) 21:48:45
その質問を訊く身にもなってください。
今流行りのアスペルガーですか?
0653デフォルトの名無しさん2007/09/19(水) 21:48:59
意味がわからんし、C言語スレへ池
0654デフォルトの名無しさん2007/09/19(水) 21:49:31
俺に免じて許してやってくれ。彼は5歳なんだ。
0655デフォルトの名無しさん2007/09/19(水) 21:54:15
俺アスペルガーだけどこんな奴と一緒にしないで欲しい
0656デフォルトの名無しさん2007/09/20(木) 05:03:48
「数値を交換するというやつで実行前の値の表示とでたのですがどういういみですか?」
とはどういういみですか?
0657デフォルトの名無しさん2007/09/20(木) 05:09:02
数値を交換するというやつで実行前の値の表示とでたのですがどういういみですか?

What 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
>>651
お前があほという意味じゃ
0659デフォルトの名無しさん2007/09/20(木) 07:09:57
ある仮想関数が、メンバ変数を書き換えないと想定されている場合、constを付けた方がいいんでしょうか?
例えばこんな感じ↓

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:55
>>659 そうですね。
0661デフォルトの名無しさん2007/09/20(木) 07:31:21
>>659
つけられるconstは全てつけるべき。
非constである必要ができたら、非const版を追加するかconstを外すか熟考すべし。
06626592007/09/20(木) 07:36:33
ありがとうございます。
0663kkptcnZciZ2007/09/20(木) 12:34:39
KOMUgI <a href="http://vunuddokfscm.com/";>vunuddokfscm</a>, [url=http://pliwysnvpdex.com/]pliwysnvpdex[/url], [link=http://uquzjkpzhomt.com/]uquzjkpzhomt[/link], http://hukythasnspn.com/
0664マターリ ◆AbENcvTP5o 2007/09/20(木) 14:27:35
いきなりですみませんがこのスレに協力してくれる人を探しています。
ttp://sports2.2ch.net/test/read.cgi/entrance2/1190215633/l50
0665デフォルトの名無しさん2007/09/20(木) 14:57:12
>>664
マルチすんな。
0666デフォルトの名無しさん2007/09/20(木) 15:16:10
>>650
ん?
プラグインやインタフェイス抽象は主として呼び出す側の再利用に繋がると思うけど。

呼び出される方の利用の仕方がまちまちだと、
呼び出す側はいちいちそれに合わせなくてはならないわけだけど、
インタフェイスや呼び出し規約(API)という形に抽象化し共通化しておくことによって、
呼び出し側を変更せずに機能を追加してゆくことができる。

もちろん呼び出される側を再利用する仕組みでもあるんだけど、
呼び出される側の再利用だけのためであれば単にAPI公開で十分なわけで。
0667デフォルトの名無しさん2007/09/20(木) 16:37:16
template<class T> class A
{
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:31
ちなみにクラスD以外はビルドOKです
0669デフォルトの名無しさん2007/09/20(木) 16:49:48
template<class T, class U> class D
{
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:48
横からごめん

template<class T, class U> void (U::*D<T, U>::func)() = NULL;

ってどういう意味?
0672デフォルトの名無しさん2007/09/20(木) 19:04:46
>>671
単なる、staticなメンバー変数funcの定義だよ。
NULLで初期化してるだけ。
0673デフォルトの名無しさん2007/09/20(木) 19:05:53
void (U::*)() 型のstaticメンバ変数 D<T, U>::func を定義して NULL で初期化している
0674デフォルトの名無しさん2007/09/20(木) 20:44:48
最近某入力デバイス共有ソフトのソースと某モデリングソフトのプラグインサンプルのソースと
見る機会があったんだけど
そのどっちも、どう考えても継承ツリーの最底辺、絶対継承されっこないし実際されてない
javaだったらfinalがついてもおかしくないクラスのメンバで
継承元の仮想関数をオーバーライドしている関数にvirtualがついてた

薄々感じてはいたんだけどどんな状況でもオーバーライドした関数にはその目印にvirtualをつけるっていう
暗黙のコーディングルール(というかおまじない?)のようなのが流行してるのかな?
それともvirtual修飾子の意味をほとんどの人が誤解している?
0675デフォルトの名無しさん2007/09/20(木) 20:51:49
かなり昔から流行ってるよね。
0676デフォルトの名無しさん2007/09/20(木) 20:56:41
C#のvirtual, overrideキーワードを見るよろし
0677デフォルトの名無しさん2007/09/20(木) 20:58:33
>>676
C# なんか存在しない頃から流行ってるよね。
0678デフォルトの名無しさん2007/09/20(木) 21:24:07
別にはやってないだろ
0679デフォルトの名無しさん2007/09/20(木) 21:26:07
文法的にはどっちでもいいんだっけ?
0680デフォルトの名無しさん2007/09/20(木) 21:27:37
多分継承元のクラスから関数宣言コピペして、面倒だからvirtual削除してないだけだろ。
0681デフォルトの名無しさん2007/09/20(木) 21:40:33
virtualつけてもoverrideかどうかは分からない
ということに最近気づいた
0682デフォルトの名無しさん2007/09/20(木) 21:41:32
overrideする側はvirtual要らないんだっけ
俺はいつもコメントにoverrideって書くけど

C#がうらやましいぜ
0683デフォルトの名無しさん2007/09/20(木) 21:53:43
基本クラスがvirtualなら十分でそれ以降は任意だったと思うがドキュメントが出てこない。
継承が深くなると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
一度virtual付ければ後は無くておk。
俺はドキュメントなんか鼻から探すつもりもありませんがw
0685デフォルトの名無しさん2007/09/20(木) 22:01:01
あ、でもvirtualはいつも付けてる。
理由は>>683と一緒。
0686デフォルトの名無しさん2007/09/20(木) 22:01:12
sealedが欲しい。途中から隠蔽w
0687デフォルトの名無しさん2007/09/20(木) 22:06:18
#define public protected
0688デフォルトの名無しさん2007/09/20(木) 22:26:15
とにかく、C#なんかより前から流行ってるよね。
0689デフォルトの名無しさん2007/09/20(木) 22:35:25
>>686
sealedは継承禁止じゃね?
0690デフォルトの名無しさん2007/09/20(木) 22:36:54
void func(const T& param)
{
T.Hoge();
}

っておかしい?
型Tは何かわからないからそのメソッドHoge()を呼ぶのはおかしい?
0691デフォルトの名無しさん2007/09/20(木) 22:37:32
void func(const T& param)
{
param.Hoge();
}
の間違いでした
0692デフォルトの名無しさん2007/09/20(木) 22:38:24
継承される事を前提に作ってないクラスはデフォルトでsealed(final)
って仕様だとうれしいんだけど

小規模で作ってる分にはいらないけどさ
0693デフォルトの名無しさん2007/09/20(木) 22:42:09
大規模開発なら「派生型を作らないこと」とドキュメントに書けばいいような・・・

オープンソース物みたいにソースがドキュメントって感じのだと、
そういう言語によるディレクティブは役に立つとは思うけど。
0694デフォルトの名無しさん2007/09/20(木) 22:56:14
>>689
メソッドに対するシールド。
class A { public virtual void Say() { .. ; }}
class B : A { public override sealed void Say() { .. ; }}
0695デフォルトの名無しさん2007/09/20(木) 23:03:45
>>694
それ上書き禁止で隠蔽とはいわないんじゃねーかと。
0696デフォルトの名無しさん2007/09/20(木) 23:09:03
>>695
やりたいことはこうよ。
class A { virtual F
class B : A { sealed F // Aに対するoverrideだが、この後の継承は上書き扱い(非virtual)になる。
0697デフォルトの名無しさん2007/09/20(木) 23:10:36
こんなのはどうだっけ?
class A { public: void a() {}; };
class B : public A { public: template<typename> void a(); /*not implement*/ };
0698デフォルトの名無しさん2007/09/20(木) 23:13:04
>>696
それは隠蔽とは言わんだろ。
AやBにキャストしたら そのまま使えるんだし。

Javaだと覆い隠し(shadowed)とか言ってるような。
0699デフォルトの名無しさん2007/09/20(木) 23:18:46
目印なんだったらコメント使えばいいのになんでそれをトークン使って
プログラムそのものを変質させてしまう形でやってしまうのだろう
いったい誰がこんな風習を広めたのか気になって眠れない
0700デフォルトの名無しさん2007/09/20(木) 23:19:09
>>672
ぁーなるほど。
void (U::*)()の、D<T,U>::funcを。ってことね。
了解しますた。さんくす
0701デフォルトの名無しさん2007/09/20(木) 23:19:49
>>698
C#だとこれのことを隠蔽と言うだけどね。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
>>690-691
問題ない。
もしTがメンバHogeを持っていなければ、エラーになる。

それなんて動的言語と言いたいところだが、
そこはC++なんでコンパイルエラー。
0703デフォルトの名無しさん2007/09/20(木) 23:43:21
>>701
悪い、それ隠蔽だわ。カプセル化の文脈で出てくるデータ隠蔽と勘違いしてた。
0704デフォルトの名無しさん2007/09/20(木) 23:58:00
>>703
死ね
0705デフォルトの名無しさん2007/09/21(金) 00:28:53
>>702
サンキュ
0706fIIPJstQwl2007/09/22(土) 03:23:44
zghXa7 <a href="http://www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=big0484.html">big cock</a>
[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 func(int n)
{
 void *a = (void*)new char[n];
 /*...*/
 delete[] (char*)a;
}

これってメモリリークを起こさずにうまく開放されるんでしょうか?
0708デフォルトの名無しさん2007/09/22(土) 06:57:27
日本語がおかしい。
メモリリークは開放処理を試みた後に発生する。
0709Kusakabe Youichi2007/09/22(土) 07:16:59
 
0710デフォルトの名無しさん2007/09/22(土) 10:27:23
>>707
途中で例外が投げられてfuncを抜けるなどといった事態が起これば、
メモリリークするね。
0711デフォルトの名無しさん2007/09/22(土) 11:06:37
間違って
http://pc11.2ch.net/test/read.cgi/tech/1188748806/770
に書き込んでしまいました。
宜しくお願いします。
0712デフォルトの名無しさん2007/09/22(土) 11:22:09
お断りします
0713デフォルトの名無しさん2007/09/22(土) 12:05:23
>>661
>つけられるconstは全てつけるべき。

自分が読んだ本ではconst使いましょうという感じだったので
今までconst使っていたのですが、会社でconstを使うなといわれました。

const推奨派とconst禁止派みたいなのがあるのでしょうか?
0714デフォルトの名無しさん2007/09/22(土) 12:18:58
「(たまたま)変更されてない」って理由でつけると結局あとでconst外しまくる羽目になる。
「(概念や仕様から考えて)変更しない」って理由でつけるべき
0715デフォルトの名無しさん2007/09/22(土) 12:23:08
外しまくる羽目になってでも現在付けられるものは
全部付けた方が分かりやすいという考え方もある。
0716デフォルトの名無しさん2007/09/22(土) 12:34:26
>>713
const禁止とかどれだけ低脳なんだwww

取り合えず禁止になりうる理由として考えられるのは、
・API等に非constポインタを渡す必要があり、キャストの排除が最優先ルール
・クラスのconstメンバ関数にコンストラクタで代入できない
(↑もちろんメンバ変数の初期化は代入じゃなく初期化子並びを使うべきだが
C転向者が多くて教育コストがかかる)
・宣言が長くなるのでちょっと読みにくくなる
・メンバ関数の適切なconst指定も必要になってくるが、C転向(以下略
・既に非constで作り上げてしまった社内ライブラリを作り直せない。
・論理バグはコーディング工程で見付ける(コンパイルえらー)のではなく、
デバッグ工程で評価チームが見付けるものとして
スケジュールやら人員配分やらが組まれていて直せない。
・上位の人が勉強嫌い
0717デフォルトの名無しさん2007/09/22(土) 12:39:23
>>711
実際にはnew[]するときに、sizeof (T) * 要素数よりも
もう少し余分に確保されている可能性がある。
主にデストラクタを呼ぶ回数を記録するため。
もちろん、delete[]ではそれも含めて解放される。
0718NXRoXAzeEmJXNM2007/09/22(土) 12:50:13
IpHLIP <a href="http://www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=big0942.html">big nipples</a>
[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
>711

>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:50
静的な型と動的な型の一致とは?
0721デフォルトの名無しさん2007/09/22(土) 13:01:43
>>720
静的な型とはソースコード上の型、
動的な型とは実際の型のこと。

例えば、クラスDがクラスBを継承していたとして、
こういうことはやめてということ。
B* p = new D[n];
delete[] p;
07227132007/09/22(土) 13:05:16
>>714>>715>>716
なるほど、参考になります。ありがとうございます。

私のところでは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
#define N 7をconst N = 7;にしたところで
コードの量が増えるとは思わないけど。

constにも色々とあるけどさ。
0726デフォルトの名無しさん2007/09/22(土) 13:32:05
>>707
auto_ptr 使えば。
07277232007/09/22(土) 13:33:38
>724
ご返信ありがとうございます。
特に組み込みなどではありません。
通常リングバッファはどのようにして実装するのが通例となっているので
しょうか?セオリーなどが確立しているのでしょうか?
0728デフォルトの名無しさん2007/09/22(土) 13:42:40
>>726
new[]したものをdelete[]しないのは駄目だろ。
scoped_arrayとかshared_arrayとか結局Boost頼み。
0729デフォルトの名無しさん2007/09/22(土) 13:46:48
>>727
BufferSize-ReadPointer 分だけ memcpy してから、
ReadPointer をゼロにして続きを処理すればよい。

C++ では普通テンプレートベースの汎用クラスを用いる。
高速化の必要がある場合には自前で書く。
(ココに高速化の必要がある場合には、リングバッファから取り出して
別の場所へコピーなどしないでバッファを直接読んで処理する方が
良いことが多いけど)
0730デフォルトの名無しさん2007/09/22(土) 13:52:42
普通に一バイトずつ読み込めばいいだろが
一度に20バイトずつコピー出来ても大して変わらないだろ
07317232007/09/22(土) 13:57:09
>727
ご返信ありがとうございます。確かに2回に分けてBufferを取得すれば
可能です。
テンプレートベースの汎用クラスを用いる、というのはdequeなどを
使用するということでしょうか?

高速化を目指しております。
>(ココに高速化の必要がある場合には、リングバッファから取り出して
>別の場所へコピーなどしないでバッファを直接読んで処理する方が
>良いことが多いけど)
汎用クラスを用いず、地道にmemcpyなどを使ってデータを取得したほうが
よいのでしょうか?繰り返しの質問になってしまいますが。
0732デフォルトの名無しさん2007/09/22(土) 14:00:44
>>721
>B* p = new D[n];
>delete[] p;
これダメなの? これに対応する為にvirtualデストラクタがあるんだと思ってたけど。
0733デフォルトの名無しさん2007/09/22(土) 14:04:13
>>731
そうではなくて、ココをチューニングする必要があるのは
おそらく数M〜数十Mバイト毎秒の処理を行う場合なわけで、
そんなものをメモリ上でこっちからあっちへコピーする処理自体
無駄なのでやらないようにする、ということです。

例えば映像のデコーダの入力段でリングバッファを用いるような場合、
read(buf, n) などとしていちいちバイト列をコピーして取り出すのではなく、
char* peek(size_t n) のように直接内部のバッファを覗くための関数を用意して、
リングバッファ終端以外では直接バッファ内のバイト列を処理するようにする、等。
0734デフォルトの名無しさん2007/09/22(土) 14:09:24
N 最後のナンバー
n番 からdバイトコピーするとする

if ( n + d - 1 > N){ memcpy(*,*, N - n - d); memcpy(*,*, n + d - N);}

else memcpy(*,*, d);

のようにすれば良い
07357232007/09/22(土) 14:11:23
>731
ご返信ありがとうございます。理解が乏しいかもしれないので
確認させてください。
readはmemcpyにより格納されたほかのバッファを利用する、ということで
peekはmemcpyで移さずにそのまま参照するということですね。
そして、リングバッファ自体はC++の汎用クラスを使って問題ないという
ことでしょうか?

>リングバッファ終端以外では直接バッファ内のバイト列を処理するようにする、等。
リングバッファ終端以外はpeak()、終端ではmemcpyなどを使って処理する、
ということでしょうか?

リングバッファの実装が初めてでなかなかイメージがわいてこない状況です。
何度も質問してしまって申し訳ありません。
07367132007/09/22(土) 14:13:21
低スキルなので>>723の質問の意味が分からなくて
>>724は私(>>722または>>713)に対するレスかと思ってしまいましたw
違ったのですねw


>>725
仮引数とかにconstをつけるとコードの量が増えて読みにくいから禁止なのだそうです。
07377242007/09/22(土) 14:13:58
>>727
いや、ひとつ上にレスしただけ。
07387232007/09/22(土) 14:18:17
>734
実際のサンプルを教えてくださってありがとうございます。
ぜひ参考にさせていただきます。
0739デフォルトの名無しさん2007/09/22(土) 14:19:42
>>738
コードは間違ってる所あるけど、
終端を乗りこえていたら、分割して先頭からコピーすればいいだけ
0740デフォルトの名無しさん2007/09/22(土) 14:30:07
>>735
Q1.前半 Yes. 後半 No.
Q2.
用途によります。動画のデコーダなどの場合は一度にリニアに
アクセスするのは高々数十バイト程度なので、一時的なバッファに
コピーしてそこのポインタを返す、あるいは内部バッファを余分に
確保しておいて、バッファ先頭にある続きのデータをそこに複製して
リニアに読めるようにする、等。

読む側の処理が簡単なものなら、終端をまたぐケースだけ
前半、後半に分けて処理するようにしても良いでしょう。

Q1. の後半とも関連するのですが、ただひとつ言えることは
ここを自前で実装すべきなのは、レアケースであって、その場合には
プロファイラやテストなどを行って確かめつつ最適なコードを書く必要があり、
定石みたいなものは無いということです。

ただまぁmemcpyは各社最適化されていて早いコードで実装されてるので、
チューニングしたいんだけど時間がないとかいうときには便利。
0741デフォルトの名無しさん2007/09/22(土) 14:32:00
言い切ってやる。高速化すべきポイントはそこじゃない。
0742デフォルトの名無しさん2007/09/22(土) 14:33:50
>>736
>724はあんた宛だと思うよ。
で、正直そんな会社は私の仕事関係なら出入り禁止にします。
0743デフォルトの名無しさん2007/09/22(土) 14:34:05
>>736
>コードの量が増えて読みにくい
本当にこれだけの理由なら↓これらに当てはまりそうだ。
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
>732
仮想デストラクタがある場合に OK なのはこっち。
B* p = new D;
delete p;
0745デフォルトの名無しさん2007/09/22(土) 15:19:04
>で、正直そんな会社は私の仕事関係なら出入り禁止にします
内容の是非はともかくこういう言い方ってDQNじみてると思うんだが
0746デフォルトの名無しさん2007/09/22(土) 15:21:32
スルーしる
0747デフォルトの名無しさん2007/09/22(土) 15:23:02
>>744
これは仮想デストラクタがなくても領域自体は確保されるんですよね?
Dのデストラクタが呼び出されないのでコンストラクタとかでnewしててそれをデストラクタでdeleteしてる場合はだめだけど
07487132007/09/22(土) 15:28:43
>>737>>742
やはり私に対するレスなのですか。

では改めて・・・

>>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
>>748
おめーと同僚や上司は頭悪いよ
空白は無視されるのが規則なんだよ 速度に違いは出ない
0750デフォルトの名無しさん2007/09/22(土) 15:34:57
>>748
>理由は、私の書き方だと「速度が遅くなる」「使用するメモリが増える」からだそうです。私にはなぜそうなるのかよくわかりません。
寧ろ、あなたの書き方の方が速くなったりメモリが減るかも知れません。まぁ、大抵は同じでしょう。
いずれにしろ、一概には言えません。そんな根拠もないようなことを言っているようではお郷が知れると言うものです。

>確かに辞めたくなりますが・・・
私と一緒に働きませんか?w

>スレ違いでしょうか?
まぁ、宜しいのではないかと。
0751デフォルトの名無しさん2007/09/22(土) 15:35:53
空白じゃなかった intの定義する位置か
0752デフォルトの名無しさん2007/09/22(土) 15:37:51
>>749
>空白は無視されるのが規則なんだよ 速度に違いは出ない
i の宣言場所の違いが判らん香具師は黙ってらっしゃい。
0753デフォルトの名無しさん2007/09/22(土) 15:41:37
関係ないけど
VCだと
for(int i = 0; i < size; i++)
って書いても
int i;
for(i = 0; i < size; i++)
こう書いてるように動くね
0754デフォルトの名無しさん2007/09/22(土) 15:42:21
>>763
それはVC6とかの話じゃないのか
0755デフォルトの名無しさん2007/09/22(土) 15:48:42
>>744 レスサンキュー
まじかー、紛らわしいというか不便だな。
B* p = new D[n];
delete[] dynamic_cast<D*>(p);
めんどくちゃいけど、これなら大丈夫だろうか。
まあ、ことさら >>732みたいに敢えて基底クラスのポインタで確保/解放する意味もないんだろうけどなぁ...

>>748
ちなみにそのfor文は上と下で i のスコープが変わると思うが、
for文に入る度にiが確保しなおされるとしたら速度変わるカモな。
使用メモリが増えるかどうかは分からん。
0756デフォルトの名無しさん2007/09/22(土) 15:51:13
for文のiとかjってやっぱり仕事なんかで使うときもiやjなの?
0757デフォルトの名無しさん2007/09/22(土) 15:54:34
>>755
>>753はVC(6以前)でスコープが同じになる事を言ってるんだよ
メモリ・速度云々は関係なく
0758デフォルトの名無しさん2007/09/22(土) 15:57:58
>>756
i, jで何か文句あんのか?
0759デフォルトの名無しさん2007/09/22(土) 15:59:46
>>756
単なるループ変数にたいそうな名前が付けられると
かえって読みにくくなるよね。
0760デフォルトの名無しさん2007/09/22(土) 16:04:07
>>758
実際こんがらがって間違える事例を数件目撃したことがある。
慣れてくりゃなんともないが初学者にiやjで教えるのはどうかと思うんだよなぁ
0761デフォルトの名無しさん2007/09/22(土) 16:07:07
>iとj
俺は目視デバッグでチェック項目の一つになってるわ
0762デフォルトの名無しさん2007/09/22(土) 16:10:24
iやjにも元は意味があったろう
今じゃお決まりの変数として定着しているが
0763デフォルトの名無しさん2007/09/22(土) 16:10:26
>>755
それだけなら動くだろうけど、
p経由で扱えるのは先頭要素だけ。

メモリ上にDのインスタンスが連続して並んでいるので、
p[1]が指す位置は、先頭の次の要素ではなく、
おそらくDの配列の先頭要素内の中途半端な位置。
07647232007/09/22(土) 16:14:51
>740, 741
ご返信ありがとうございます。
やりたいこととしては、参照用のリングバッファを書き込み用のリングバッファに
定期的に10KB〜300KB程度のデータを移したいと思っております。
(まず初めに最終的にやりたいことを書かなくてすいません)。

この場合は、終端をまたぐケースを考慮して(734さんのコードを参考、
2回の処理に分けるなどをする)、memcpyを使う、という方向で
考えたいと思います。
ただ一点、やはりC++の汎用クラスを使うのがいいのか、単純に
配列を使ってリングバッファを実装すればいいのか悩んでいるところです。

>ここを自前で実装すべきなのは、レアケースであって、その場合には
ここっていうのはreadとかpeak()のことですよね?

>言い切ってやる。高速化すべきポイントはそこじゃない。
この部分ばかりに注目するのではなく、
他の処理アルゴリズムをもっと最適化しろってことでしょうか?

確認ばかりのレスになってすいません。
0765デフォルトの名無しさん2007/09/22(土) 16:15:05
>747
> これは仮想デストラクタがなくても領域自体は確保されるんですよね?
はい。
> Dのデストラクタが呼び出されないのでコンストラクタとかでnewしててそれをデストラクタでdeleteしてる場合はだめだけど
規格上は delete しちゃうと未定義動作。

>755
配列は polymorphic に扱わないというのが基本。理由は >763
07667132007/09/22(土) 16:16:59
>>750
>私と一緒に働きませんか?w
そう言われるとなんだか嬉しいですwでも私は足引っ張りまくると思いますよ?w

>>755
>for文に入る度にiが確保しなおされるとしたら速度変わるカモな。
なるほど、私の上司は速度についてはそれを言っていたのかもしれません。

私はiのスコープをループの中だけに限定するつもりで
そのように書いていました。(これも本で読んだので・・・)

>>756
私はiやjを使っています。
0767デフォルトの名無しさん2007/09/22(土) 16:25:30
for (int iとint i; for(で最適化しても
速さに違いが出るようなコンパイラなんて
窓から投げ捨ててしまえ。

そんなことで速さに違いが出るのだったら、
設計思想的に、はなからこんな機能導入されていない。
0768デフォルトの名無しさん2007/09/22(土) 16:28:36
基本的に
for ( int i= )の方が速いのでは?
その都度変数を確保すればレジスタに乗りやすいが、確保してあったままではHDDやメモリに乗っている可能性が高い
07697552007/09/22(土) 16:31:58
>>757
>>755は>>753に対して何か言ったつもりはないけど、
その話は(他のスレだったかで)聞いたことがアルよ。

>>762
多分 i = index のi じゃないかな。配列で使うことが多い気がする。
jは単にiの次の文字。

>>763,>>765
なるほど、このスレ見なければそのまま使ってたところだ。
勉強中でg++では問題なさそうに見えたからね。情報ありがとう!

>>767,>>768
まあ実際には気にするほどな差が出るとは思わないよね。
0770デフォルトの名無しさん2007/09/22(土) 16:34:23
>>768
いつの時代のコンパイラ使ってるんだ? お前は。
0771デフォルトの名無しさん2007/09/22(土) 16:36:43
intで差が出るのは糞コンパイラ未満だが、
intでは無くiteratorだった場合差が出ても果たして糞コンパイラ未満と言えるだろうか。
0772デフォルトの名無しさん2007/09/22(土) 16:36:58
しかし、ある言語の常識を別の言語にまで持ち込むバカっているんだなぁ。
C(とCが全盛だった時代の貧弱なコンパイラ)ならまだ分かるかもしれないが、
今の時代のC++でやることじゃないだろ。

絶対に関わりあいたくないから、どこで働いているのか晒してくれないか?w
0773デフォルトの名無しさん2007/09/22(土) 16:38:09
大丈夫
君には入社できないから
0774デフォルトの名無しさん2007/09/22(土) 16:39:42
>>771
前提を変えるなアホ。

そのイテレータのコンストラクタが100MBぐらいメモリを確保するんだったらどうだろうかとか、
いくらでも話を広げられるじゃないか。
07757132007/09/22(土) 16:41:07
>>772
>絶対に関わりあいたくないから、どこで働いているのか晒してくれないか?w

私の会社ですか?それは勘弁してくださいw
0776デフォルトの名無しさん2007/09/22(土) 16:42:05
ぶっちゃけ日本のC++PGの何割がEffective C++とか読んでんだろうな
板違い気味だけど

>>771
俺だったら滅茶苦茶速度に過敏なコードだったら
例え速度が全く等しくてもポインタにする
0777デフォルトの名無しさん2007/09/22(土) 16:47:58
i,j については↓の「暗黙の型宣言による伝統的・慣習上の変数命名規則の誕生」の項を参照。
http://ja.wikipedia.org/wiki/FORTRAN
0778デフォルトの名無しさん2007/09/22(土) 16:52:18
>>768
基本的に、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
>>776
私だったら、滅茶苦茶速度に過敏なケースにコンテナは使わないな。
0780デフォルトの名無しさん2007/09/22(土) 16:57:00
>>778
>後者の場合は最初のiと後のiで違うメモリを確保する可能性は、ある。
つまり関数突入時に二つのiを確保するということかな?
だとすれば、速度/メモリ量共に影響があるじゃないか!
0781デフォルトの名無しさん2007/09/22(土) 16:58:44
>>776
可読性も決して軽視出来ない要素だろ・・・条項
0782デフォルトの名無しさん2007/09/22(土) 16:59:53
>>780
馬鹿だな、全く最適化を考慮しない場合の話だぞ。
それに、速度には全く影響ないじゃないか。
0783デフォルトの名無しさん2007/09/22(土) 17:03:16
>>782
>馬鹿だな、全く最適化を考慮しない場合の話だぞ。
その場合のつもりで言ったんだ。
>それに、速度には全く影響ないじゃないか。
すまん、勘違いだった。
07847132007/09/22(土) 17:04:42
>>776
>ぶっちゃけ日本のC++PGの何割がEffective C++とか読んでんだろうな

Effective C++は持っていますが難しくて分からないところがたくさんありました。
私の会社ではconstのことを考えるとEffective C++とか読んでるのは私だけですかねぇ・・・。
0785デフォルトの名無しさん2007/09/22(土) 17:06:27
>>780
お前の環境についてはしったこっちゃないが。
俺様の環境ではスタックポインタを4つ減らすか8つ減らすかの違いでしかないな。
あと俺様のコンパイラはお前以上に頭がいいので、ひとつしか使わないがな。
0786デフォルトの名無しさん2007/09/22(土) 17:08:22
頭のいいコンパイラなら
そもそも使わない分までスタックポインタを移動しない。
07877132007/09/22(土) 17:39:37
あと、他にも会社で禁止にされたことがあります。
ブロック内でfor文やif文など以外のブロックを作成してはならないと言われました。
理由は「行数が増えたりして読みにくくなる」「変数は関数の先頭で宣言したほうが読みやすい」からだそうです。

私はこんな感じで { } を使うことがたまにあります。
void hoge(void)
{
   {

   }
}

私の会社では禁止なのですが、この書き方は一般的なのでしょうか?
皆さんはこのように { } を使うことはありますか?

0788デフォルトの名無しさん2007/09/22(土) 17:45:51
>>787
デストラクタの実行タイミングを細かく制御したいとき(セマフォなどの共有リソースを使ったりとか)には
よくそういう包み方することはあるな。
0789デフォルトの名無しさん2007/09/22(土) 17:46:42
>>787
変数を使う範囲を明示するために頻繁に使うよ。
その会社には仕事を頼みたくないな…。
0790デフォルトの名無しさん2007/09/22(土) 17:47:53
>>787
俺はあまりやらない。その内側のブロックを関数化するかもしれない。
0791デフォルトの名無しさん2007/09/22(土) 17:49:02
>>713
そんな会社辞めちまえ、ダメプログラマにされるぞ
0792デフォルトの名無しさん2007/09/22(土) 17:49:28
やっぱり出入り禁止だw

>>787
>理由は「行数が増えたりして読みにくくなる」「変数は関数の先頭で宣言したほうが読みやすい」からだそうです。
この辺でお郷が知れる。
こう書く人が多かったりしない?
--
FILE * fp;
fp = fopen(...);
0793デフォルトの名無しさん2007/09/22(土) 17:55:17
>>713
尻穴みたいな井の中の蛙になりたくないなら
学習の意欲のあるうちに辞めちまったほうがいい

あるいは部署変えてPG以外の業務勉強したほうがためになりそう
0794デフォルトの名無しさん2007/09/22(土) 18:01:32
>>787
それは禁止されてていい
0795デフォルトの名無しさん2007/09/22(土) 18:03:07
ある意味そのレベルでC++使ってるっちゅーのが感動的だナ

C++といいつつ実質Cとして使ってる制御系か?
VC++6.0以前とMFC使ってる業務系か?

制御で「const使うな」はありえんか
0796デフォルトの名無しさん2007/09/22(土) 18:14:00
これで「クラスって何、おいしいの」だったら傑作なんだが。
0797デフォルトの名無しさん2007/09/22(土) 18:16:17
どこが?
0798デフォルトの名無しさん2007/09/22(土) 18:20:00
>>787
関数内の { } は変数などのスコープを限定するツールとして役に立つよ。
スコープを限定するのがどういいのかは、話すと長いが...
グローバル変数がよくない(誰がどういうタイミングでアクセスするのか
把握できなくなる・しにくくなるから)のとおおよそ同じ理屈。

根拠のない(しかもわりと間違っている)ローカルルールが多いね。
チーム内で1人で反抗してもしょうがないとは思うけど、
ちゃんとしたプログラマになるつもりなら、
後学のためにまず初学者向けの良書を読んでおくことをお勧めする。個人でね。

Effective C++よりももうちょっと易しいものから読んだ方がよさげ。
...って何がいいんかね。C++ Coding Standardsってのも良書でお勧めできるけど、
やっぱりちょっと早いような。
0799デフォルトの名無しさん2007/09/22(土) 18:21:02
そんな長い関数を書くなよ
08007132007/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
>>800
悪いことはいわんからとっとと逃げ出したほうがいいんじゃないか、その会社。
正直言ってアホしかいねーだろ、どうみても。
0802デフォルトの名無しさん2007/09/22(土) 18:34:13
なんか凄いことになってるな。

>>773
これなら刺身の上にタンポポを乗せる仕事のほうがまだマシだ。
0803デフォルトの名無しさん2007/09/22(土) 18:36:11
標準ライブラリを使っちゃいけないってどんだけー
0804デフォルトの名無しさん2007/09/22(土) 18:40:08
まあ、仕事でやってるとわけ分からんルールは多いね。
 なぜそするの? → 以前からそうだから。
 こう変えたほうが良いのでは? → 今までこれでうまく言っているのだから変えるべきではない。
ということが多すぎ(--;

とりあえず社内ルールだからと割り切ってるが、本来どうあるほうが良いのかという勉強は欠かさないつもり。
0805デフォルトの名無しさん2007/09/22(土) 18:40:12
STL禁止か……もはやC++じゃないな。
テンプレートは使えるんだろうか。

というかなぜC++を使っているんだ。
もういっそのこと全部Delphiでいいだろ。
0806デフォルトの名無しさん2007/09/22(土) 18:45:25
この手の社内ルールというのは、
それを決めた時点では妥当だったりそれなりの理由があったりするものだが、
その後状況が変わってもそれを盲信して変えないという状況に陥りがちなんだよな。
なぜそうするのかが忘れさられて、ただルールだからという理由で守られ続ける。
0807デフォルトの名無しさん2007/09/22(土) 18:47:45
STL禁止や標準ライブラリ禁止って組み込みだったらそれなりにあることだと思ってたけど?
0808デフォルトの名無しさん2007/09/22(土) 18:54:41
>「Delphiを使うかもしれないからC++のライブラリに依存してはならない」
コピペ改変コーディングしか出来ない奴が大半と見た
08097132007/09/22(土) 19:04:23
>>805
>テンプレートは使えるんだろうか。
テンプレートは上司が知らないので使いすぎると
また禁止になる可能性があると思います。

>というかなぜ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
その上司は各種ライブラリのリファレンスもconstウゼーな、
とか言いながら読むんだろうな。
0812デフォルトの名無しさん2007/09/22(土) 19:38:53
だんだん「ム」ではなく「マ」の話題になってきたような気がする。
0813デフォルトの名無しさん2007/09/22(土) 19:44:27
あとでっかい機能といえば例外処理と名前空間だろうか。
Delphi移植論でいけば例外処理はありとなってほしいところだが。
0814デフォルトの名無しさん2007/09/22(土) 19:45:11
コーディング規約やその他のコーディングスタイルは、本来プロジェクトごとに決めるべき。
企業としての品質を維持するために共通ルールを設けるのは構わないが、ある程度の幅を持たせておき
その幅をプロジェクトごとにきめる形にするのがいい。

設計段階でのレビュー作業や、コードレビュー、プロジェクト完了時点での反省会議などをきちんとやれる会社でさえ、
コーディングルールは決まっていないことが多いから仕方ないことなのかも知れないが。
0815デフォルトの名無しさん2007/09/22(土) 19:48:48
その辺のC++の「新機能」って初出はARMだっけか?
1990年だからもう20年近く前になるんだが
08167132007/09/22(土) 20:27:49
>>810
え?>>810は私に対するレスですか?
私はパソコンで使用するソフトを作成しているので
組み込みの仕事では無いと思います。
ついでにコンパイラはC++Builderのそれです。

>>813
名前空間は使っているところをまだ見られていないと思うので分かりません。
上司が名前空間という機能を知っているかどうかも分かりません。
例外処理は勉強不足で私自身分かっていないのでなんともいえません。すみません。

>>814
私の会社はプログラマが少ないせいなのか、決まったルールは無いようです。
入社して間もない私が今まで誰もしなかった書き方をしていたので
上司は他の人も読めるようにしたかったのではないでしょうか。
また、コードレビューや反省会議といったものは特に無いようです。
0817デフォルトの名無しさん2007/09/22(土) 21:01:47
レビューもなく環境的な制限もないのにあれ使うなこれ使うなとか言われるのはやだな。
0818デフォルトの名無しさん2007/09/22(土) 21:05:08
完全に言語/技術の話じゃなくて「いかに俺の会社の上司がドキュソか」っつー
話になってるな
そういうのはマ板でやってくれんか
0819デフォルトの名無しさん2007/09/22(土) 21:29:57
const_<int> i(0);
0820デフォルトの名無しさん2007/09/22(土) 21:45:55
なんかこの流れキモくね?
08217132007/09/22(土) 21:59:46
納期に間に合わないので明日は出勤します。

>>818>>820
すみません。

>>819
それはconstのかわりにということですか・・・。
見つかるとそれも禁止になると思います。

スレ違いになってきたようなのでこの話はこのへんで止めます。

レスして下さった皆様、今日はありがとうございました。
0822デフォルトの名無しさん2007/09/22(土) 22:23:46
std::ostreamに空白文字 ' ' をn個出力する処理の、素敵な、シンプルで高速な書き方を教えてください。
0823デフォルトの名無しさん2007/09/22(土) 22:25:24
for(int i=0;i<n;i++) { os << ' '; }
0824デフォルトの名無しさん2007/09/22(土) 22:27:55
>823
現状はそれですが、プロファイラが遅いと言っています。
0825デフォルトの名無しさん2007/09/22(土) 22:28:04
こうかな
cout << setw(n) << ' ';
0826デフォルトの名無しさん2007/09/22(土) 22:32:57
>825
ソレダ
どうもありがとうございました。
0827デフォルトの名無しさん2007/09/22(土) 23:20:47
emacsでc++開発をするときの環境に関するサイトってないでしょうか?

meta-x なんちゃら

でDebugからclass構造のブラウズ、リファクタリングまで
なんでもできちゃう環境とか作れるのでしょうか?

elispは最近おぼえました
0828デフォルトの名無しさん2007/09/23(日) 00:28:45
Cの基本的な知識はありますがC++を独学するとしたらお薦めの本はありますか?
0829デフォルトの名無しさん2007/09/23(日) 00:32:30
Cの本は独習C、新・詳説C言語です。
0830デフォルトの名無しさん2007/09/23(日) 00:33:30
じゃあ独習C++でいいんじゃないの?
0831デフォルトの名無しさん2007/09/23(日) 00:50:31
独習C++は勉強になるけどつまらないっていう評判が多いけど、個人的には面白かったよ。
愛だね。
0832デフォルトの名無しさん2007/09/23(日) 01:37:41
独習にします。ありがとうございます。
0833デフォルトの名無しさん2007/09/23(日) 01:39:20
そのあとでいいから
Effective C++, Effective STL, Exceptional C++, Exceptional C++ Style
くらいは読んでね。同僚の迷惑にならんよう。
0834デフォルトの名無しさん2007/09/23(日) 01:43:32
今から独習C++なんて読み始めてる人なら

Effective C++, Effective STL, Exceptional C++, Exceptional C++ Style

を読めるようになるまで5年はかかる
0835デフォルトの名無しさん2007/09/23(日) 01:45:46
>>833-834
オマイラなんでそんな意地悪なことばっか言うわけ?
0836デフォルトの名無しさん2007/09/23(日) 01:46:46
平均的なプログラマってそんなもんですかね。安心するなぁ。
0837デフォルトの名無しさん2007/09/23(日) 01:48:24
なんで意地悪?????

3番めのはちょっと難しいかなとは思うけど、読まないとダメダメなコード
書いちゃうのがC++なんだから読むしかないべ。

新入社員に読ませてるけど、あんまり脱落しないよ?
0838デフォルトの名無しさん2007/09/23(日) 01:52:49
つーか、何で書籍スレでやらないの?
0839デフォルトの名無しさん2007/09/23(日) 01:53:41
イエテル
0840デフォルトの名無しさん2007/09/23(日) 02:12:25
C++を本当にC++らしく書ける奴なんてみたことないぞ
日本人だとエピスがちょっと書けるかな?
程度
0841デフォルトの名無しさん2007/09/23(日) 02:14:49
プッ
0842デフォルトの名無しさん2007/09/23(日) 02:25:07

上司「俺の知ってるCの一部の機能だけで書け」
ってことか・・・
0843デフォルトの名無しさん2007/09/23(日) 03:40:50
実際C++学んでもC風にしか書けない人が多数って
なんかで読んだ。
ついでに、private継承を使う人もすくなくC#では
結局public継承だけにしたらしい。
ま、ようは、C++は、そんだけ難解ってことなんだろうな。
0844デフォルトの名無しさん2007/09/23(日) 03:44:29
private継承するくらいなら基底クラスから可視範囲絞るかな
代替手段がありすぎてまずしようとは思えないな
0845デフォルトの名無しさん2007/09/23(日) 03:47:08
>>844
boost::noncopyable
0846デフォルトの名無しさん2007/09/23(日) 05:16:58
adaptor適用する時にprivate継承すると便利な事があるかもしれない
0847デフォルトの名無しさん2007/09/23(日) 10:19:02
つか「C++らしく書ける」って自他ともに認めてる奴でも
実際は「Javaっぽく+テンプレート少々」ぐらいだろ。
本当にC++でしかできないような変態コード書かれたらかえって大迷惑
0848デフォルトの名無しさん2007/09/23(日) 10:33:15
C++らしい変態コードを代に浸透させるのが我々の役目
0849デフォルトの名無しさん2007/09/23(日) 10:34:55
>>847
JavaっぽいC++のコードってこんなんか?

RAII?何それ。何でもかんでもnewするよ
ただの関数(オブジェクト)でいい場合でもいちいちクラスを作るよ
関数ポインタ?boost::function?いや、インタフェースでしょ
不要な場合もいちいちシングルトンを作るよ
テンプレートよりも継承、ポリモーフィズム、オブジェクトコンポジションを
多用するよ

ゲーって感じだな
0850デフォルトの名無しさん2007/09/23(日) 10:36:20
STLを使っただけなのにコードレビューで「わかりにくい」とrejectされました
0851デフォルトの名無しさん2007/09/23(日) 10:42:52
C++初心者の俺から見ると、STL使ってると「C++っぽい」って見える。
0852デフォルトの名無しさん2007/09/23(日) 10:50:52
同じくC++初心者の俺からすると、比較とシフト以外に<>を使ってるとC++っぽく見える
0853デフォルトの名無しさん2007/09/23(日) 10:54:21
#include <stdio.h>
0854デフォルトの名無しさん2007/09/23(日) 10:54:47
GenericsはJavaやC#にもあるよ
C++のテンプレートほど強力ではないけれども
0855デフォルトの名無しさん2007/09/23(日) 10:58:09
テンプレートオナニーとかしなくてもデストラクタを利用してRAIIやってれば
普通にC++っぽいと思うよ

GC型のほとんどのOO言語にも勿論Cにも真似の出来ないことだ
0856デフォルトの名無しさん2007/09/23(日) 11:13:24
>>855
そういえばC++はガベコレに最も適している言語だ。と語っている文章を見たことがある。
理由:「ガベージコレクタが管理すべきリソースが最小になるから」
0857デフォルトの名無しさん2007/09/23(日) 11:38:26
>>849
いやさすがにそこまでじゃないが自分のコードに超汎用は求めないってことよ。
0858デフォルトの名無しさん2007/09/23(日) 11:58:13
>>857
だったらC++使う必要なくね?
0859デフォルトの名無しさん2007/09/23(日) 12:00:23
ライブラリを書くか、アプリを書くかの違いじゃね

俺もアプリ部分は気楽に書いちゃう
0860デフォルトの名無しさん2007/09/23(日) 12:02:12
C++のGCって何でないの?
0861デフォルトの名無しさん2007/09/23(日) 12:02:51
あるよ
0862デフォルトの名無しさん2007/09/23(日) 12:04:37
ライブラリ作るにしても大抵使う人間と用途が限定されちゃってるから
動作変えるにも引数で十分な場合がほとんどじゃね
0863デフォルトの名無しさん2007/09/23(日) 12:04:58
C++/CLI(笑)
0864デフォルトの名無しさん2007/09/23(日) 12:48:22
C++は何でstringをプリミティブにしないの?
0865デフォルトの名無しさん2007/09/23(日) 12:54:17
ライブラリで十分に実装できるから。
0866デフォルトの名無しさん2007/09/23(日) 13:08:42
バッファオーバーフロー関連で騒ぐのが実は快感なマゾだからだよ
0867デフォルトの名無しさん2007/09/23(日) 13:11:46
バッファオーバーフローw

0868デフォルトの名無しさん2007/09/23(日) 13:22:47
すいませんが質問です。
ブラウザの「Firefox」はC++言語で書かれていると聞きましたが、本当でしょうか?
さらに、文字列の処理に標準のものを使わず、自前で文字列処理を作ってしまったと
聞きました。これも本当なのでしょうか?
情報が錯綜しすぎてて、何が何だか分からなくなってしまいました。
(さらに、それはなぜなの?とか聞くのは、厚かまし過ぎるかな・・・)
08698682007/09/23(日) 13:32:19
さらにすんません(汗
錯綜してるってのはただの言い訳で、自分に基礎知識と読解力が無いだけですよね。
自分が聞いた情報というのは、
 ・以前はそうでもなかったが、現在ではC++よりJavaで書いた方が
  優れたソフトウェアを作る事が出来る
 ・標準の処理が用意されているのに、自前で処理を作ってしまう事は
  「車輪の再生産」と呼ばれ、忌み嫌われている
です。
この情報か、あるいはFirefox製作者のスタンスのどちらかが間違っているのか
あるいは両方とも間違いではなくて、Firefoxは「そうせざるを得ない」特殊な状況にあるのか
判断の材料が無いのです。
0870デフォルトの名無しさん2007/09/23(日) 13:41:01
>>868
ソースはダウンロードできるからあらぬ妄想を膨らませないで調べてみたら
http://developer.mozilla.org/ja/docs/Download_Mozilla_Source_Code
0871デフォルトの名無しさん2007/09/23(日) 14:17:20
> ・以前はそうでもなかったが、現在ではC++よりJavaで書いた方が優れたソフトウェアを作る事が出来る
「優れた」の評価方法にも拠るが、言語による優劣はつかないと考えるのが一般的。
例えばパフォーマンス最優先ならJavaの不利な点が顕在化するかもしれないし、
機種依存性を排除したいのならC++には言語仕様にグラフィックを含まないことが問題になるかもしれない。

> ・標準の処理が用意されているのに、自前で処理を作ってしまう事は「車輪の再生産」と呼ばれ、忌み嫌われている
標準ライブラリの実装に不満がある場合は、忌み嫌うかどうかに関わらず作る必要がある。
それはまた、言語に拠らない。
0872デフォルトの名無しさん2007/09/23(日) 14:37:10
>>868
>>871 標準ライブラリの実装に不満がある
このような場合車輪の再発明(再生産?)には当たらないと思うよ。
URLエンコードとか特殊な文字列処理かもしれないしね。
あと、このネタはソフトウェア板の方がふさわしい気がする。
0873デフォルトの名無しさん2007/09/23(日) 15:49:53
#include <stdio.h>

class 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:27

class 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:20
聞き方として思っているのと違う出力だったならその出力も書いて質問しましょう
0877デフォルトの名無しさん2007/09/23(日) 16:15:16
>>875
と言う事は配列ではなく1つ1つnewする必要があるってことですね?
0878デフォルトの名無しさん2007/09/23(日) 16:16:25
>>876
出力される値は
10
4290540
-842150451
です。
875さんが言ってるとおりの動きをしてますね
0879デフォルトの名無しさん2007/09/23(日) 16:31:20
>>877 それもいいし、STLを使うとか、その場しのぎならD*でアクセスするとか
0880デフォルトの名無しさん2007/09/23(日) 16:35:25
>>879
STLではどうするんでしょうか?

今調べていたら、More Effectiveの項目3に書いてあるとネットでみたんですが
解決方法は規定クラスのポインタの配列で扱えば大丈夫ってわかりました。
08818792007/09/23(日) 16:41:09
ポインタの配列をSTLで扱うことを考えてただけでした。そんなすごい方法じゃなくてごめん
0882デフォルトの名無しさん2007/09/23(日) 16:49:19
>>881
規定クラスのポインタの配列で試したらうまく動きました!!

ありがとうございました
0883デフォルトの名無しさん2007/09/23(日) 21:19:03
OpenCVを使いたいためC++をやろうと思います。
webで情報を集めようと思いましたが、
「Cをやってから」とか書いてあるところしか見つかりません。
良いサイトを教えていただけますか。
0884デフォルトの名無しさん2007/09/23(日) 21:27:30
>>883
何が悪くて何が良いのか、こっちは知らないわけだが。
エスパーにでも頼め。
0885デフォルトの名無しさん2007/09/23(日) 21:34:07
>>883
じゃあCをやってから読むといいとおもうよ
0886デフォルトの名無しさん2007/09/23(日) 21:36:03
そうですね、では
「わかりやすくきれいにまとめてあって、
間違った説明がなく、
C++についてのみまとめてある」
webページをご存知でしたら教えてください。
0887デフォルトの名無しさん2007/09/23(日) 21:43:14
関係ないけどC++でぐぐったらエロゲがもしかして欄に出るのがうぜえ
0888デフォルトの名無しさん2007/09/23(日) 21:46:34
>>886
「わかりやすく」も「きれいに」も主観なので、残念ながらだれもご存知ないでしょうね。
0889デフォルトの名無しさん2007/09/23(日) 21:47:16
ねーy・・・ギリギリ入ってたww
0890デフォルトの名無しさん2007/09/23(日) 21:50:20
>>886
http://ja.wikipedia.org/wiki/C++
分かり難かったり汚かったりしたら自分で修正できるしさらにC++についてのみ書かれた夢のようなサイトがあったわwwwwww
0891デフォルトの名無しさん2007/09/23(日) 21:51:10
ぱすちゃが関連検索に出るのかww
名前が名前だから仕方ない
0892デフォルトの名無しさん2007/09/23(日) 22:19:28
配列の長さ(要素数)をコンパイル時に計算するにはどうしたらよいですか?
コンパイラの最適化レベルによらずにコンパイル時に計算になる例が欲しいです。

よろしくおねがいします。
0893デフォルトの名無しさん2007/09/23(日) 22:27:25
>>892
T array[Size];
std::cout << sizeof(array) / sizeof(* array);
0894デフォルトの名無しさん2007/09/23(日) 22:31:21
確かにsizeof使うと配列全体のサイズが得られるから、
各要素のサイズで割れば要素数が得られる。
でもsizeofがポインタ変数のサイズを返さないで配列全体のサイズを返すのって文法として正しいの?
コンパイラ依存じゃないよね?
っつーか内部でどうやってんだろ
0895デフォルトの名無しさん2007/09/23(日) 22:36:15
>>894
sizeofはコンパイル時に評価するのだから、オペランドが配列かポインタかは判別できるだろう。
ポインタならポインタのサイズだし、配列なら配列全体のサイズになるだけ。
0896デフォルトの名無しさん2007/09/23(日) 22:37:20
>892
最適化前提でいいなら、
template<class T, int N> int len(T (&)[N]){return N;}
というのがわりと有名。

>892,895
sizeofを使うマクロに比べてこの関数がよいのは、配列以外をこの関数に
与えるとコンパイルエラーになること。

最適化無しで数値にできる方法は知らない。
Boostスレのほうがいいかもな。
08978942007/09/23(日) 22:45:35
>>895 >>896
なるほど。勉強になりました。
ありがとうございます。
0898デフォルトの名無しさん2007/09/23(日) 22:50:42
>>894
コンパイラ依存ではない

基本的にarrayは宣言以外はポインタだが
sizeof演算子のオペランドの場合は配列になる。
08998922007/09/23(日) 22:54:17
>>893
ありがとうございます。
これでもいいんですが、できれば array が配列名以外の場合(ポインタとか)の場合に
コンパイルエラーになってほしいです。

boostスレ逝ってきます
0900デフォルトの名無しさん2007/09/23(日) 22:55:21
>>892
この len いいね。

最適化〜のくだりが分からないんだけど、何か問題があるのですか?
09019002007/09/23(日) 22:56:15
ミス
>>892 x
>>896 o
0902デフォルトの名無しさん2007/09/23(日) 22:57:22
インライン展開されなかったら、関数呼び出しになってしまうってことじゃね?
0903デフォルトの名無しさん2007/09/23(日) 23:02:30
#include <cstddef>
template<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:06
>>900
static int g_x=len(g_array);
としたときに、デバッグ時などで最適化をかけないでコンパイルすると、g_xは
len関数呼び出しによって動的に初期化されることになってしまう。sizeofの割
り算だとそういうことにはならない。すると、初期化のコストはともかく、g_x
が未初期化(0)の状態で(他の翻訳単位のグローバル変数の初期化などで)参照さ
れてしまうケースが生じるかもしれず、マズ-。

ということだと思われ。グローバル変数関係ないんだったら、lenをバシバシ
使えばよさげ。
09059032007/09/23(日) 23:09:17
sdt::size_t にしたほうが正しいな。

ぐぐればすぐ見つかると思ってたけど意外と見つからなかったんで
ここにメモがき。
09068922007/09/23(日) 23:10:19
>>893-904
どうもありがとうございます。

>>903がよさそうなんですが、読めません。。。
簡単な解説をいただけませんか?
0907デフォルトの名無しさん2007/09/23(日) 23:13:03
バッファオーバーフローで特定のプログラムを実行って実際にはどうやるの?

09089002007/09/23(日) 23:18:02
>>902,>>904 thx
そうか、あくまで関数だってこと忘れてた。
グローバル変数については、「初期化の順序を勝手に想定するな」みたいなことは本で読んだことがあるよ。
自分流に書き直したバージョン載せてみる。
template<class T, std::size_t N> inline std::size_t len(const T(&)[N]){return N;}
0909デフォルトの名無しさん2007/09/23(日) 23:18:36
やめとけ
09108922007/09/23(日) 23:24:35
((((テンプレート関数)へのポインタ)の配列)のsizeof)
かー。わかりました。
0911デフォルトの名無しさん2007/09/23(日) 23:28:02
>>910
いやちがう,910だとしたら
template<typename T, size_t N>
char (*lengthof_helper_char_array(T(&)[N]))[N];
だ。&lengthof_... というのはいったい?
09129032007/09/23(日) 23:29:10
>>906
関数テンプレートの引数については >>896 といっしょね。
903 は戻り値で値を返すんじゃなくて元の配列と同じ長さの char 型の配列を
返すように宣言してる。 sizeof(char) は 1 なので、この配列に sizeof を
かければ元の配列の長さが得られる。 sizeof の引数の式は実際に実行される
ことがないので、定義は要らない。

typedef とか使ってもっと簡単なコードにしたいところだけど、 template のせいで
同じ記述を何度か繰り返すことになり、あんまりすっきりしない。
0913デフォルトの名無しさん2007/09/23(日) 23:33:24
テンプレート引数で指定した型を継承するやり方で教えて欲しいことがあります。
C++ではテンプレート引数で指定した型に固有のメソッドを呼び出すことは文法的に正しいのでしょうか?
例えば
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
>>911
&lengthof_... は配列への参照を返すようにしてる。 C/C++ で配列を返す関数は
宣言できないから。で、参照でも sizeof に渡せば同じことになってくれる。
0915デフォルトの名無しさん2007/09/23(日) 23:36:15
>>913
http://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
>>914
ありがとうございます。
もうすこしだけ教えていただけませんか?

理解の為、まず
char c3[] = {1,2,3};
char (&rc3)[3] = c3;
int main(){}
こう書いてみたらこれはコンパイルできました。

次に、
char (&f(int))[3];  // これは何.....
int main(){}
こう書いてみたら、これもコンパイルできてしまったんですが、
私は一体何を宣言したことになるのでしょうか?
0917デフォルトの名無しさん2007/09/23(日) 23:45:03
>>912
普通、配列を返す関数は作れないよね?
この宣言が許されるのが不思議だ...。
09189122007/09/23(日) 23:47:23
あ、「参照を」返すのか!
09199182007/09/23(日) 23:48:12
ミス。おれは>>917だった
09209132007/09/23(日) 23:49:13
thisつけたら解消しました!
どうもありがとうございました
0921デフォルトの名無しさん2007/09/23(日) 23:51:12
>>918-919
何がわかったの?

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:07
これをポータブルにする試みがBoostでされていた気がする
0924デフォルトの名無しさん2007/09/24(月) 00:06:12
>>923 へ?コンパイラに依存なんてしてないでしょ?
0925>>917-9192007/09/24(月) 00:08:19
おれが理解したのはこんな感じ
1.関数は配列を返すことは出来ないが、配列の参照ならば返すことができる。
その宣言方法は
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:38
すごく..おもしろいです。
0927デフォルトの名無しさん2007/09/24(月) 00:13:08
template<typename T>
class Foo{
void Bar();
}

このBarって関数は、Tを全く使ってない
超巨大な関数なんですが、
exportが実装されてないコンパイラでは
これもヘッダに入れなきゃいけないんでしょうか…

あるいはBarの中身をなんか別のとこに追い出して
単純にそれを呼ぶだけの関数にするしかないですか。
0928デフォルトの名無しさん2007/09/24(月) 00:19:04
> あるいはBarの中身をなんか別のとこに追い出して
> 単純にそれを呼ぶだけの関数にするしかないですか。

もっとも分かりやすい解決法はこれだと思うが
避ける理由は?
0929デフォルトの名無しさん2007/09/24(月) 00:19:24
>>927
はい。

T 使ってないなら何も問題なく追い出せるでしょ。
0930デフォルトの名無しさん2007/09/24(月) 00:28:13
>>927
ひょっとしたらコンパイラの実装次第によっては、
出来るかもしれません。
もれなく鼻から悪魔が出てきますが、
0931デフォルトの名無しさん2007/09/24(月) 12:40:35
Comeau C++の出番だ!
0932デフォルトの名無しさん2007/09/24(月) 13:12:36
Tを使ってないのに何故テンプレになってるの?
0933デフォルトの名無しさん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:45
>>932,933
vectorのsizeとかのことかな
0936デフォルトの名無しさん2007/09/24(月) 13:46:58
まあ、普通は作られるだろうね。
そこまで頭のいいコンパイラはなかなかないんじゃない?
0937デフォルトの名無しさん2007/09/24(月) 14:01:14
>>927
おれもテンプレになってる理由が分からなかったが、
ひょっとしてこのクラス Bar以外にメンバーあるの?
0938デフォルトの名無しさん2007/09/24(月) 14:02:50
以前、VCのリンカはバイナリレベルで関数を比較して、同じのはまとめてくれる
という噂をcppllあたりから又聞きしたような気がしないでもないけど。
そういう実装は普及してるのかな。(というか本当にやってる?)
0939デフォルトの名無しさん2007/09/24(月) 16:24:16
>>938
VC6ではそれをやってるのを確認したよ

別々に作られると思ってて、ポインタ型のを<void*>にまとめる
とかやってたんだが無駄な努力だった

当時のg++はやってなくてバンバンふくれてた
今はどうだかしらない
0940デフォルトの名無しさん2007/09/24(月) 18:31:43
std::clogというのは何のためにあるんでしょうか?
みなさん使ってます?
0941デフォルトの名無しさん2007/09/24(月) 18:43:05
cerrとはバッファリングする/しないの違いじゃなかったっけ
0942デフォルトの名無しさん2007/09/24(月) 18:45:01
なるほど。
Cのstderrはunbuffered決め打ちだったけど、C++では選べると。
0943デフォルトの名無しさん2007/09/24(月) 19:35:27
>>942
別にCだってsetvbuf()すりゃいいだけだがな
0944デフォルトの名無しさん2007/09/24(月) 20:32:47
そりゃそうだが。
0945デフォルトの名無しさん2007/09/24(月) 21:05:16
Class *Instance = NULL;
...
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:52
変数名の先頭が大文字な時点で吐き気がする
0947デフォルトの名無しさん2007/09/24(月) 21:15:21
っチラシの裏
0948デフォルトの名無しさん2007/09/24(月) 21:16:25
>>945
少なくとも上は普通ではない。
boost::scoped_ptr<>とかstd::auto_ptr<>とか使って
deleteを隠匿するのが普通。
0949デフォルトの名無しさん2007/09/24(月) 21:17:08
>>946
お前病気じゃね
いやまじで
0950デフォルトの名無しさん2007/09/24(月) 21:26:00
こういう時はboost::triboolで格好よく決めたい
0951デフォルトの名無しさん2007/09/24(月) 21:50:56
ハァ?
tribool関係ねーだろカスはすっこんでろ
0952デフォルトの名無しさん2007/09/24(月) 21:56:41
カルシウムが足りない奴がいるな
0953C ◆jGKdrJZSEs 2007/09/24(月) 21:57:29
finallyでdeleteすればいいじゃない
0954デフォルトの名無しさん2007/09/24(月) 22:35:00
Visual C++やってるんですが…コンソールアプリケーションからやってるんですが…
なんかもぅよくわからなくなってきました。
0955デフォルトの名無しさん2007/09/24(月) 22:39:10
>>954
boost::mplを使ってみろ。話はそれからだ。
0956デフォルトの名無しさん2007/09/24(月) 22:46:49
話はそれからってw
そこまで行くのがまず大変だな。
0957デフォルトの名無しさん2007/09/24(月) 22:56:34
すみません。
そこまでいってすらいないど素人です。
0958デフォルトの名無しさん2007/09/24(月) 22:57:32
で、ここは相談室なんだが、何を訊きたいの?
0959デフォルトの名無しさん2007/09/24(月) 23:00:32
皆さんがまだ、C++を始めたばかりのころに参考にした書籍を教えて下さい。
0960デフォルトの名無しさん2007/09/24(月) 23:05:02
書籍スレがあるからそっちで。
0961デフォルトの名無しさん2007/09/24(月) 23:07:07
>>959
http://www.google.com/
0962デフォルトの名無しさん2007/09/24(月) 23:07:23
>>960
わかりました。
0963デフォルトの名無しさん2007/09/24(月) 23:14:49
boost使ってなけりゃど素人か、そうかおれもそうだもんな・・・精進しよう
0964デフォルトの名無しさん2007/09/24(月) 23:17:54
boost使いは一杯いるけど、boost.mpl使ってる奴となると相当少ないと思うがな
0965デフォルトの名無しさん2007/09/24(月) 23:27:25
一応C++ Template Metaprogrammingは読んだけど、
MPLをまともに使おうとは思わない俺はヘタレ。
いやまあ、確かに面白いけどねぇ。
0966デフォルトの名無しさん2007/09/25(火) 01:03:58
次スレは part58 でよろしく。
0967デフォルトの名無しさん2007/09/25(火) 01:36:42
#include <list>
using namespace std;

template < typename T >
class Hoge
{
 typedef list< T > listT;
 typedef listT::iterator listTit;
};

これをVC2003でコンパイルしても
構文エラー : ';' が、識別子 'listTit;' の前に必要です。
ってエラーになるんですがC++の仕様ですか?
0968デフォルトの名無しさん2007/09/25(火) 01:38:51
>>967 はい。 typedef typename listT::iterator listTit; でどうぞ。
0969デフォルトの名無しさん2007/09/25(火) 01:41:53
>>968
なんだかよくわからんけどコンパイル通りました
ありがとうございます
0970デフォルトの名無しさん2007/09/25(火) 01:50:26
>>968
このdependent nameの問題、会社でもよく聞かれるんだけど、詳しく解説してる日本語のサイトご存知ないですか?
"typename"だけじゃなくて、できれば"template"が必要な件にも触れてあると嬉しいです。
0971デフォルトの名無しさん2007/09/25(火) 01:53:42
>>967,968
Hogeの定義の部分ではlistTが具体的にどのクラスかは確定していなくて
コンパイラにはiteratorというのが型なのか値なのかがわからないかららしい。
0972デフォルトの名無しさん2007/09/25(火) 08:27:48
テンプレートは型だけじゃなくて値でも特殊化できるからかな。
0973デフォルトの名無しさん2007/09/25(火) 16:50:53
STGやRTSのように画面上にキャラクターがたくさん出てくるゲームで、
キャラクタークラスからゲーム管理クラスにアクセスする必要がある場合、
ゲーム管理クラスへのポインタを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
973の続き

設計1の問題点
・CharacterAのインスタンスが生成されるより前に、Character::owner_が初期化されることが保障されていない
・基底クラスのメンバは仮想関数だけにしたい(拘る必要なし?)

設計2の問題点
・CharacterAのインスタンス毎にポインタを保持するオーバーヘッドが気になる

一般的にどちらの設計にするべきですか?
0975デフォルトの名無しさん2007/09/25(火) 19:40:25
キャラクターが管理クラスにアクセスしない設計にする。
循環依存もダメだろ。
一回引き出しにしまって一週間後に見直してみよう。
0976デフォルトの名無しさん2007/09/25(火) 20:53:02
class A
{
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:15
>>974
GameManagerをシングルトンにして、
static GemeManager *GameManager::GetInstnace()
{
static GameManager instance;
return &instance;
}
とかするのはどう?
GameManager派生クラスを作るなら、これじゃだめだけど。
0978デフォルトの名無しさん2007/09/25(火) 21:22:46
ポインタじゃなくて参照で返せよ
0979デフォルトの名無しさん2007/09/25(火) 21:27:08
・保守時に混乱をきたすのでポインタにすべき
・表記法が乱雑になるので参照にすべき

・両方考慮して両方共に実装すべき
0980デフォルトの名無しさん2007/09/25(火) 21:29:57
保守時に混乱?バカは氏ね
NULLが返ることなんかないし、オマエみたいなボケがdeleteしたり
しないためにも参照で返せアホ
0981デフォルトの名無しさん2007/09/25(火) 21:33:35
アホは参照だろうがポインタだろうが危険な事をするのでどっちでもいい
0982デフォルトの名無しさん2007/09/25(火) 21:34:52
じゃあ俺はshared_ptrで返すようにするのを提案してみる
0983デフォルトの名無しさん2007/09/25(火) 21:34:55
>・保守時に混乱をきたすのでポインタにすべき
>・表記法が乱雑になるので参照にすべき
どっちも何が言いたいのかワカラン
0984デフォルトの名無しさん2007/09/25(火) 22:42:23
>>974
一般的には個々の状況において、自分で責任を持って判断すべきでしょう。

とはいえ、俺なら何となく設計2を選びたくなるかな。
一番素直だし。
個々のCharacterがGameManagerにアクセスする必要性があるんでしょ?
(他のキャラクターを検索して行動を決めるとか、別の物体(弾とか?)を追加したり)
キャラクターが自分が所属する空間を認識したり影響を与えるのは自然のことのように思えるし。

メモリの無駄が気になるならstatic(やシングルトン等)にするか、毎回引数で引き渡すか。
前者はGameManagerのインスタンスが一つと決まっているならわりとよくある手。
後者は複数のGameManagerが同時に存在して、かつ、メモリの無駄を省く必要性があるなら、仕方ないところ。

というか、設計1と2だったら関数一つ挟めば、いつでも切り替えられるように出来るでしょう。
とりあえずシンプルな方を選んでおけば?
0985デフォルトの名無しさん2007/09/25(火) 23:01:55
C++やり始めて間もないのですが、クラスというものを理解したくて
いろいろクラスを設計してみているのですが、
なんか継承を使う機会がなかなかありません
継承かなと思ってもいやこれは継承じゃなくてメンバ変数に他のクラスが入ってるだけだなってなります
メンバ変数に他のクラスが入ってるようなときにがんばれば継承でも書けるような気がしないでもないのですが
そうするのって正しいのでしょうか?
0986デフォルトの名無しさん2007/09/25(火) 23:08:46
継承なんかつかわなくてもいいよ
0987デフォルトの名無しさん2007/09/25(火) 23:12:54
継承を知りたいならJavaのinterfaceのほうがいい
0988デフォルトの名無しさん2007/09/25(火) 23:24:56
>>985
たとえばどんなクラスを設計した?
0989デフォルトの名無しさん2007/09/25(火) 23:25:27
ある程度でかいプログラムじゃないと、あまり継承の有効性は出てこないよ。

継承の利点は、ベースクラスの再利用というのもあるけど、
ポリモーフィズムで既存のコードを修正せずにどんどん拡張できるというのが一番大きい。
だから、大規模なプログラムでサブクラスがたくさん必要になるようなケースじゃないと
継承の利点はあまり出てこない。
0990デフォルトの名無しさん2007/09/25(火) 23:50:42
趣味で動的型付け言語の作り始めたとき、
初めてちゃんと継承にお礼が言えた。
0991デフォルトの名無しさん2007/09/26(水) 00:05:07
>>973
どっちでもいいんじゃないかな言いたいことは伝わってくるよ
俺は無神論者なんでownerみたいなのを個体に置きたくなかったから
他の個体を調べたりownerへの参照が必要な操作はstatic関数としてまとめてしまった

>>974
生命体の群みたいのを扱うとどうしても循環参照ができちゃうんだよ
こいつらは目ん玉がついてて自分で自分たちのことを認識するんだからしようがない
0992デフォルトの名無しさん2007/09/26(水) 00:07:07
クラスを使った情報隠蔽が継承を使うとぶっ壊れるってことにすっっっごい気をつけてね。
ここをちゃんと理解できたって思うまで継承は絶対に使っちゃダメだよ。
0993デフォルトの名無しさん2007/09/26(水) 00:29:28
画像フィルタクラスみたいなものも継承使うと楽なんだけどね。
ベースクラスに何もしないフィルタを作っておいて、それを継承して暈しフィルタや色フィルタ、
更にそれらを継承してバリエーションを持たせるとか。
09949732007/09/26(水) 01:17:37
>>977
なるほど、シングルトンはすっかり忘れていました。

>>984
参考になります。
最初に考えたGameManagerへのアクセスが、まさに弾などの追加でした。

>>991
static関数を使う方法もあるんですね。


シングルトンにするか、設計2の方法でいくか、もう少し考えてみます。
どうもありがとうございました。
0995デフォルトの名無しさん2007/09/26(水) 02:00:39
>>985
一例としては、クラス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(^・^)v2007/09/26(水) 04:10:54
次スレ。
http://pc11.2ch.net/test/read.cgi/tech/1190745673/
0997デフォルトの名無しさん2007/09/26(水) 07:12:25
う
0998デフォルトの名無しさん2007/09/26(水) 10:26:25
め
0999デフォルトの名無しさん2007/09/26(水) 10:29:18
ぼ
1000デフォルトの名無しさん2007/09/26(水) 10:35:39
Destiny's CHILDREN
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。