C++相談室 part51
レス数が1000を超えています。これ以上書き込みはできません。
0001v(^・^)v
2006/07/17(月) 04:48:17ただし質問の前にはFAQに一通り目を通してください。
IDE(VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
テンプレその他 >>1-15 付近参照
前スレ
C++相談室 part50
http://pc8.2ch.net/test/read.cgi/tech/1149427282/
0002v(^・^)v
2006/07/17(月) 04:50:532 http://pc.2ch.net/tech/kako/996/996640937.html
3 http://pc.2ch.net/tech/kako/1003/10038/1003832761.html
4 http://pc.2ch.net/tech/kako/1009/10090/1009071535.html
5 http://pc.2ch.net/tech/kako/1014/10142/1014217496.html
6 http://pc.2ch.net/tech/kako/1018/10184/1018454705.html
7 http://pc.2ch.net/tech/kako/1021/10217/1021787032.html
8 http://pc3.2ch.net/tech/kako/1025/10250/1025010364.html
9 http://pc3.2ch.net/tech/kako/1027/10273/1027347982.html
10 http://pc3.2ch.net/tech/kako/1029/10293/1029315669.html
11 http://pc3.2ch.net/tech/kako/1032/10323/1032345774.html
12 http://pc3.2ch.net/tech/kako/1035/10350/1035005882.html
13 http://pc3.2ch.net/tech/kako/1038/10380/1038031395.html
14 http://pc5.2ch.net/tech/kako/1041/10413/1041328679.html
15 http://pc5.2ch.net/tech/kako/1043/10436/1043605481.html
0003v(^・^)v
2006/07/17(月) 04:51:2517 http://pc5.2ch.net/tech/kako/1047/10475/1047560042.html
18 http://pc5.2ch.net/tech/kako/1050/10501/1050177746.html
19 http://pc5.2ch.net/tech/kako/1052/10526/1052625846.html
20 http://pc5.2ch.net/tech/kako/1055/10551/1055162298.html
21 http://pc5.2ch.net/tech/kako/1057/10575/1057580107.html
22 http://pc5.2ch.net/tech/kako/1060/10603/1060361082.html
23 http://pc5.2ch.net/tech/kako/1062/10626/1062690663.html
24 http://pc5.2ch.net/tech/kako/1066/10665/1066546387.html
25 http://pc5.2ch.net/tech/kako/1067/10679/1067949669.html
26 http://pc5.2ch.net/test/read.cgi/tech/1070164402/ (迷子)
27 http://pc5.2ch.net/test/read.cgi/tech/1074454641/ (迷子)
28 http://pc5.2ch.net/test/read.cgi/tech/1077985164/
29 http://pc5.2ch.net/test/read.cgi/tech/1082047479/
30 http://pc5.2ch.net/test/read.cgi/tech/1084030770/
0004v(^・^)v
2006/07/17(月) 04:52:2432 http://pc5.2ch.net/test/read.cgi/tech/1088236078/
33 http://pc5.2ch.net/test/read.cgi/tech/1090180012/
34 http://pc5.2ch.net/test/read.cgi/tech/1092018643/
35 http://pc5.2ch.net/test/read.cgi/tech/1093958200/
36 http://pc5.2ch.net/test/read.cgi/tech/1096304546/
37 http://pc5.2ch.net/test/read.cgi/tech/1098543578/
38 http://pc5.2ch.net/test/read.cgi/tech/1101473340/
39 http://pc5.2ch.net/test/read.cgi/tech/1106466303/
39(実質40) http://pc8.2ch.net/test/read.cgi/tech/1106527792/
40(実質41) http://pc8.2ch.net/test/read.cgi/tech/1113408957/
41(実質42) http://pc8.2ch.net/test/read.cgi/tech/1120190961/
43 http://pc8.2ch.net/test/read.cgi/tech/1124113879/
44 http://pc8.2ch.net/test/read.cgi/tech/1128512737/
45 http://pc8.2ch.net/test/read.cgi/tech/1133007604/
0005v(^・^)v
2006/07/17(月) 04:53:16[C++ FAQ]
http://www.parashift.com/c++-faq-lite/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
Cとその仕様を比較しながらの解説なので分かりやすい。
***** 質問の前に必ずこの二つに目を通してください *****
[禿 Stroustrup]
http://public.research.att.com/~bs/
[C++ International Standard]
http://www.iso.org/iso/en/CatalogueDetailPage.CatalogueDetail?CSNUMBER=38110&ICS1=35&ICS2=60&ICS3=
[JTC1/SC22/WG21 - C++]
http://www.open-std.org/jtc1/sc22/wg21/
ここから規格の最新(2003より新しい)ドラフトがダウンロードできる。
0006v(^・^)v
2006/07/17(月) 05:31:23amazon.com C,C++関連書籍
http://www.amazon.com/exec/obidos/tg/browse/-/3956/ref=br_bx_c_1_3/
The C++ Programming Language
ttp://www.amazon.com/exec/obidos/ASIN/0201700735/
ttp://www.amazon.co.jp/exec/obidos/ASIN/475611895X/ (翻訳)
C++ Primer (3rd Edition)
ttp://www.amazon.com/exec/obidos/ASIN/0201824701/
ttp://www.amazon.co.jp/exec/obidos/ASIN/4756140068/ (翻訳)
The C++ Standard Library
ttp://www.amazon.com/exec/obidos/ASIN/0201379260/
ttp://www.amazon.co.jp/exec/obidos/ASIN/4756137156/ (翻訳)
Effective C++
ttp://www.amazon.com/exec/obidos/ASIN/0201924889/
ttp://www.amazon.co.jp/exec/obidos/ASIN/4756118089/ (翻訳)
More Effective C++
ttp://www.amazon.com/exec/obidos/ASIN/020163371X/
ttp://www.amazon.co.jp/exec/obidos/ASIN/4756118534/ (翻訳)
Exceptional C++
ttp://www.amazon.com/exec/obidos/ASIN/0201615622/
ttp://www.amazon.co.jp/exec/obidos/ASIN/4894712709/ (翻訳)
More Exceptional C++
ttp://www.amazon.com/exec/obidos/ASIN/020170434X/
Exceptional C++ Style
ttp://www.amazon.com/exec/obidos/ASIN/0201760428/
C++ Coding Standards
ttp://www.amazon.co.jp/exec/obidos/ASIN/0321113586/
ttp://www.amazon.co.jp/exec/obidos/ASIN/4894716860/ (翻訳)
0007v(^・^)v
2006/07/17(月) 05:31:55Effective STL
http://www.amazon.com/exec/obidos/ASIN/0201749629/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714108/ (翻訳)
Modern C++ Design
http://www.amazon.com/exec/obidos/ASIN/0201704315/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714353/ (翻訳)
C++ Templates
http://www.amazon.com/exec/obidos/ASIN/0201734842/
C++ Template Metaprogramming
http://www.amazon.com/exec/obidos/ASIN/0321227255/
0008v(^・^)v
2006/07/17(月) 05:32:31[Boost]
Boost http://www.boost.org/
(日本語) http://www.kmonos.net/alang/boost/
(日本語) http://shinh.skr.jp/boost/
[標準ライブラリ]
SGI-STL http://www.sgi.com/tech/stl/
STLport http://stlport.sourceforge.net/
GNU libstdc++ http://gcc.gnu.org/libstdc++/
Apache STDCXX http://incubator.apache.org/stdcxx/
STLFilt http://www.bdsoft.com/tools/stlfilt.html
(日本語) http://www005.upp.so-net.ne.jp/episteme/html/stlprog/
(日本語) http://www.wakhok.ac.jp/~sumi/stl/
[Loki]
http://sourceforge.net/projects/loki-lib/
LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport
0009v(^・^)v
2006/07/17(月) 05:33:39多すぎ。とりあえずスレタイ C++ で検索して。
以下、スレタイで見つからなさそうな関連スレ。
Boostを語れゴラァ part2
http://pc8.2ch.net/test/read.cgi/tech/1139313234/
GCCについて part7
http://pc8.2ch.net/test/read.cgi/tech/1145357824/
0010v(^・^)v
2006/07/17(月) 05:35:330011デフォルトの名無しさん
2006/07/17(月) 06:25:58環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後死ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
0012デフォルトの名無しさん
2006/07/17(月) 06:27:31乙
0013デフォルトの名無しさん
2006/07/17(月) 07:06:31懐かしいwこれ書いたの俺だww
0014デフォルトの名無しさん
2006/07/17(月) 08:02:50懐かしいwこれ書いたの俺←本当です。
0015デフォルトの名無しさん
2006/07/17(月) 08:08:49ほんと!?
このスレって3人くらいしかいないんじゃないの?
じゃぁ指摘してあげる。
>ランタイムを使用するようにして使っているが、例えばstd::vectorを
>使っても使わない時と比べ10Kほどしか増えない。
これさ、テンプレート引数を変えるたびに10KBずつ増えるってことでしょ?
それぞれ別のクラスに対するvectorが10個あったら100KBだよね?
100個あったら1MB。
環境によらず、一気に10倍なんじゃないの?
ちなみに俺が10倍って書いたのは冗談だよw
0016デフォルトの名無しさん
2006/07/17(月) 08:26:57いや、今はさすがにわかってる。
BCCのバージョンもBDS2006のを使ってるから5.82に上がってるし。
わざわざ書いてくれてスマン。あの頃は俺も初心者だった。
0017デフォルトの名無しさん
2006/07/17(月) 10:48:020018デフォルトの名無しさん
2006/07/17(月) 11:38:33class C {
public:
void setHoge(�@) { ... }
�A getHoge() { ... }
private:
tr1::shared_ptr<Hoge> hoge_;
};
このようなクラスがあったとき、�@と�AはHoge*かtr1::shared_ptr<Hoge>の
どちらにするのがいいのでしょうか?
�Aはユーザーが誤ってdeleteできないようにtr1::shared_ptrを返す
べきとは思うのですが
0019デフォルトの名無しさん
2006/07/17(月) 12:49:30Guru of the Week, GotW.ca Home Page
http://www.gotw.ca/
Incompatibilities Between ISO C and ISO C++
http://david.tribble.com/text/cdiffs.htm
C++ Language Tutorial
http://www.cplusplus.com/doc/tutorial/
Generic Programming
http://www.generic-programming.org/
0020デフォルトの名無しさん
2006/07/17(月) 12:54:38俺だったら1も2もshared_ptrにするな。
0021デフォルトの名無しさん
2006/07/17(月) 13:14:40その2択なら shared_ptr しかあり得ない。 Hoge* を使うと
- set に new されてないポインタが渡されたら...
- 気づいているようだが get で返したポインタを delete されたら...
前スレで言われてたように、ポインタの set/get なんて無くすことができれば
一番いいんだけどね。
0022デフォルトの名無しさん
2006/07/17(月) 13:31:180023デフォルトの名無しさん
2006/07/17(月) 13:31:26というのはshared_ptrを知っているユーザーなら決して
newしてないオブジェクトを渡さないから少しはマシってことでしょうか?
set/get はない方がいいとは思いますがあらゆるものが不足してなくせないんです
interfaceをどうとかと言っていた方がいましたが・・
0024デフォルトの名無しさん
2006/07/17(月) 13:35:06例えば、
class Person {
public:
explicit Person(int age) : age_(age) {}
...
private:
int age_;
};
のようなクラスがあった場合もsetはない方がよいですか?
時代はImmutableなのでしょうか?
0025デフォルトの名無しさん
2006/07/17(月) 13:45:21Person に含まれるほかの情報との整合性が無いなら全部 public な構造体にする。
整合性が必要なら、ほとんどの場合は「年齢をセットする」という単一の操作が
意味を成さないことになるので、そんなインターフェースは要らない。
002625
2006/07/17(月) 13:46:49書かなくていいコードを書いてるんじゃないかと疑う余地があるってことだ。
0027デフォルトの名無しさん
2006/07/17(月) 13:58:47・ageが他のメンバと関係ないデータならageをpublicにして、直接アクセス
・ageが他のメンバと関係有る場合、ageだけを変更するなんて操作はいらない
見当違いなこと言ってたらすいません・・
0028デフォルトの名無しさん
2006/07/17(月) 13:59:04引数の型を shared_ptr にしとけば shared_ptr を渡すか、
shared_ptr のコンストラクタを使った明示的な変換を必要とするので
間違いがあっても気づきやすいってこと。
「決して〜」とは言い切れないけど、だいぶマシとは言える。
set/get については、 >>25-26
0030デフォルトの名無しさん
2006/07/17(月) 14:02:22> set/get はない方がいいとは思いますがあらゆるものが不足してなくせないんです
それを詳しく説明しない限り、shared_ptrでいいかどうか説明できないでしょ?
外でどう使われるか説明してないんだから。
0031デフォルトの名無しさん
2006/07/17(月) 14:15:52setterはアンチパターンになりうるということですよね?
age_に大して何らかの前処理や後処理をする必要が有る(または予期される)場合など
(例えばマルチスレッドで同期を取る)可能性がある場合、setterは避けられませんか?
>>30
不足しているのは私の頭です
それに、どうも今まで読んできた本の内容を素直に受け入れすぎる傾向もあるようです
0032デフォルトの名無しさん
2006/07/17(月) 14:53:32Person son2(son1.age());でいいからね
まあImmutableパターン知ってるなら>>25-のアドバイスは聞かないことだ
つーかdataをpublicにするな
003325
2006/07/17(月) 15:47:34データを public にするなというのもクラスとしての整合性を
前提にしたルールであって、整合性の必要無いデータについて
盲目的に適用するものではないと考える。
データを組み合わせただけの構造体のほうがクラスよりも単純だ。
明確な必要性が無い限り単純さを損なわないほうがいい。
0034デフォルトの名無しさん
2006/07/17(月) 16:23:31どうですか?って聞かれても困るよね。
shared_ptrだけじゃまずいの? って思うけど…
なぜclassにする必要があるのかわかりません。
0035デフォルトの名無しさん
2006/07/17(月) 16:33:52志
社
同志社同志社同志社
同
志
社
0036デフォルトの名無しさん
2006/07/17(月) 16:34:29志
社
同
同志社同志社同志社
社
同
志
社
0037デフォルトの名無しさん
2006/07/17(月) 16:38:18年齢という数値だけを持つPersonというクラスを
class Person {
public:
explicit Person(int age) : age_(age) {}
int getAge() const { return age_; }
void setAge(int x) { age_ = x; }
private:
int age_;
};
と実装して、クライアントに "Person a; int age = a.getAge();" と
書かせるようにするか、もしくは簡潔に
struct Person { int age; };
と実装して、クライアントに "Person a; int age = a.age;" と
書かせるようにするか、どっちがいいのかってこと。
…と考えればわかりやすいかな?
一般に、あるクラスのすべてのデータメンバが他のデータメンバと完全に独立してて、
外部とのインタフェースがget/setしか存在しないなら、
上記のどちらでも良くて好みの問題。
前者はデータメンバをprivateにしているが、実際のところ隠蔽している意味がない。
# ただ、前者からsetだけ取り外すと若干様子が変わるけど
>>33が言っているのは、意味的に等価なら前者のコードは単なる無駄なんじゃないか
ってこと。漏れも同意で、盲目的な雪駄と下駄は個人的には面倒なので使わないな。
0038デフォルトの名無しさん
2006/07/17(月) 21:28:49雪駄、ゲッタをとりあえず盲目的にでもつけとくのは正解
0039デフォルトの名無しさん
2006/07/17(月) 21:29:390040デフォルトの名無しさん
2006/07/17(月) 21:33:33value++;
obj,SetValue(value);
みたいな文が増えるくらいならpublicにしてる。
それ以外ならとりあえずprivateにしてセッターゲッターかな
0041デフォルトの名無しさん
2006/07/17(月) 21:50:270042デフォルトの名無しさん
2006/07/17(月) 21:55:40「僕の大好きな雪駄、ゲッタを悪く言うやつなんてみんな馬鹿だ!」ってことか。
小学生かよ。
プログラムするならもっと論理的に考えな。
0043デフォルトの名無しさん
2006/07/17(月) 22:20:120044デフォルトの名無しさん
2006/07/17(月) 22:21:410045デフォルトの名無しさん
2006/07/17(月) 22:23:10だれがどっちが優れてるなんて話をしている?
盲目的なコードを書くんじゃなくて、理由に基づいて書けってことだ。
0046デフォルトの名無しさん
2006/07/17(月) 22:28:56「整合性の必要が無いデータ」とはどのようなものですか。
0047デフォルトの名無しさん
2006/07/17(月) 22:29:55どちらかがより目的に適合するなら、それは優れているというのではないですか。
0048デフォルトの名無しさん
2006/07/17(月) 22:35:37名前と住所を持った単純なデータ構造を考えてみてくれ。
どんな文字列も有効な名前だし、どんな文字列も有効な住所だ。
そうなると、それは構造体だ。 struct で表せ。何も private にするな。
(意訳)
http://www.artima.com/intv/goldilocks3.html
0049デフォルトの名無しさん
2006/07/17(月) 22:37:10したいようにすればいいよ。
0050デフォルトの名無しさん
2006/07/17(月) 22:37:42紙を切るという目的にはカッターナイフが適合する。
木片を切るという目的にはノコギリが適合する。
しかしどっちが優れているとも言えない。
プログラムするならもっと論理的に考えな。
0051デフォルトの名無しさん
2006/07/17(月) 22:44:06リンク先を読みましたが、最後のBjarne Stroustrupの発言を意図的に
無視しているのは何故ですか。
0052デフォルトの名無しさん
2006/07/17(月) 22:49:40最後のって、でかいな。どこのつもりだ。どこにしても無視してるつもりは無いけど。
0053デフォルトの名無しさん
2006/07/17(月) 22:59:29あなたの発言は、Bjarne Stroustrupの最後から二番目の内容を
恣意的に解釈しただけのものではありませんか。
0054デフォルトの名無しさん
2006/07/17(月) 23:06:54常に一方が勝るというほどの差はない。文脈によって良かったり悪かったりだろう。
想定される使用状況ではある一方が有利と判断できるなら、それを選べばいい。
例えば、既存のコードに追加するときや開発チーム内でのルールがあるときなどは、
周囲のコードやルールに合わせておくべき。
>>48
なかなか丁寧で面白いね。"Classes Should Enforce Invariants" という題名が秀逸。
「不変条件がないならクラスにするべきではない」ってところ?
0055デフォルトの名無しさん
2006/07/17(月) 23:08:08紙を切るという目的において、カッターナイフとノコギリの
どちらかが優れているということも出来ませんか。
0056デフォルトの名無しさん
2006/07/17(月) 23:09:250057デフォルトの名無しさん
2006/07/17(月) 23:11:35100%同意します。
0058デフォルトの名無しさん
2006/07/17(月) 23:13:032番目の内容からさらに一部だけ意訳した。
恣意的で間違っているというならさっさと指摘してくれ。
まどろっこしい。
0059デフォルトの名無しさん
2006/07/17(月) 23:13:43同感です。
ageごときにsetter, getterを付けるのは常に冗長のような決め付けは、
そちらの方が盲目的に見えます。
0060デフォルトの名無しさん
2006/07/17(月) 23:16:16その理由がプログラムとマッチすれば使えばいい。盲目的に使うのは無駄で迷惑。
0061デフォルトの名無しさん
2006/07/17(月) 23:16:41別に間違っているとは言ってません。
0062デフォルトの名無しさん
2006/07/17(月) 23:17:33では、publicの方が優れているというのですね。
0063デフォルトの名無しさん
2006/07/17(月) 23:19:46つまり、あなたが「単純なデータ」だと思うようなメンバ変数の場合は、
相手はいつでも「盲目的にsetter/getterを作っている」と思っていると
いうことですね。
0064デフォルトの名無しさん
2006/07/17(月) 23:22:080065デフォルトの名無しさん
2006/07/17(月) 23:22:240066デフォルトの名無しさん
2006/07/17(月) 23:23:210067デフォルトの名無しさん
2006/07/17(月) 23:25:060068デフォルトの名無しさん
2006/07/17(月) 23:29:14commentまでネチネチつけてた
時間の無駄だってのに・・・
0069デフォルトの名無しさん
2006/07/17(月) 23:29:29僕の大好きなpublicデータメンバを悪く言うやつなんて皆バカだ」ってことか
小学生はおのれじゃボケ!
0070デフォルトの名無しさん
2006/07/17(月) 23:34:460071デフォルトの名無しさん
2006/07/17(月) 23:41:03ソース行数が多いほうが儲かるとき、オブジェクトっぽく見せたいとき、setter/getter
納期まで時間がないとき、public
0072デフォルトの名無しさん
2006/07/17(月) 23:45:36元は(データを隠蔽した)クラスを作るべきかどうかって話だろ?
噛み合ってないよ。
0073デフォルトの名無しさん
2006/07/17(月) 23:53:140074デフォルトの名無しさん
2006/07/17(月) 23:57:25せっかくなので拾ってきた。引用元は和訳第3版。
22項: データメンバはprivate宣言しよう
(ざっくり飛ばして最後)
覚えておくこと
・データメンバはprivate宣言しよう。それにより、データアクセスにおける構文の
一貫性、精度のよいアクセス制御、不変な条件の保証、クラスの制作者が実装を
変更できる柔軟性が得られる。
・protectedはpublicよりカプセル化を進めるものではない。
例えば、後からインタフェースを変更せずに内部機能を追加したいとき
(例えば外部から不可視のオブザーバを追加するなど)、
データメンバがprivateなら安心。てことか。
>>48の引用元とは部分的に対立するね。どっちもどっちだなあ。
0075デフォルトの名無しさん
2006/07/18(火) 00:01:16草履(ぞうり)
樏(かんじき)
足袋
・・駄目だ
0076デフォルトの名無しさん
2006/07/18(火) 00:06:55対立しないよ。リンク先をよく読め。
0077デフォルトの名無しさん
2006/07/18(火) 00:17:05そんな無様なクラスは使いたくない。
0078デフォルトの名無しさん
2006/07/18(火) 00:31:480079デフォルトの名無しさん
2006/07/18(火) 00:34:46それは駄目だろ。
実在はしてそうでイヤだが
0080デフォルトの名無しさん
2006/07/18(火) 00:36:140081デフォルトの名無しさん
2006/07/18(火) 00:48:31じゃ「盲目的に」全てにsetter/getterを作るしかないねw
0082デフォルトの名無しさん
2006/07/18(火) 00:54:05同じクラスで混在するのは変じゃないか?
0083デフォルトの名無しさん
2006/07/18(火) 00:56:32俺はある程度規則性があれば一つのクラス内で混在させてもいいと思うけどな
0084デフォルトの名無しさん
2006/07/18(火) 00:57:35そんな無様なクラスは使いたくない。
0085デフォルトの名無しさん
2006/07/18(火) 00:59:34思考停止の見本。
0086デフォルトの名無しさん
2006/07/18(火) 01:02:04それはもうclassじゃなくてstructだろって話だろ。
0087デフォルトの名無しさん
2006/07/18(火) 01:04:49そもそもgetter/setterをいちいち作って回ること自体設計失敗してるけどな。
0088デフォルトの名無しさん
2006/07/18(火) 01:11:22インクリメントするI/Fでもあれば済む話なんじゃないか?
0089デフォルトの名無しさん
2006/07/18(火) 01:21:24元々はポインタのset/getのようだし、もう少し話題は広いようだよ。
0090デフォルトの名無しさん
2006/07/18(火) 01:50:45整合性の必要ない(つまり不変条件が壊れない)データの集合をカプセル化するとき、
「データメンバをpublicにしてget/setは使わない」のか、
「データメンバをprivateにしてget/setを使う」のか、
どっちがよりいいのかって話。
>>18や>>24
混乱してるかもしれんが、整合性が必要なデータを扱うとき(例えば生ポインタに
保持したメモリを勝手に開放されては困るとき)や、状態遷移に制約を付けたいとき
(例えば年齢は初期化後はインクリメントしかできないようにしたいとき)などは、
データメンバをpublicにするのはNGだ。これらの状況では、単純なget/setも
NGになるかもしれない(NGなことが多いと思う)。
0091デフォルトの名無しさん
2006/07/18(火) 03:03:090092デフォルトの名無しさん
2006/07/18(火) 03:21:45/*
|
|
|
∧|∧
( / ⌒ヽ | ̄ ̄ ̄ ̄ ̄ ̄ ̄
| | | |
∪ / ノ . |
ノ ノ ノ */
main (
)
{
}
0093デフォルトの名無しさん
2006/07/18(火) 08:21:090094デフォルトの名無しさん
2006/07/18(火) 08:49:26入らなくてもいいんじゃないかと思うんだがw
0095デフォルトの名無しさん
2006/07/18(火) 10:34:19うわ、すげー懐かしい AA だ。
確か、俺が作ったんだった気がする。
0096デフォルトの名無しさん
2006/07/18(火) 12:05:48えらそうなところだ。この派閥は決まってsetter/getterを付ける奴を馬鹿にする。
0097デフォルトの名無しさん
2006/07/18(火) 12:19:030098デフォルトの名無しさん
2006/07/18(火) 12:39:340099デフォルトの名無しさん
2006/07/18(火) 12:44:100100デフォルトの名無しさん
2006/07/18(火) 12:59:210101デフォルトの名無しさん
2006/07/18(火) 12:59:320102デフォルトの名無しさん
2006/07/18(火) 13:00:10アクセッサとでも言いたまえ。
0103デフォルトの名無しさん
2006/07/18(火) 13:01:420104デフォルトの名無しさん
2006/07/18(火) 13:04:570105デフォルトの名無しさん
2006/07/18(火) 13:42:40も前ら Point クラス (メンバは int x; int y; の2つ)って
どうやって実装してる?
private にして setter や getter 付けてる?
漏れは struct にしてるけど。
0106デフォルトの名無しさん
2006/07/18(火) 13:45:24語っていただこうか
0107デフォルトの名無しさん
2006/07/18(火) 13:51:13整数型の数値を2つ保持するのが機能の全てです。
0108デフォルトの名無しさん
2006/07/18(火) 13:56:360109デフォルトの名無しさん
2006/07/18(火) 14:11:050110デフォルトの名無しさん
2006/07/18(火) 14:12:38なにそれ
0111デフォルトの名無しさん
2006/07/18(火) 14:14:08ttp://en.wikipedia.org/wiki/Plain_Old_Data_Structures
0112デフォルトの名無しさん
2006/07/18(火) 14:21:53↓
0113デフォルトの名無しさん
2006/07/18(火) 14:23:52>>108と何が違うんだ?
0114デフォルトの名無しさん
2006/07/18(火) 14:28:450115デフォルトの名無しさん
2006/07/18(火) 14:52:380116デフォルトの名無しさん
2006/07/18(火) 15:19:180117デフォルトの名無しさん
2006/07/18(火) 17:17:22structとclassの違いはデフォルトがpublicかprivateかだけ。
PODなclassも存在するし、PODでないstructも存在する。
普段は108の言い方でも大体通じるが、こういう所でそれは期待できない。
0118デフォルトの名無しさん
2006/07/18(火) 17:19:330119デフォルトの名無しさん
2006/07/18(火) 17:20:260120デフォルトの名無しさん
2006/07/18(火) 17:23:360121デフォルトの名無しさん
2006/07/18(火) 17:30:24少なくともgccでは同じコードを吐く。
だから、PODであることを表明したければstructにするのがいいと思う。
0122デフォルトの名無しさん
2006/07/18(火) 17:31:01>>117じゃなくて>>118
0123デフォルトの名無しさん
2006/07/18(火) 18:35:570124デフォルトの名無しさん
2006/07/18(火) 21:40:15void func(){
int hoge;
for( int i=0; i < 777; ++i ){
hoge = 123;
//hogeを使った処理
}
}
B==========================
void func(){
for( int i=0; i < 777; ++i ){
int hoge = 123;
//hogeを使った処理
}
}
なんか初心者目だと、Bはループの度にhogeを確保しなおして遅くなるイメージですが、
一般に
・A、Bどちらでもhogeは、関数の初めにスタックに確保される
・Bの方がスコープが限定されている分、最適化されやすい
という認識で良いのでしょうか?
0125デフォルトの名無しさん
2006/07/18(火) 21:47:48よって常にBで書く方がよい
0126デフォルトの名無しさん
2006/07/18(火) 21:59:350127デフォルトの名無しさん
2006/07/18(火) 22:04:31// scope A
}
// scope B
i のスコープはどこまで?
A だと思ってたんだけど、B までなソースに出くわした。
0128デフォルトの名無しさん
2006/07/18(火) 22:07:200129デフォルトの名無しさん
2006/07/18(火) 22:07:36でも外に漏れる実装は確かにあるな、VCとか。
0130デフォルトの名無しさん
2006/07/18(火) 22:14:08ははー、どっちでも同じなんですね
レスありがとうございました
0131デフォルトの名無しさん
2006/07/18(火) 22:19:53VC7〜7.1はローカルスコープに同名の変数がない限りB、
VC8はデフォルトでA。
0132デフォルトの名無しさん
2006/07/18(火) 22:48:27#define for if(0); else for
0133デフォルトの名無しさん
2006/07/18(火) 23:33:330134デフォルトの名無しさん
2006/07/19(水) 00:21:580135デフォルトの名無しさん
2006/07/19(水) 00:27:02いまも昔も関係ないわけですね。
ありがとうございました。
0136デフォルトの名無しさん
2006/07/19(水) 01:18:44互換モードにしたけりゃコンパイル時のスイッチ使え。
/Zc:forScope ←VC++の場合
http://pc8.2ch.net/test/read.cgi/tech/1149427282/848
> VC7では直ってなくて
> VC7.1ではデフォルトでは直ってないがオプション指定で回避可能
> VC8直ってる
もちろん A が正しい。>>127
0137デフォルトの名無しさん
2006/07/19(水) 01:28:500138デフォルトの名無しさん
2006/07/19(水) 01:35:34窓から投(ry
0139デフォルトの名無しさん
2006/07/19(水) 01:39:290140デフォルトの名無しさん
2006/07/19(水) 09:33:200141デフォルトの名無しさん
2006/07/20(木) 01:35:42例えばソケットとかcloseメソッドは当然作るとして、デストラクタでも念のためにcloseしますよね?
そのときにエラーが出たら?
0142デフォルトの名無しさん
2006/07/20(木) 01:44:40俺はエラーチェックしない。
そんなcloseなんてまず失敗するほうがおかしい、
せいぜい引数がおかしいなどと言った理由だろと決め付けている。
そして、もしエラーチェックしたければデストラクタに頼らず、自分でクローズする。
0143デフォルトの名無しさん
2006/07/20(木) 02:20:27まぁエラーが出るような処理はデストラクタではまずやらんが、
やったとしても、ログ出して終わり。
0144デフォルトの名無しさん
2006/07/20(木) 02:35:10じゃあエラーが起こりうる場合はデストラクタでは資源解放しないってことでしょうか。
明示的にクローズするんですか?数が多くても?
あとsocket closeはあくまでも例なんで、解放時にエラーの可能性はあるって前提でお願いします。
0145デフォルトの名無しさん
2006/07/20(木) 02:44:01いやあのね、だからエラーが起こるような処理は基本的にはデストラクタでは
やらないって書いてるでしょ。
0146デフォルトの名無しさん
2006/07/20(木) 02:46:36たとえばさ、資源解放が出来ないことが「致命的」な場合に、それをデストラクタでやって、
解放できないときの「異常」をデストラクタが飲み込んでしまうような設計をしたいんです、
とおまえさんは言っとるわけだ。
答えは、それが困るならデストラクタで解放するな、だ。
0147デフォルトの名無しさん
2006/07/20(木) 02:52:42エラーの処理をデストラクタでやればいいじゃん。
まぁ、資源解放時のエラーでできる事なんかログを書く事ぐらいだと思うけど。
だから、>>143 が正解だと思う。
0148デフォルトの名無しさん
2006/07/20(木) 02:55:360149デフォルトの名無しさん
2006/07/20(木) 03:06:37Win32APIベースのプログラムなら SetLastError でも使ってあとから GetLastError で問題がなかったか調べろ。
それ以外の環境だったら似たようなグローバルエラー変数ソリューションを自作するなりして使え。
0150デフォルトの名無しさん
2006/07/20(木) 03:32:331、エラーチェックしない
2、closeを別に作って呼ぶ
3、ログ吐く
4、GetLastError等を使う
どれもいまいちだね。
0151デフォルトの名無しさん
2006/07/20(木) 03:42:12基本3で、可能なら2もできるようにしておくのがいいんじゃないかな。
std::fstream なんか、そんな感じだね。
0152デフォルトの名無しさん
2006/07/20(木) 05:01:420153デフォルトの名無しさん
2006/07/20(木) 05:04:29いや、それだったら例外と大して差がないから、結局同じ問題に帰着する。
0154デフォルトの名無しさん
2006/07/20(木) 09:04:11・終了処理用のmethodを別途作る。こちらは必要な例外を投げる。
と作っておき、エラーハンドリングをきちんとしたい時は2でやる。
簡便にやりたい時は1で済ませる。
というのはもはや定法です。
0155デフォルトの名無しさん
2006/07/20(木) 09:06:26クライアントは、生成・削除以外の責任を持たなくて良いくらいのカプセル化の方が、気持ち良い
削除前に必ずrelease()を呼んでください…みたいのは嫌なんだよな
まぁ、今はしょうがないのでそうしてるけど、次があったらどうにかして欲しいわ
0156デフォルトの名無しさん
2006/07/20(木) 10:56:55きちんとcatchしといたほうがいいのでしょうか。
0157デフォルトの名無しさん
2006/07/20(木) 11:09:13・デストラクタは例外を投げてはいけない。デストラクタ内で例外を投げる関数を呼び出す場合、
デストラクタがプログラムを中止させるか、その例外を補足し飲み込む(処理する)ようにする。
・クラスのクライアントが例外に対処する必要があるなら、クラスに「例外を投げるかもしれない処理」
をする通常の関数(つまり、デストラクタでない関数)を付ける。
0158デフォルトの名無しさん
2006/07/20(木) 12:39:19けっして定法ではないと思う。
ネットでも仕事でもよく見かけるのはエラーチェックしない糞プログラムばっかりだ。
0159デフォルトの名無しさん
2006/07/20(木) 12:56:35えーとそれは「定法である」ということにケチを付けたいということでよろしいか?
0160デフォルトの名無しさん
2006/07/20(木) 13:41:59その例外を受けたときどうしたいのかによって、答えは違うだろう。
ソケットクローズがエラーだったとして、それを検出したらどうするのかと。
0161デフォルトの名無しさん
2006/07/20(木) 14:47:090162デフォルトの名無しさん
2006/07/20(木) 15:09:29投げたくなっても、投げてはいけません。
0163デフォルトの名無しさん
2006/07/20(木) 15:16:23ただし、一番上のやつは駄目で、二番目を参照すること。
0164デフォルトの名無しさん
2006/07/20(木) 21:43:43例えばここのFileHandleクラスはデストラクタでcloseしてエラーチェックしてないよ。
こういう場合はどうするの?
0165デフォルトの名無しさん
2006/07/20(木) 22:14:37それがおかしいだけ
お偉いさんが書くものすべて正しいと思ってるあほは氏ねば?w
0166デフォルトの名無しさん
2006/07/20(木) 22:17:33> どうするの?
どうしたいの?
0167デフォルトの名無しさん
2006/07/20(木) 23:12:450168デフォルトの名無しさん
2006/07/20(木) 23:17:32正しい例など存在しない。
0169デフォルトの名無しさん
2006/07/21(金) 02:18:07デストラクタで資源解放→close等でエラーの可能性がある→デストラクタで例外は禁止→エラーを黙殺するな
で、初心者が困っててもどうすりゃいいのか妥当なサンプルも提示出来ないってことか
154は定法とまで言ってるのにな
0170デフォルトの名無しさん
2006/07/21(金) 02:38:50More Effective C++を久しぶりに読んだが、訳がひどいねえやっぱり・・・
しかし、例え初心者でも、この本は読むべきだろう。コード片を示せとか
言ってる奴がいるが、本で数ページを割いて説明している事を小さな
コード片にまとめるのは至難の業。
0171デフォルトの名無しさん
2006/07/21(金) 03:16:23だから何度も言ってるだろう。
リソースがリークして困るならデストラクタでやるな。
0172デフォルトの名無しさん
2006/07/21(金) 03:17:31何言ってんだ?リソースの解放をデストラクタでやるのは何も問題ないだろ。
0173デフォルトの名無しさん
2006/07/21(金) 03:23:48お前こそなに言ってんだよ。
「リークして困るなら」と言ってるだろうが。
0174デフォルトの名無しさん
2006/07/21(金) 03:27:370175デフォルトの名無しさん
2006/07/21(金) 03:28:03ケースバイケースなのは分かったからサンプルを示してくれって話だろ。
0176デフォルトの名無しさん
2006/07/21(金) 03:32:280177デフォルトの名無しさん
2006/07/21(金) 03:33:070178デフォルトの名無しさん
2006/07/21(金) 03:41:22そうなると、ほかの処理ができなくなるんじゃないのか。
そんなトラップのようなデストラクタを持つクラス、使いたくないな。
自分だけで使うんなら、いいんだろうけどね
0179デフォルトの名無しさん
2006/07/21(金) 03:44:42>>161,163
0180デフォルトの名無しさん
2006/07/21(金) 03:46:25>そもそも誰もデストラクタで例外禁止なのは否定してないし、理由を聞いてるわけでもない。
0181デフォルトの名無しさん
2006/07/21(金) 03:52:32違う。
黙殺していい場合にのみ、デストラクタでリソースの解放をやってもいい、が正解。
0182デフォルトの名無しさん
2006/07/21(金) 07:29:13【 靖国神社とは … ”靖 国 機 関 説” 】
-----------------------------------------------------------------------------------
戦 前 : 官僚が天皇の名を騙り、国民を騙す戦争推進機関として設立。神を捏造。不遜、極まりない。
戦 後 : 官僚の戦争責任を、国民の戦没者追悼の念・祖先尊崇の伝統とすり替え、
数多の戦没者の中に埋没・隠蔽させる官僚のための官僚スキーム。
個人情報保護法が、国家経済破綻の責任者を隠す為の、隠蔽スキームであるのと同じ汚い手口!
-----------------------------------------------------------------------------------
影 響 : 戦後外交の足かせ。中国、朝鮮に付け入られる原因となった。尖閣しかり、竹島しかり!
今 後 : 古臭い靖国モデルは、21世紀日本にとって百害あって一利なし。破壊すべし。ってか、創価・靖国キモイ。
-----------------------------------------------------------------------------------
天皇陛下も国民とともに、官僚とその手先自民党と闘われていた事が判明!
【昭和天皇、A級戦犯合祀に反撃 …宮内庁長官メモ】(読売)
http://www.yomiuri.co.jp/national/news/20060720it06.htm 「親の心、子知らずとはこの事…」
【「増税して下さいと謝るまで削れ」、「病院・幼稚園つぶせ」首相、諮問会議で指示】
http://www.asahi.com/politics/update/0627/014.html
0183デフォルトの名無しさん
2006/07/21(金) 09:14:41代入演算子のオーバーロードを定義するとき、戻り値をクラスの参照にするべきだと
いうことをよく見るのですが、何故でしょうか?
例)
Hoge というクラスがあったとして
Hoge & Hoge::operator=(const Hoge& x)
{
//定義
}
よく見る解説では a=b=cのような処理を実行するために戻り値は参照でなければ
ならないといけないと書いてあります。
でも、以下のように値を返してもa=b=c は可能だと思えます。
Hoge Hoge::operator=(const Hoge& x)
{
//定義
}
戻り値を値にしてしまった場合、a=b=cが不可能となるようなケースってあるのでしょうか?
よろしくお願いします。
0184デフォルトの名無しさん
2006/07/21(金) 09:36:52> a=b=cが不可能となるようなケースってあるのでしょうか?
コピーコンストラクタが宣言だけされて、定義されてない時。
0185デフォルトの名無しさん
2006/07/21(金) 09:57:55Hoge a, b, c;
(a = b) = c;
のように書いた際に、一時生成されたテンポラリオブジェクトにcが代入されて
a == cとならなくなってしまうから、必ず参照を返さなければいけない
0186デフォルトの名無しさん
2006/07/21(金) 13:09:35VC6で、
cout << (int)(18.4*100000) << endl;
と書いたときに、1839999 と表示されるのだが、
何か上手い回避手段は無いものか。
0187デフォルトの名無しさん
2006/07/21(金) 13:12:400188デフォルトの名無しさん
2006/07/21(金) 13:17:05- (int)(18.4*100000)
+ round(18.4*100000)
0189デフォルトの名無しさん
2006/07/21(金) 13:26:54あーなるほど。確かに。
でも、やりたいのは端数切捨て処理だから、やるとすればこうか。
template< typename T > inline T fix( T value ) {
return ( value < 0 ) ? std::floor(value) : std::ceil(value);
}
面倒だけど、これでやってみるよ。
0190デフォルトの名無しさん
2006/07/21(金) 13:34:02あ、ceil と floor 逆だ。
0191190
2006/07/21(金) 13:38:20>>186 の提案もいいが、それだと 18.65 を端数切捨てで 18 と表示したいときに
19 と表示されてしまう。
どうしたもんだろ。
0192デフォルトの名無しさん
2006/07/21(金) 13:45:21これをそれぞれaaとccという行列にコピーしたいと思い,
for(j=0;j<=m-1;j++){
for(k=0;k<=n-1;k++)
aa[j][k] = a[j][k];
cc[j][k] = c[j][k];
}
というプログラムを書いたのですが,
aaの方はちゃんとaの行列になるんですが,
ccの方が計算されずに全ての行列の値が0のままになってしまいます.
aaとccのfor文の計算を分割すればちゃんと計算されるのですが,
なぜこの場合同時にできないのでしょうか?
どのようにすれば解決できるのでしょうか?教えてください.よろしくお願いします.
0193デフォルトの名無しさん
2006/07/21(金) 13:52:45カッコ悪い。
慣れない内はforやifの後を必ず複文化しよう。
0194デフォルトの名無しさん
2006/07/21(金) 13:55:59どこをどう丸めたいのかよく判らんが、sprintf()の"%.2f"で四捨五入して
sprintf()の"%.*s"で切り捨ててから数値化するとかw
まぁ、100倍して整数に四捨五入してから100で割って切り捨ててもいいんでね?
0195デフォルトの名無しさん
2006/07/21(金) 14:24:03若しくは有理数クラスでも使う
0196190
2006/07/21(金) 14:29:18double rhs = strtod( TextBox1.Text().c_str() );
double lhs = strtod( TextBox2.Text().c_str() );
if( ... /* 整数表示フラグ */ )
{
stringstream s;
s << static_cast<int>( rhs * lhs );
TextBox3.Text( s.str() );
}
みたいなプログラムを組んでいて、仕様では
整数表示の際は端数を切り捨てることがきまっています。
>>186 の例のように
TextBox1 に 18.4、
TextBox2 に 100000 が代入された場合、
TextBox3 には 1839999 が表示されてしまうわけです。
両辺を n倍し、nで割る方式では上記問題を防げません。
とりあえず、↓の形で妥協することにしました。
int const n = 6;
sprintf( buf1, "%.*f", n, rhs * lhs );
sprintf( buf2, "%.*s", strlen(buf1)-n+1, buf1 );
TextBox3.Text( buf2 );
0197デフォルトの名無しさん
2006/07/21(金) 14:41:12sprintf(buf, "%.0f", 18.4*100000);
or
std::cout << std::setprecision(0) << std::fixed << 18.4*100000 << std::endl;
0198デフォルトの名無しさん
2006/07/21(金) 15:16:13>>196 に
> 整数表示の際は端数を切り捨てることがきまっています。
と書いてるように、丸めてしまっては意味がありません。
0199デフォルトの名無しさん
2006/07/21(金) 15:22:23こんな間抜けな質問するだけあるな。
0200デフォルトの名無しさん
2006/07/21(金) 16:14:50sprintf()の"%.0f"なら四捨五入ですが何か。
0201デフォルトの名無しさん
2006/07/21(金) 19:02:51Packed BCDとかDecimal Arithmeticのライブラリ使いなよ。
http://www2.hursley.ibm.com/decimal/
0202デフォルトの名無しさん
2006/07/21(金) 22:51:44でなんとかなりそだとおもうんだけど・・・
テストすんのが面毒背
0204デフォルトの名無しさん
2006/07/22(土) 13:22:40あるヘッダファイル内で int hoge=3; と定義し、2つの cpp ファイル (a.cpp、b.cpp) からそのヘッダをインクルードすると、もちろんリンク時にエラーが出ます。
ところが、定義を const int hoge=3; とすると、エラーが出ませんでした。
これは、hoge と言う実体が2つ生成され、a.cpp と b.cpp の hoge はそれぞれ別のものを指していると考えてよろしいのでしょうか?
ということは、スコープをファイル内に限定する static const int hoge=3; と同じ意味になるのでしょうか?
0205デフォルトの名無しさん
2006/07/22(土) 13:54:17(変更可能な左辺値)でしょうか?
0206デフォルトの名無しさん
2006/07/22(土) 13:56:31そんなん試してみりゃすぐわかんじゃん・・・
0207デフォルトの名無しさん
2006/07/22(土) 14:05:06operator=の定義次第です。
0208デフォルトの名無しさん
2006/07/22(土) 14:18:05C++ではconst int は定数扱い。
0209デフォルトの名無しさん
2006/07/22(土) 15:39:18floatでもconstを付けると同じ現象となりますが、これはどう説明する気ですか?
0210デフォルトの名無しさん
2006/07/22(土) 15:58:13constはデフォルトで内部リンケージを持っている。
//file1.c
const int hoge = 3;
//file2.c
const int hoge = 7;
としても文法違反ではなくリンクエラーにはならない。
ということが、ビョーンのバイブルの246ページに書いてある。
0211デフォルトの名無しさん
2006/07/22(土) 15:59:29現象っていうか文法を知らないだけではないかとjvんszぃ;vbds;pzvびsz@あvp
0212デフォルトの名無しさん
2006/07/22(土) 16:03:260213デフォルトの名無しさん
2006/07/22(土) 16:08:42floatはコンパイラベンダのサービスだろw
// integral or enumertion typeのconstはinternal linkage
// 7.1.5.1.2より
0214209に捧ぐ
2006/07/22(土) 16:13:280216デフォルトの名無しさん
2006/07/22(土) 16:46:330217デフォルトの名無しさん
2006/07/22(土) 16:54:30>>210が説明してんだろぼけ
0218デフォルトの名無しさん
2006/07/22(土) 17:16:58未熟な自演はトリップの修正を忘れます。
>>209
>ということは、スコープをファイル内に限定する static const int hoge=3; と同じ意味になるのでしょうか?
>>210が説明しているとおりだが、お前にわかりやすく言えば、次の2つは同じ意味。
const int hoge=3
static const int hoge=3 (規格的に正しいかどうか走らないがVS2005ではとおる)
0219デフォルトの名無しさん
2006/07/22(土) 17:21:29×正しいかどうか走らないが
○正しいかどうかは知らないが
const をa.c b.c 間で共有する場合、これで出来てるようであるが規格上はどうなの?
// a.c
extern const float aa = 10
// b.c
extern const float aa
0220禿@ベル研究所 ◆HsptrkZmYk
2006/07/22(土) 17:24:55externを付けると外部リンケージを持つ
0221デフォルトの名無しさん
2006/07/22(土) 17:37:40うむ
だから
//file1
extern const int hoge = 7;
//file2
extern const int hoge = 8;
はリンクエラーだな
bcc32ではそうだった
ちなみに
//file1
extern const int hoge = 7;
//file2
const int hoge = 8;
も無問題だった
0222デフォルトの名無しさん
2006/07/22(土) 18:29:53これよく解らんのだが、どれが戻り値で、どれがオペレーターなの?
0223デフォルトの名無しさん
2006/07/22(土) 18:38:300224デフォルトの名無しさん
2006/07/22(土) 18:41:04C++は奇奇怪怪だなwww
この書式にすぐにくじけてしまう
0225デフォルトの名無しさん
2006/07/22(土) 18:50:37はゲームを作ることを目的とした参考書じゃなくて普通の参考書を買っ
て勉強したほうがいい?
0226デフォルトの名無しさん
2006/07/22(土) 18:51:32なんて関数があった場合に、
そのOPが定義してあると、
Class class;
C( class ); なんかで変換可能ってこと?
こういうのなんていうの?自動型変換オペレーター?
0227デフォルトの名無しさん
2006/07/22(土) 18:57:240228デフォルトの名無しさん
2006/07/22(土) 19:00:360229デフォルトの名無しさん
2006/07/22(土) 19:05:24ぃぁーC++すごいわー・・・
0230デフォルトの名無しさん
2006/07/22(土) 19:28:41アホハッケーン
0231204
2006/07/22(土) 19:29:00実体が複数作られるのは避けたいため、extern 宣言をしようと思います。
// hoge.h (インクルードガード済み)
extern const int HOGE = 3;
struct HOGESTRUCT {
int array[HOGE];
};
今、このファイルを2つの cpp からインクルードすると、HOGE に関して重複定義のリンクエラーが起きました。
// hoge.h
extern const int HOGE;
のように、ヘッダ内では宣言だけにして、
// a.cpp
const int HOGE = 3;
のように、cpp 内で、HOGE の値を定義したのですが、
hoge.h のHOGESTRUCT の宣言時に HOGE の値が未知なため、array の宣言がうまく行きません。
extern をはずしてしまうと、HOGE の実体が複数作られておいしくありません。
これを解決するには、#define マクロを用いるか、enum ハックを行う、以外に方法はありませんでしょうか?
0232デフォルトの名無しさん
2006/07/22(土) 19:37:55>実体が複数作られるのは避けたいため
なぜ?
そもそもアドレス取らない限りコンパイル時に埋め込まれる。
0233デフォルトの名無しさん
2006/07/22(土) 19:45:29常識的には>>232だが、それ以外でないとどうしてもいやだ、それをやると
明日首をつらなければならないって言うんならそんな奴には#defineがお似合いだ。
0234204,231
2006/07/22(土) 19:57:28深い意味はありませんでした。複数作られることが単に無駄な気がしただけです。
例えば、10KB くらい分の定義が 100 ファイルから読まれると、1MB も無駄に exe が大きくなるんじゃないかなーと。
気にしないことにします。ありがとうございました。
0235デフォルトの名無しさん
2006/07/22(土) 20:00:25>例えば、10KB くらい分の定義が 100 ファイルから読まれると、1MB も無駄に exe が大きくなるんじゃないかなーと。
普通その手のプログラムは実行モジュール自体が数100MBに達するだろうから無駄と言う観点では誤差。
#寧ろ他に減らすべきものがたくさんあるはずだ。
0236デフォルトの名無しさん
2006/07/22(土) 20:02:39extern const int HOGE;
struct HOGESTRUCT {
int array[HOGE];
};
は明らかにコンパイルエラーだろう。extern const int HOGE;は外部変数を
参照するための宣言であって、int array[HOGE];のHOGEの定数値が定義されてない。
// hoge.h (インクルードガード済み)
const int HOGE = 3;
struct HOGESTRUCT {
int array[HOGE];
};
ではだめなの?const int HOGE = 3;は内部リンケージを持つから、複数のcpp
ファイルからインクルードしてもリンクエラーにはならないと思うけど。
認識違いだったらすみません。
0237デフォルトの名無しさん
2006/07/22(土) 20:08:44プギャーm9(ry
0238デフォルトの名無しさん
2006/07/22(土) 20:50:58>232
>そもそもアドレス取らない限りコンパイル時に埋め込まれる。
exeが大きくなることは無いって意味だとおもうが
0239デフォルトの名無しさん
2006/07/22(土) 21:09:04は、アドレスを取らない限りは
#define HOGE 3
とほぼ同じと思って構わない。
C++ では。
0240デフォルトの名無しさん
2006/07/22(土) 21:10:07ってな感じでコマンドラインで渡したパスを開こうとしても開けない
渡しているパスがC:\Programm Files\〜なんだけれども空白が原因?
C:\test.txtは問題なかったし
0241デフォルトの名無しさん
2006/07/22(土) 21:18:39空白で問題が発生するのは考えにくいな。
perror() してみるとなにかわかるかもしれない。
0242デフォルトの名無しさん
2006/07/22(土) 21:32:42結果はNo such file or directory
もちろんパスは実際にあるものを渡してるから無いはずはない
一応短いけどソース出しときます
int main(int argc, char* argv[])
{
//引数チェック
if(argc!=2) return 0;
printf("%s\n",argv[1]);
ifstream inf(argv[1]);
perror("test");
if(!inf)
{/*・・・
0243デフォルトの名無しさん
2006/07/22(土) 21:44:11× Programm Files
○ Program Files
0244デフォルトの名無しさん
2006/07/22(土) 21:46:50引数をダブルコーテーションで囲め
0245デフォルトの名無しさん
2006/07/22(土) 21:50:25本当に>>243が原因なんじゃないだろうか
0246デフォルトの名無しさん
2006/07/22(土) 22:15:55ごめんProgrammは素で間違えた
けれど引数の方はちゃんとProgramで渡してるから問題ない
ダブルクォーテーションもつけてて下の状態でも通らない
"C:\Program Files\JaneDoeView\Logs\Logs\2ch\PC等\プログラム\1048668198.dat"
0247デフォルトの名無しさん
2006/07/22(土) 22:18:52いやその場合プログラム側でダブルクォーテーションを削除してからifstreamに渡さなければならない
0248デフォルトの名無しさん
2006/07/22(土) 22:19:14いいえ全然違います
0249デフォルトの名無しさん
2006/07/22(土) 22:22:54× C:\Program Files\JaneDoeView\Logs\Logs\2ch\PC等\プログラム\1048668198.dat
○ C:\Program Files\JaneDoeView\Logs\2ch\PC等\プログラム\1048668198.dat
0250デフォルトの名無しさん
2006/07/22(土) 22:25:52渡されたコマンドライン引数argv[1]をprintfで直接表示しても""はついてないから
それではないと思う
>>249
自分のだとlogs\logsの下にログがある
Jane入れたときに自分で設定を弄った
0251デフォルトの名無しさん
2006/07/22(土) 22:26:53とんでもない嘘つくなよw
>>250
cmd.exeにargv[1]のファイルをD&Dして実行してみろ
0252デフォルトの名無しさん
2006/07/22(土) 22:33:56C:\〜〜>"プログラム本体" "目的のdat"
やってみてもファイルオープンで躓く
fstreamに必要な設定とかあるの?
0253デフォルトの名無しさん
2006/07/22(土) 22:35:42ifstream inf("C:\Program Files\JaneDoeView\Logs\Logs\2ch\PC等\プログラム\1048668198.dat");
0254デフォルトの名無しさん
2006/07/22(土) 22:37:020255デフォルトの名無しさん
2006/07/22(土) 22:38:220256デフォルトの名無しさん
2006/07/22(土) 22:38:540257デフォルトの名無しさん
2006/07/22(土) 22:39:37\\
0258デフォルトの名無しさん
2006/07/22(土) 22:44:44ifstream inf("C:\\Program Files\\JaneDoeView\\Logs\\Logs\\2ch\\PC等\\プログラム\\1048668198.dat");
としてやってみてもNo such file or directoryで駄目だった
0259デフォルトの名無しさん
2006/07/22(土) 22:48:32とかいうファイルを作って開いてみようとは思わんのか
0260デフォルトの名無しさん
2006/07/22(土) 22:50:070261デフォルトの名無しさん
2006/07/22(土) 22:51:170262デフォルトの名無しさん
2006/07/22(土) 23:00:31メモ帳では開いた
>>261
タダで配布されてたVisualC++2005Expressつかってる
>>259
何故か思いつきもしなかった
"C:\\a s\\a s t\\a a.txt"でやってみたところどうしたわけか開いた
よく分からなかったんでレスつけられなかったけど>>254辺りが怪しいかもしれない
あまり長居すると悪いんであとは自分で調べてみる
ありがとう
0263デフォルトの名無しさん
2006/07/22(土) 23:03:42JaneDoeにファイルへの排他的アクセス権を奪われているとか。
0264デフォルトの名無しさん
2006/07/22(土) 23:13:49http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=243152&SiteID=7
これだな。
0265デフォルトの名無しさん
2006/07/22(土) 23:55:10用意されていないのでしょうか?
0266デフォルトの名無しさん
2006/07/23(日) 00:01:12/dev/null はあるんでない nul
0267デフォルトの名無しさん
2006/07/23(日) 00:03:45標準には無いね。 fstream で代用すれば?
0268デフォルトの名無しさん
2006/07/23(日) 00:09:190269デフォルトの名無しさん
2006/07/23(日) 00:15:050270デフォルトの名無しさん
2006/07/23(日) 00:30:32unsigned char *p = static_cast< unsigned char* >( c );
がエラーになるんですけど何ででしょうか?
VS.net2003です。
0271269
2006/07/23(日) 00:31:23char *p
じゃなくて
char *c
です
0272デフォルトの名無しさん
2006/07/23(日) 00:32:15cがどこから来たか意味不明とか。
char*pとunsigned char*pで変数名の重複とか。
エラーメッセージ位かけよボケとか。
総じて意味不明
0273デフォルトの名無しさん
2006/07/23(日) 00:35:15char*からunsigned char*への暗黙の型変換ができないから。
0274デフォルトの名無しさん
2006/07/23(日) 00:35:30なんでエラーにならないと思うの?
0275デフォルトの名無しさん
2006/07/23(日) 00:37:07ちゃんとエラーの内容を書こうよ。答えがそのまま出てるから(笑
>test2.cpp(15) : error C2440: 'static_cast' : 'char *' から 'unsigned char *' に
>変換できません。
> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キ
>ャストまたは関数スタイルのキャストが必要です。
0276デフォルトの名無しさん
2006/07/23(日) 00:37:59{
foo(); // 例外を投げるかもしれない関数
}
もしfoo()が例外を投げた場合の挙動は、どのように規定されているのでしょうか?
0277デフォルトの名無しさん
2006/07/23(日) 00:47:47std::unexpected() が実行され、デフォルトでは terminate() に逝く。
0278デフォルトの名無しさん
2006/07/23(日) 16:26:400279デフォルトの名無しさん
2006/07/23(日) 16:57:000280デフォルトの名無しさん
2006/07/23(日) 17:09:30virtual メソッドではありません。派生クラスのなかから
基底クラスのメソッドを明示的に示して呼び出したいのですが
どのようにすればよいのでしょうか?
Java の super のようなキーワードに相当することを
やりたいと思っています。
0281デフォルトの名無しさん
2006/07/23(日) 17:14:500282デフォルトの名無しさん
2006/07/23(日) 17:22:02なるほど、C++ では多重継承が許されているため
super というような記述は用意されていないのですね。
0283デフォルトの名無しさん
2006/07/23(日) 17:32:56「自分でtypedefすればできる、だからこんなことでC++を肥大化させることないだろ」
ということになって、規格から外されたそうだ。
class foreman : public employee {
typedef empolyee inherited;
// ...
void print();
};
class manager : public foreman {
typedef foreman inherited;
// ...
void print();
};
void managaer::print()
{
inherited::print();
// ...
}
0284デフォルトの名無しさん
2006/07/23(日) 17:41:41はいはい、設計と進化最近よんだんでちゅね。
披露ご苦労さん。
0285デフォルトの名無しさん
2006/07/23(日) 17:43:350286デフォルトの名無しさん
2006/07/23(日) 17:58:480287デフォルトの名無しさん
2006/07/23(日) 18:03:160288デフォルトの名無しさん
2006/07/23(日) 18:08:36>>283は知らなかったから今回はグッジョブと言いたい
0289デフォルトの名無しさん
2006/07/23(日) 18:09:37usingした方がいいような気がする
0290デフォルトの名無しさん
2006/07/23(日) 18:35:030291デフォルトの名無しさん
2006/07/23(日) 20:04:36IBMのOCLががんがん使ってたな。
0292デフォルトの名無しさん
2006/07/23(日) 20:07:500293デフォルトの名無しさん
2006/07/23(日) 22:16:30いや、試したがだめだな
0294デフォルトの名無しさん
2006/07/23(日) 23:50:09どうダメだったの?
0295デフォルトの名無しさん
2006/07/24(月) 00:08:31vcはthrow指定しても普通にcatchに飛んで続行したよ
0296デフォルトの名無しさん
2006/07/24(月) 00:16:010297デフォルトの名無しさん
2006/07/24(月) 00:23:440298デフォルトの名無しさん
2006/07/24(月) 00:32:24ただ、C++の例外指定はもう仕様に難があると思うし、きちんと
使ってる人もそんなにいるとも思えないしどうでもいいのかもね。
0299デフォルトの名無しさん
2006/07/24(月) 00:40:28個人的にはいっそのこと廃止して欲しい。
そしたら throw を心置きなくマクロで弄れる。
(例外の発生箇所の__FILE__と__LINE__をログに吐ける。)
0300デフォルトの名無しさん
2006/07/24(月) 00:48:08予約語をマクロで弄るのはヨクナイコトデスヨー
0301デフォルトの名無しさん
2006/07/24(月) 00:53:54アドレスわかれば、どこか特定できるでしょ
0302デフォルトの名無しさん
2006/07/24(月) 01:12:16そこが悩みの種
>>301
見ただけで分かる>>>>(越えられない壁)>>>>調べれば分かる
0303デフォルトの名無しさん
2006/07/24(月) 01:54:48でいいんじゃないの?
throw そのままマクロにしなくても。
0304デフォルトの名無しさん
2006/07/24(月) 02:00:30やっぱ、やるならそっちかなぁ。
ソース見てて頻繁に出現する俺マクロってなんかやなんだけどなぁ。
でも、他人の目から見てもコッソリ予約語が置換されるよりは
俺マクロが頻繁に出現するほうがまだましか。
0305デフォルトの名無しさん
2006/07/24(月) 02:14:56うーん、俺も予約語がマクロで見えなくなるのはやだから結局
throw MyException(MY_EXCEPTION_INFO);
みたいな感じにしてるなあ。
ただ、やっぱスタックトレースで取れないとそこだけ情報取れても
役に立つことがあまりないかなあ。。
某ゲームのコードで全関数の最初と終わりにguard/unguardみたいに
仕込んでるのあったけど、あれもあれでちょっと問題あるし。
例外周りは悩みが尽きない。
0306デフォルトの名無しさん
2006/07/24(月) 15:41:47「Containerに入れるには」、Assignableじゃないといけない。23.1.3
Assignableであるには、返り値の型は参照でないといけない。23.1.4
0307デフォルトの名無しさん
2006/07/24(月) 20:01:53Person* pp = makePerson(...);
// ppを使う
delete pp;
これは、makePersonにnewしてもらう一方で、呼出し側がdeleteする責任を負うので、
31項の教え「関数は、(中略)関数の中でnewで初期化したポインタの参照先を返してはならない」
に反する気がして、気になっています。
・deleteの手間がかかるので、オブジェクトをnewして返すのは原則ダメ
・でもファクトリ関数として使うなら、やや危険だが便利なので気をつけて使え
という解釈でいいのでしょうか?
0308デフォルトの名無しさん
2006/07/24(月) 21:43:380309デフォルトの名無しさん
2006/07/24(月) 21:50:44EffectiveC++の3版を読むといいと思うよ
0310デフォルトの名無しさん
2006/07/24(月) 22:10:53参照返してないじゃん。
というか、
> ポインタの参照先を返
誤訳?
0311デフォルトの名無しさん
2006/07/24(月) 23:25:380312デフォルトの名無しさん
2006/07/25(火) 01:03:22コードしか見たことがない俺ガイル
0313デフォルトの名無しさん
2006/07/25(火) 01:11:31五指に入るくらい最悪なコードだった。
0314デフォルトの名無しさん
2006/07/25(火) 01:20:56俺もそんな使い方しかしていない。
下手したらcatchはmainの中だけ。
0315デフォルトの名無しさん
2006/07/25(火) 01:21:52インターフェースと実装を分けるべく、以下のようにしてみました。
趣旨は具体的に使用するコンテナを隠すことなのですが、
なんとなく※1の部分が気持ち悪いのです。
気持ち悪いという感覚は捨てていいのでしょうか?それともまずい設計でしょうか?
ヘッダー
class hoge {
template <typename C> // Cはコンテナ型
class iterator_gen : public C::iterator { 適当な定義 };
class container;
typedef iterator_gen<container> iterator;
virtual iterator begin(void) = 0;
virtual iterator end(void) = 0;
};
実装
class hoge_impl {
class container : public vector<int> { 中身なし }; // ※1
iterator begin(void) { return m_cnt.begin(); }
iterator end(void) { return m_cnt.end(); }
private:
container m_cnt;
};
0316デフォルトの名無しさん
2006/07/25(火) 03:29:38コンパイルできるんなら、いいんじゃない?
きっと iterator_gen の「適当な定義」が魔法みたいなコードなんだろう。
0317315
2006/07/25(火) 03:47:41どうも。
コンパイルできるという方針のみに従えば、大抵のコードはOKになってしまうと思います…。
他にこういうことしたことある人いないかなと。もしいなければなぜかなと。
> きっと iterator_gen の「適当な定義」が魔法みたいなコードなんだろう。
iterator_genはそんなに突飛なものではなくて、
↓みたいな適当なコンストラクタの定義と
typedef typename C::iterator base;
iterator(void) : base() {}
iterator(base_t i_) : base(i_) {}
あとはdereferenceやincrement演算を若干変更しているだけです。
0318デフォルトの名無しさん
2006/07/25(火) 04:21:54それ、
hoge::iterator i;
って変数定義しようとしたら C::iterator の定義が要るだろ。
hoge_impl::container の定義が見えてるところじゃないと
コンパイルできないはずだが、それでいいの?
0319315
2006/07/25(火) 05:00:54>>318さんの仰るとおりです。
実装部分だけテストしていてスルーしてました。
通りませんね。
// ヘッダー(hoge.h)
class hoge {
public:
template <typename C>
struct iterator_gen : public C::iterator {
typedef typename C::iterator base;
iterator_gen(void) : base() {}
iterator_gen(base i_) : base(i_) {}
};
class container;
typedef iterator_gen<container> iterator;
virtual iterator func(void) = 0;
static hoge* create(void);
};
// 実装(hoge_impl.cpp)
#include <vector>
#include "hoge.h"
class hoge::container : public std::vector<int> {};
class hoge_impl : public hoge {
public:
iterator func(void) { return m_cnt.begin(); }
std::vector<int> m_cnt;
};
hoge* hoge::create(void) { return new hoge_impl; }
0320315
2006/07/25(火) 05:02:20// サンプル
#include "hoge.h"
int main(void) {
hoge* p = hoge::create();
hoge::iterator i = p->func(); // ★当然通らない…★
return 0;
}
0321315
2006/07/25(火) 05:06:18ところでコンテナを実装に隠しながらイテレータを返すインターフェースを
実現する方法ってないもんでしょうか…。
0322デフォルトの名無しさん
2006/07/25(火) 05:16:08仮想関数(みたいなの)使ったイテレータを自前で定義するしか無さそうだね。
一般的な設計の話にすれば、イテレータを使うような操作を
コンテナを持つクラスのメンバ関数にすることを先に検討するべき。
イテレータで可能な操作のすべてが必要なケースなんてあんまり無い。
0323315
2006/07/25(火) 06:14:33class iterator {
public:
インターフェースいろいろ
private:
class iterator_impl;
iterator_impl* m_impl;
};
class iterator::iterator_impl : public 任意のコンテナ::iterator {
実装いろいろ
};
みたいにするのが楽なのかなぁ。
> イテレータを使うような操作をコンテナを持つクラスのメンバ関数にすることを先に検討するべき。
なるほど。なんとなく理解できます。
でも今回はコンテナを内部に複数持つクラスを柔軟にSTLのアルゴリズム等に渡したいなぁと。
たとえば
int xsum = std::accumulate(p->xbegin(),p->xend());
int ysum = std::accumulate(p->ybegin(),p->yend());
int zsum = std::accumulate(p->zbegin(),p->zend());
みたいに。
0324デフォルトの名無しさん
2006/07/25(火) 08:26:44private継承して、メンバー関数を全部baseのメンバー関数を呼び出すように
オーバーライドすることだろうけど、それでも百万年早そうだからあきらめろ。
0325307
2006/07/25(火) 11:06:57>>308
すみません、ちょっとよくわからないのですが、
「本当はいけないコーディングだけど、簡単にファクトリ関数を説明するためにそう書いた」
という意味でしょうか?
>>309
確かに私のは第2版でした。書き忘れてすみません。
今度本屋に行って読んでみます
0326デフォルトの名無しさん
2006/07/25(火) 11:08:200327デフォルトの名無しさん
2006/07/25(火) 11:21:42百万年早いなんて陳腐な表現平気で使うし
オマケに日本語間違ってるし
0328デフォルトの名無しさん
2006/07/25(火) 11:47:54> でも今回はコンテナを内部に複数持つクラスを柔軟にSTLのアルゴリズム等に渡したいなぁと。
> たとえば
挙げられた例に説得力が無いな。
hoge に virtual int xsum() const; とか用意しろよ、と思ってしまう。
まぁうまく書き表せなかっただけなんだろうけど。
0329デフォルトの名無しさん
2006/07/25(火) 13:58:38319がやろうとしている実装の分離とは相性が悪いから、
どこかで無理が出てきたり気持ち悪くなってくるのは仕方がない。
こういうときにboost::functionのイテレータ版があればいいなとは思う。
それがあったとしても、その実装は結局322が言っていることと同じことになるはずなんだけどね。
0330デフォルトの名無しさん
2006/07/25(火) 14:02:260331デフォルトの名無しさん
2006/07/25(火) 14:05:35iterator_facadeで一挙解決!
0332315
2006/07/25(火) 16:04:01結局全部(機械的に)書くことになるわけですね。
>>329
> そもそもSTLのようなテンプレートをふんだんに使うコードと、
> 319がやろうとしている実装の分離とは相性が悪いから、
それを痛感してます('A`)
インターフェイスとなる基本クラスXと実装X_impl、
Xの宣言をincludeしたテンプレートクラスX_tmpl(実装の大部分はX_implを流用)、
という構成を目指していたのですが、難しいです。
>>328
>挙げられた例に説得力が無いな。
はい…すみません。コンテナの中身はそれぞれ独自メソッドを持った自前クラスで、
シーケンシャルにコンテナ要素に対して特定の操作を行いたい、
かつその操作の種類を今後どんどん増やすという状況です。
0333デフォルトの名無しさん
2006/07/25(火) 16:07:40隠したいところだけprivateで宣言しとけば?
けどalgorithmを適用する時に面倒なことが起きがち。
特に名前ルックアップで
0334デフォルトの名無しさん
2006/07/25(火) 17:13:06iterator のレベルの操作で実装を完全に隠蔽しようと(型を消そうと)すると,
たいていの場合効率の面で許容できない実装になるような気がします.
(例えば,ポインタのインクリメント1つに関数呼び出しが常に生じる)
それでも構わないというなら一応できなくはないと思います.
value_type (reference) の型情報はインタフェースの型安全性を支配するので
この型情報は消せないですが,それ以外の型を消去した
実行時多相のイテレータクラスは作成できるかと思います.
template< class Reference >
class any_iterator
{
......
};
などのような形で, Reference 型が一致する全てのイテレータ型を run-time で
多相的に扱えるようなイテレータクラスを作成できるかと思います.実装技術的には
広く Boost で使用されている Type Erasure という技術でできると思います.
ただ1点だけ難儀があるとすれば, operator==, operator!= などの2項の比較関数において,
異なるイテレータ型の間での inter-operability が存在するので,
厳密にこれ対処しようとすると run-time double dispatch をエミュレートしないといけない,
という問題はあるかと思います.
0335デフォルトの名無しさん
2006/07/25(火) 18:43:08>>332
>結局全部(機械的に)書くことになるわけですね。
使うやつだけusingすれば?
iteratorはbaseのやつをtypedefでぱくっちゃうとか
0336315
2006/07/25(火) 21:48:44いずれにせよヘッダー内にコンテナが「見える」わけですね??
いえ…全然まずくないのですが。
>>334
> たいていの場合効率の面で許容できない実装になるような気がします.
そうですね…。仮想関数にせよハンドルを使うにせよ、
間接アクセスのコストがちょっと想像できません。
でも、なんとなくコンテナ要素に対する操作がボトルネックになりそうなので、
イテレートのオーバーヘッドは無視してもよさそうな気もしてます。
(そのおかげで気持ちよい実装になるならば、ですが)
Type Erasureもdouble dispatchも初見でした…。
Type Erasureというのはpimplをテンプレート化したみたいなものでしょうか。
double dispatchは相方の型がわからなくても、相方の仮想関数を使って
自分と比較すればOKということですね。スゴイですね…。
…あんまり頑張らなくていい気がしてきました(´・з・`)
>>335
そうする場合にはそういうことも含めていろいろありだと思います。
どうもでした!
0337デフォルトの名無しさん
2006/07/25(火) 23:50:570338デフォルトの名無しさん
2006/07/26(水) 18:05:05iterator_facadeで一挙解決!
0339315
2006/07/27(木) 09:45:25ちょろりと見た感じ「機械的に書く」ことを勝手にやってくれると理解しましたが…。
つまり表面を用意してはくれるけれど、中身(ポインタとか)はこちらで決めてくださいよと。
その中身に例えばコンテナのイテレータを使うとすれば、
結局コンテナが見えちゃうわけですよね。
うーん、何か勘違いしている気もしつつ…
0340デフォルトの名無しさん
2006/07/27(木) 17:17:35type erasureやpimplを使う時でも有効だと思います。
0341デフォルトの名無しさん
2006/07/27(木) 19:21:41いまはVisualCでコンパイルしてるんですが、Linuxの環境でコンパイルすれば
Linux用のソフトになるんですか?
0342デフォルトの名無しさん
2006/07/27(木) 19:36:17互換性を意識して注意深くコーディングすれば可能。
hello world くらいなら全然OK。
0343デフォルトの名無しさん
2006/07/27(木) 21:26:14void hoge(void* buf,size_t& written_size)
vector<char> v;
size_t written_size;
v.resize(500);//500はAPI hogeが書き込む可能性のある最大の長さ
hoge(&v[0],&written_size);
このままだとvは自分の長さを知らないため、
v.resize(written_size);
としているんですが、最後のresize()で
内部のバッファのアドレスが変わってしまう可能性はあるんでしょうか
hogeが内部でバッファのアドレスを保持して使うので、
アドレスが変わってしまうとヤバスです
今のところ無事に動いてるのですが・・・
最後のresizeで前の状態より長さが大きくなる事はないので
大丈夫かとは思うんですが 実装によりけり?
0344デフォルトの名無しさん
2006/07/27(木) 21:43:28ヤバい予感。少なくとも標準では保証外。
§23.2.4.6
void resize(size_type sz, T c = T());
6 Effects:
if (sz > size())
insert(end(), sz-size(), c);
else if (sz < size())
erase(begin()+sz, end());
else
; //do nothing
§23.2.4.3.2
iterator erase(iterator position);
iterator erase(iterator first, iterator last);
3 Effects: Invalidates all the iterators and references after the point of the erase.
4 Complexity: The destructor of T is called the number of times equal to the number of the elements erased,
but the assignment operator of T is called the number of times equal to the number of elements in the
vector after the erased elements.
5 Throws: Nothing unless an exception is thrown by the copy constructor or assignment operator of T.
0345デフォルトの名無しさん
2006/07/27(木) 22:18:550346デフォルトの名無しさん
2006/07/27(木) 22:26:19やはりですか。
eraseの呼び出しでポインタが無効化してしまう可能性があるという事すね
>>345
hoge関数は説明のために簡略化してますが、
hoge関数は内部で渡されたbufのアドレスを保持して、
後々別の関数で使ったりしているのです
素直にchar配列を使うべきかな・・・
0347デフォルトの名無しさん
2006/07/27(木) 22:56:18つーか、なぜにresize()が必要なんだ?
仮想的なend()が欲しければ、v.begin() + written_sizeをv.end()の代わりに使えばいい。
v.size()が必要なら、writen_sizeを覚えておく……これは確かにあれか……。
0348デフォルトの名無しさん
2006/07/27(木) 23:02:240349デフォルトの名無しさん
2006/07/27(木) 23:38:360350デフォルトの名無しさん
2006/07/28(金) 00:22:340351デフォルトの名無しさん
2006/07/28(金) 00:28:31> 3 Effects: Invalidates all the iterators and references after the point of the erase.
"after the point of the erase" ってことは、削除した場所より前は
大丈夫なんじゃないの?
0352351
2006/07/28(金) 00:37:15http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#414
やっぱり削除した場所より前は大丈夫。
ってことで >>343 も大丈夫。
0353デフォルトの名無しさん
2006/07/28(金) 10:19:14ありがとうございました。
Linuxにも興味があるので。
0354デフォルトの名無しさん
2006/07/29(土) 12:32:52に載ってるようにbcc32 -w-8057 -eRelease\win01.exe win01.cpp
でやっても
Error: 外部シンボル '_main' が未解決(C:\BORLAND\BCC55\LIB\C0X32.OBJ が参照)
と出るんですが何処がおかしいんでしょうか
0355デフォルトの名無しさん
2006/07/29(土) 12:38:150356デフォルトの名無しさん
2006/07/29(土) 12:48:010357デフォルトの名無しさん
2006/07/29(土) 12:52:130358デフォルトの名無しさん
2006/07/29(土) 12:58:140359デフォルトの名無しさん
2006/07/29(土) 13:03:38あっできた・・・・どうもありがとうございます
0360デフォルトの名無しさん
2006/07/29(土) 16:40:28使い物にならなくなりそうだ。。
試してみたが、string::iteratorと生ポインタでは10倍くらい
速度が違うよ。
0361デフォルトの名無しさん
2006/07/29(土) 17:19:330362デフォルトの名無しさん
2006/07/29(土) 17:29:09ゆとり世代にはよくあること。
0363デフォルトの名無しさん
2006/07/29(土) 17:29:530364デフォルトの名無しさん
2006/07/29(土) 17:33:34なんのためのマルチパラダイム言語なのかと
0365デフォルトの名無しさん
2006/07/29(土) 17:51:19ま、そうだね。ディスクアクセスしてるときはiteratorが遅いなんて
計算量のオーダーが違うから問題にならないし。
ただ、もっとも下位のアルゴリズムライブラリはあらゆる使われ方を
想定して高速である義務があると思う。
0366デフォルトの名無しさん
2006/07/29(土) 17:56:270367デフォルトの名無しさん
2006/07/29(土) 18:13:170368デフォルトの名無しさん
2006/07/29(土) 18:14:35最適化かけたか?
0369デフォルトの名無しさん
2006/07/29(土) 18:17:060370デフォルトの名無しさん
2006/07/29(土) 18:44:44かけたよ。でも、書き方によっては最適化されて消えてしまう場合も
あるから難しいね。パフォーマンス測定のいい書き方あったら教えてくれ。
>366,369
あれ?なんか否定的?基礎ライブラリは速いほうがいいよねという普通の
ことを言っただけのつもりだったが・・
0371デフォルトの名無しさん
2006/07/29(土) 19:14:07for(int j = 0; j < size; ++j){
と
for(ite = s.begin(); ite != s.end(); ++ite){
これは結構差が出る。
operator++が動いてendでコピーコンストラクタが動いて・・だから
0372デフォルトの名無しさん
2006/07/29(土) 19:34:350373デフォルトの名無しさん
2006/07/29(土) 19:42:21ite pos = s.begin();
ite end = s.end();
for(; pos!=end; ++pos) {
0374デフォルトの名無しさん
2006/07/29(土) 20:14:020375デフォルトの名無しさん
2006/07/29(土) 20:23:54for(int j = 0; j < size; ++j){
毎秒100回とかの処理(ディスクに書き込みとか)
}
for(ite = s.begin(); ite != s.end(); ++ite){
毎秒100回とかの処理(ディスクに書き込みとか)
}
とかは毎秒100回のオーダーが効いてくるからiteratorの遅さは
出てこない、というようなことを言いたかったのだが。
>>374
少なくともVCのstlは普通にoperator++が動いてendでコピー
コンストラクタが動くよ。xstringのソース見るとわかるけど普通に書いてる。
0376デフォルトの名無しさん
2006/07/29(土) 20:28:460377デフォルトの名無しさん
2006/07/29(土) 21:07:51for (std::vector<int>::const_iterator it = v.begin(); it != v.end(); ++it) {
sum += * it;
}
くらいなら
for (int ic = 0; ic < end; ++ic) {
sum += a[ic];
}
と同じ程度のコードを吐くコンパイラくらいいくらでもあるだろ。
0378デフォルトの名無しさん
2006/07/29(土) 21:25:210379デフォルトの名無しさん
2006/07/29(土) 21:31:16決定できるのがC++の魅力だと思います先生
0380デフォルトの名無しさん
2006/07/29(土) 22:03:32>xstringのソース見るとわかるけど普通に書いてる。
なんだこいつ初心者か。「普通に書いてる」からなんだよバカが。
たとえソースコード上に書いてあったとしても、
最適化により、書いて無いのと同じ速度で動く可能性も知らんのか。
事実、以下のコードはまったく同じ速度で動いてる。vcでな。
まず最適化の掛け方勉強しとけ。
#include <string>
#include <numeric>
void test(){
std::string str="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
int n = 10000000;
{
boost::timer t;
int sum = 0;
for(int i=0; i<n; ++i){
sum = std::accumulate(str.begin(), str.end(), sum);
}
printf("%d %g\n", sum, t.elapsed());
}
{
boost::timer t;
int sum = 0;
for(int i=0; i<n; ++i){
sum = std::accumulate(str.c_str(), str.c_str()+str.size(), sum);
}
printf("%d %g\n", sum, t.elapsed());
}
}
0381デフォルトの名無しさん
2006/07/29(土) 22:32:470382デフォルトの名無しさん
2006/07/29(土) 22:34:090383デフォルトの名無しさん
2006/07/29(土) 22:40:350384デフォルトの名無しさん
2006/07/29(土) 22:49:05accumulateは
_Ty accumulate(_InIt _First, _InIt _Last, _Ty _Val)
{// return sum of _Val and all in [_First, _Last)
for (; _First != _Last; ++_First)
_Val = _Val + *_First;
return (_Val);
}
なので、380のコードはiteratorと生ポインタの比較にはなってないよ。
0385デフォルトの名無しさん
2006/07/29(土) 22:51:22「呼吸するようにboost使っててかっこいいですね」
とでも褒めておいて放置しとけ
0386デフォルトの名無しさん
2006/07/29(土) 22:56:37は?どう見てもiteratorと生ポインタの比較になってるけど。
_InItの型が何になるか分からないの?
>>385
使えない劣等感を感じるぐらいなら勉強しろよ。
0387デフォルトの名無しさん
2006/07/29(土) 22:59:48へ?
0388デフォルトの名無しさん
2006/07/29(土) 23:01:39そりゃ生ポインタに比べれば遅いんだろうけど
0389デフォルトの名無しさん
2006/07/29(土) 23:03:010390388
2006/07/29(土) 23:10:44ポインタに比べどういうオーバヘッドが生じるのかなと
0391デフォルトの名無しさん
2006/07/29(土) 23:27:58最適か考えないんなら、ソース見ればわかるだろ。意味があるとは思わんが。
0392デフォルトの名無しさん
2006/07/29(土) 23:29:58場合に差がでるんじゃね?
そっちでもっかいやってよ >> 380
0393デフォルトの名無しさん
2006/07/29(土) 23:30:510394デフォルトの名無しさん
2006/07/29(土) 23:33:15自分でやれ
0395デフォルトの名無しさん
2006/07/29(土) 23:36:340396デフォルトの名無しさん
2006/07/29(土) 23:59:010397デフォルトの名無しさん
2006/07/30(日) 00:41:550398デフォルトの名無しさん
2006/07/30(日) 01:24:01#include <string>
#include <windows.h>
using namespace std;
int main(){
strings;
string::iterator ite;
const int count = 1000000;
const int size = 1000;
DWORD start;
int found = 0;
for(int i = 0; i < size; ++i){
s += "a";
}
// iterator書き込み
start = GetTickCount();
for(int i = 0; i < count; ++i){
for(ite = s.begin(); ite != s.end(); ++ite){
*ite = 0;
}
}
printf("iterator書き込み msec=%d\n", GetTickCount() - start);
0399デフォルトの名無しさん
2006/07/30(日) 01:25:10// iterator検索
s[size - 1] = 'b';
found = 0;
start = GetTickCount();
for(int i = 0; i < count; ++i){
for(ite = s.begin(); ite != s.end(); ++ite){
if(*ite == 'b'){
++found;
break;
}
}
}
printf("iterator検索 msec=%d, count=%d\n", GetTickCount() - start, found);
// ポインタ書き込み
char p[size];
start = GetTickCount();
for(int i = 0; i < count; ++i){
for(int j = 0; j < size; ++j){
p[j] = 'a';
}
}
printf("ポインタ書き込み msec=%d\n", GetTickCount() - start);
0400デフォルトの名無しさん
2006/07/30(日) 01:26:24// ポインタ検索
p[size - 1] = 'b';
found = 0;
start = GetTickCount();
for(int i = 0; i < count; ++i){
for(int j = 0; j < size; ++j){
if(p[j] == 'b'){
++found;
break;
}
}
}
printf("ポインタ検索 msec=%d, count=%d\n", GetTickCount() - start, found);
}
0401デフォルトの名無しさん
2006/07/30(日) 01:27:590402デフォルトの名無しさん
2006/07/30(日) 01:30:16iterator書き込み msec=3594
iterator検索 msec=4203
ポインタ書き込み msec=94
ポインタ検索 msec=1891
微妙にポインタの方が速いのかな。
あれ、でもポインタ書き込みは速すぎだな、最適化で飛ばされちゃったかな。
まあなんにしてもそれほど差はないのかな。
0403デフォルトの名無しさん
2006/07/30(日) 01:35:350404デフォルトの名無しさん
2006/07/30(日) 01:36:500405デフォルトの名無しさん
2006/07/30(日) 01:41:36ぼくはやだもんねーだ
0406デフォルトの名無しさん
2006/07/30(日) 01:45:190407デフォルトの名無しさん
2006/07/30(日) 01:46:160408デフォルトの名無しさん
2006/07/30(日) 03:42:07なぜ外で宣言する?
フツーこうだろ?
for(ite i = s.begin(), end = s.end(); i != end; ++i) {
0409デフォルトの名無しさん
2006/07/30(日) 04:36:180410デフォルトの名無しさん
2006/07/30(日) 05:33:29>>377
0411デフォルトの名無しさん
2006/07/30(日) 06:30:040412デフォルトの名無しさん
2006/07/30(日) 07:46:54iteratorはちょーはえーが生ポインタと比べるともしかしたらちょっと
くらい遅いかもねくらいでもういいよ。それ以上誰も証明できねーし。
0413デフォルトの名無しさん
2006/07/30(日) 08:12:02ちゃんとコンパイルできるんやし。
0414デフォルトの名無しさん
2006/07/30(日) 08:47:100415デフォルトの名無しさん
2006/07/30(日) 08:53:110416デフォルトの名無しさん
2006/07/30(日) 12:42:130417デフォルトの名無しさん
2006/07/30(日) 14:32:34なんでend()を終了判定のたびにコンストラクトしているんだ?
end()はconstじゃないぞ?
0418デフォルトの名無しさん
2006/07/30(日) 14:45:220419デフォルトの名無しさん
2006/07/31(月) 09:14:24保守性を重視したい奴はそうしろ。
ただし、富豪主義なんてプログラマの泣き言でしかないのを忘れるな。
0420デフォルトの名無しさん
2006/07/31(月) 09:44:310421デフォルトの名無しさん
2006/07/31(月) 11:19:41一時期流行ったし、個人を特定するほど出はないと思うがなあ
0422デフォルトの名無しさん
2006/07/31(月) 14:50:40ただ、
for (ite = s.begin(); ite != s.end(); ++ite){
for (ite = s.begin(), end = s.end(); ite != end; ++ite){
は30%くらい差が出た。
アセンブリ見たら下の方がいいコードが吐かれたわ
この程度最適化されると思ったが
0423デフォルトの名無しさん
2006/07/31(月) 14:55:27つか、上と下じゃ意味が違うし。
0424デフォルトの名無しさん
2006/07/31(月) 15:01:46それじゃ、end()の値が変動する可能性のあるコンテナには下の書き方は
使えないじゃん。
0425デフォルトの名無しさん
2006/07/31(月) 15:29:37そういうことはコンパイラのバージョンと指定したオプションを明示した上で言ってくれ。
0426デフォルトの名無しさん
2006/07/31(月) 15:45:08オプションは/O2だけでいいな
0427デフォルトの名無しさん
2006/07/31(月) 16:17:14何を当たり前の事を言ってるのだろうか。
0428デフォルトの名無しさん
2006/07/31(月) 16:24:05いや、お前が低脳そうに見えたんで、一応書いておいたんだけどな。
0429デフォルトの名無しさん
2006/07/31(月) 16:43:350430デフォルトの名無しさん
2006/07/31(月) 17:53:20環境も明示せずに。
0431デフォルトの名無しさん
2006/07/31(月) 18:55:360432デフォルトの名無しさん
2006/07/31(月) 18:56:45もしかしてホンキでそれを言ってるのか…?
0433デフォルトの名無しさん
2006/07/31(月) 19:03:150434デフォルトの名無しさん
2006/07/31(月) 19:06:240435デフォルトの名無しさん
2006/07/31(月) 19:12:110436デフォルトの名無しさん
2006/07/31(月) 19:21:54配列変数がn種類あり、(array_1[]〜array_n[])これらの値ををそれぞれ、
n種類のファイル(file_1〜file_n)に書き込みたいです。
つまり、array_k[]の値を全てfile_kに書き込む。(ただし、k=0・・n)
ここで、書き込むルーチンは全ての配列変数で同じことをやりたい。
従って、array_kをfile_kに書き込むルーチンを書けば、あとはkの値を1〜nまで繰り返せば良いと思うのですが、反復文を使って、変数名及びファイル名のみを変化させながら同じルーチンを繰り返す方法が分かりません。
ヒント:〜関数
といった程度で良いので、回答下さい!お礼は体で払います。
0437デフォルトの名無しさん
2006/07/31(月) 19:28:29[begin, end) なループ内で insert なんかしたら、
end どころか、Iterator そのものが無効になる可能性があるだろ。
まさか、↓みたいなコーディングしてんのか?
for( iter it=c.begin(); it!=c.end(); ++it )
{
...
if( condition )
{
it = c.insert( it, newValue );
}
}
0438436
2006/07/31(月) 19:28:44char array_1[] = "ちんこ", array_2[] = "まんこ", array_3[] ="アナル";
for (k = 1; k < 4; k++)
cout << array_k << endl;
とやっても、array_kを表示することをk=1〜3について繰り返すことになりませんよね。
こんな感じで、変数名・ファイル名だけ変えて同じ操作を繰り返したいんですが。。
0439デフォルトの名無しさん
2006/07/31(月) 19:32:25ファイル名はstd::stringstreamで生成する。
後は、わかるな?
0440デフォルトの名無しさん
2006/07/31(月) 19:38:10array_1は"array_1で"あって、数字部分は勝手に置き換えて考えられない。
k = 1 ・・・ n であろうと都合よく "array_k" みたく指定できないからね。
array[3][3]の2次元配列にすれば
for (int k = 1; k < 4; k++)
for (int j = 1; j < 4; j++)
cout << array[k][j] << endl;
で全要素を表示することならできる。
的外れだったらすまそ。
0441デフォルトの名無しさん
2006/07/31(月) 19:38:54// ちょいと粋に1〜10までのコンテナを作る
c.push_back(1);
for(std::list<int>::iterator it = c.begin(), end = c.end(); it != end; ++it){
int last = c.back();
if(last<10) {
c.push_back(last+1);
if( end==c.end() )
std::cout << "ニヤニヤ" << std::endl;
else
std::cout << "ごめんなさい" << std::endl;
}
}
まーコンテナの種類によりけり
0442デフォルトの名無しさん
2006/07/31(月) 19:40:07std::listならそれもありかも……でもやりたいという場面が思いつかない。
0443436
2006/07/31(月) 19:42:56有難うございます!
変数に関しては、2次元の配列にすれば行けそうですね。
ファイル名に関してはstd::っての使えばいいんですか・・・
stad::ってのを見たことが未だないんですが、そこら辺勉強してみます。
0444デフォルトの名無しさん
2006/07/31(月) 19:46:21漏れもないな。
0445デフォルトの名無しさん
2006/07/31(月) 19:56:250446デフォルトの名無しさん
2006/07/31(月) 20:01:09ファイル名の生成は、別にCのsprintfでも良いけどな。
つか、いつになく初心者質問に優しいな。
0447デフォルトの名無しさん
2006/07/31(月) 20:01:46なぜ「まさか」なのかわからんが、iteratorを引数に取る、破壊的なメソッドが
コンテナには用意されてるだろ。
そのときはいちいちend()を実行する必要があるというだけの話しだ。
0448デフォルトの名無しさん
2006/07/31(月) 20:08:30なにかの条件でeraseするとか。
簡単な奴ならfor文じゃなくても書ける気がするけど、俺STLに詳しくないから知らない。
0449デフォルトの名無しさん
2006/07/31(月) 20:09:45最近はgoogle::sparse_hash_mapタンにぞっこん
0450デフォルトの名無しさん
2006/07/31(月) 20:17:46いう奴減ると思う
0451デフォルトの名無しさん
2006/07/31(月) 21:00:28ヘッダファイルを自分で見て確認すること自体は俺もいいことだとは思うが、
それが規格で保証されていることと同列に扱われても困る。
0452デフォルトの名無しさん
2006/07/31(月) 21:20:40std::remove_if
しかし、std::listには専用のlist::remove_ifがあるし、
vectorとかには、ひとつずつeraseするより、remove_ifしたあとにresizeするほうが効率的だし……。
0453デフォルトの名無しさん
2006/07/31(月) 21:34:00そんな事してんの俺だけ?
0454デフォルトの名無しさん
2006/07/31(月) 21:47:430455デフォルトの名無しさん
2006/07/31(月) 22:28:50おっ
ER7035出たね
うちも出たんだがDVDインフォメーションセンターに問い合わせても分からず
工場だかに問い合わせてもらった結果、「普通は出ないはず」で
具体的な内容は客には伝えないことになってるって言われた
ひどい
(7000番台なのでHDD交換対応ではある)
0456455
2006/07/31(月) 22:31:090457デフォルトの名無しさん
2006/08/01(火) 21:13:583
1.5
10.4
4.88888
などを各行に一つずつ出力するときに、小数点の位置を
そろえて出力したいのです。
3.00000
1.50000
10.40000
4.88888
のように小数部にパディングが入っても構いません。
setw や setprecision ではうまくいかないのですが、
何か他に使えるマニピュレータなど有りますでしょうか?
0458デフォルトの名無しさん
2006/08/01(火) 21:14:48先頭の空白が削られてしまいました。
0459デフォルトの名無しさん
2006/08/01(火) 21:31:570460デフォルトの名無しさん
2006/08/01(火) 21:34:360461デフォルトの名無しさん
2006/08/01(火) 22:13:55流れとしては
1 basic_streambufを継承・・クラスhoge_streambuf
2 basic_streambufのメンバ関数overflowをオーバーライド←ここでストリームに何か書く
3 basic_iostreamを継承・・・クラスhoge_stream
4 クラスhoge_streamにメンバとしてクラスhoge_streambufを持たせる
でとりあえず動いてはいるのですが、なぜ動いてるのか今いち理解できてません
overflowはバッファが溢れた時に呼ばれるらしい事まではわかったのですが・・・
この辺りについて詳しく解説しているサイト等あったら教えてください
0462デフォルトの名無しさん
2006/08/01(火) 23:08:23そこでC++でコードを書いてみたのですが、Cでほぼ同じものを書いた場合に比べて
実行速度が1/10くらいになってしまいました。
この現象について、何か心当たりのある方はいらっしゃいませんか?
中身のコードはほぼ一緒で、クラスを使ってみたという程度です。
アバウトな説明でもうしわけありません。
0463デフォルトの名無しさん
2006/08/01(火) 23:12:53まあ普通に考えれば、ほぼ同じものを書いたつもりで、そうではなかったということじゃないかな。
「一時オブジェクト」できまくりなコードを書いてしまったとか。
実コードを晒せば、誰かがアドバイスしてくれるかもよ。
0464デフォルトの名無しさん
2006/08/01(火) 23:13:04コンパイラがちがうから
0465hehe
2006/08/01(火) 23:28:49byte ClipToByte(int n)
{
if (n < 0) n = 0;
else if (n > 255) n = 255;
return byte(n);
}
class ColorRGB {
private:
byte _r, _g, _b;
public:
// コンストラクタなどは省略
int R(void) const { return _r; }
int G(void) const { return _g; }
int B(void) const { return _b; }
int R(int r) { _r = ClipToByte(r); }
int G(int g) { _g = ClipToByte(g); }
int B(int b) { _b = ClipToByte(b); }
}
0466hehe
2006/08/01(火) 23:29:46これを使うと、
color.R( color.G() + color.B() );
のように書ける。
しかし、できれば、演算結果を次のように代入したい。
color.R() = color.G() + color.B();
こっちのほうが読みやすいし、書きやすい。
内部的には byte で保持しているので、次のようにはできない。
class ColorRGB {
public:
int& R(void) { return _r; }
}
0467hehe
2006/08/01(火) 23:31:32プロキシ クラスを書いた。
class Color {
private:
byte _r;
byte _g;
byte _b;
public:
// コンストラクタとかは省略
class ConstRProxy {
private:
const Color* _color;
void operator=(const ConstRProxy& lhs);
public:
ConstRProxy(const Color* color) : _color(color) {}
ConstRProxy(ConstRProxy& lhs) : _color(lhs._color) {}
operator int() const { return _color->_r; }
};
0468hehe
2006/08/01(火) 23:32:50private:
Color* _color;
void operator=(const RProxy& lhs);
public:
RProxy(Color* color) : _color(color) {}
RProxy(RProxy& lhs) : _color(lhs._color) {}
operator int() const { return _color->_r; }
int operator=(int r) { return _color->_r = ClipToByte(r); }
};
ConstRProxy R(void) const { return ConstRProxy(this); }
// ConstGProxy G(void) const { return ConstGProxy(this); }
// ConstBProxy B(void) const { return ConstBProxy(this); }
RProxy R(void) { return RProxy(this); }
// GProxy G(void) { return GProxy(this); }
// BProxy B(void) { return BProxy(this); }
};
0469hehe
2006/08/01(火) 23:34:19Color color(10, 20, 30;
byte r = color.R();
color.R() = color.G() + color.B();
しかし、この記法をサポートするためだけに、
こんなややこしいことをするのは、どうだろうか、と思う。
ご意見求む。
0470デフォルトの名無しさん
2006/08/01(火) 23:40:43実装すると、混沌とした状況に陥ると思う。
0471デフォルトの名無しさん
2006/08/01(火) 23:44:27byteという内部実装を曝け出してしまうが、そこはトレードオフと言うことで勘弁。
そこはbyteをそのまま曝け出すのではなく、Colorのメンバとしてpublicにtypedefするということで我慢しろ。
また、プロキシを書くならもっと完璧を目指せ。
operator =はきちんと*thisを返すべき。複合代入演算子やインクリメント・デクリメントも当然設けろ。
その例では、メンバ関数へのconst修飾をきちんとすれば、ConstRproxyとRProxyに分ける必要は無いはず。
クラステンプレートを使えば、RGBのプロキシをまとめて書けるはず。
0472デフォルトの名無しさん
2006/08/01(火) 23:45:270473hehe
2006/08/01(火) 23:50:53要点は、byte 型の演算後に値をラウンドするのではなく、
自動的にクリップしたいということなんです。
足りないメンバ関数があったり、不完全な実装があるのは承知しています。
そこは本題ではないので、無視していただけると幸いです。
0474hehe
2006/08/01(火) 23:52:22> メンバ関数へのconst修飾をきちんとすれば、ConstRproxyとRProxyに分ける必要は無いはず。
コンストラクタに const Color* を渡すか、Color* を渡すかを
切り替えないといけないので分けてあります。
> クラステンプレートを使えば、RGBのプロキシをまとめて書けるはず。
こちらはそのとおりですね。
0475デフォルトの名無しさん
2006/08/02(水) 00:12:09class ClippedByte
{
public:
ClippedByte(int n) : clipped(ClipToByte(n)) {}
operator int () const { return clipped; }
private:
byte clipped;
};
struct Color { ClippedByte r, g, b; };
0476デフォルトの名無しさん
2006/08/02(水) 00:26:58ありがとうございます!
参考に色々しらべてみたのですが、
>まあ普通に考えれば、ほぼ同じものを書いたつもりで、そうではなかったということじゃないかな。
が正解だったみたいです・・・お手数お掛けしました・・・。
ところで、一応速度的には向上したのですが、やはり遅いのは変わりません。
これは仕様ですか??
0477デフォルトの名無しさん
2006/08/02(水) 00:39:01君がどういうコードを書いているのかわからんし。
0478デフォルトの名無しさん
2006/08/02(水) 01:08:46struct {
int a, b, c;
} aaa[4];
} bbb;
たとえばある構造体のメンバが別の構造体の配列(ここでは4つ)だけの場合でも、
上のように書かないといけないのでしょうか?
それとも他のやりかたがあるんでしょうか。
0479デフォルトの名無しさん
2006/08/02(水) 01:17:46int a, b, c;
} aaa[4];
でいいじゃん。
0480デフォルトの名無しさん
2006/08/02(水) 01:29:01bbbが配列となった時のことを考えておりまして、
例えば bbb[2].aaa[1].a = 0;
のようにしようかと思ってたのですが、やはりおかしいですかね?
普通に二次元配列にして aaa[2][1].a = 0; とかでいいんでしょうか。
それとも使い方によるのですかね?
0481デフォルトの名無しさん
2006/08/02(水) 01:36:03どっちでもいい。好きにしろ。何が聞きたいのかわからん。
0482デフォルトの名無しさん
2006/08/02(水) 02:19:20lib.list.modifiers insert()
Does not affect the validity of iterators and references.(略)
lib.associative.reqmts 8
The insert members shall not affect the validity of iterators and
reference to the container(略)
0483デフォルトの名無しさん
2006/08/02(水) 02:41:30メンバ関数(親クラスで定義したもの)でその変数を扱う場合
例)CSuperClass.func(){ static_value = 0; }
このメンバ関数を使うオブジェクトが親か子かによって
例でいうstatic_valueも親のもの、子のものにちゃんと振り分けられるのでしょうか
それとも親クラスで宣言した関数内だから親のstatic_valueが使われるのかな
0484483
2006/08/02(水) 02:42:58×CSuperClass.func()
○CSuperClass::func()
0485デフォルトの名無しさん
2006/08/02(水) 02:58:19「それとも」の方。
0487デフォルトの名無しさん
2006/08/02(水) 03:09:35恩恵とか意味が分からん。
子クラスに同じコードをコピペでもすれば?
0488483
2006/08/02(水) 03:21:22まったく同じ関数なのに、static変数を扱うせいで別に用意しなきゃならないのは
クラス継承のメリットの一部分を生かせないと思いまして
まあstatic変数とはそういうものだということは承知してますが
0489デフォルトの名無しさん
2006/08/02(水) 03:27:33おそらく継承関係になってるのが設計ミスで
テンプレート+部分特殊化すべきクラスとみた
0490デフォルトの名無しさん
2006/08/02(水) 04:03:320491デフォルトの名無しさん
2006/08/02(水) 16:46:23http://www.cc.nao.ac.jp/fsunman/japanese/C++/stdlib/stdug/loc_io/index.htm
0492デフォルトの名無しさん
2006/08/02(水) 19:44:37それともリテラルの1に単項演算子の-がついてるの?
0493デフォルトの名無しさん
2006/08/02(水) 19:57:160494デフォルトの名無しさん
2006/08/02(水) 19:59:060495デフォルトの名無しさん
2006/08/02(水) 20:39:27どうも。
>>494
指数部だな。
0496デフォルトの名無しさん
2006/08/02(水) 22:55:000497デフォルトの名無しさん
2006/08/03(木) 00:54:46でaの値は処理系依存ですか?(intが32bitのとき)
0498デフォルトの名無しさん
2006/08/03(木) 01:05:13COMとかXCOM
0499デフォルトの名無しさん
2006/08/03(木) 02:43:544.7.3 より、整数から符号付整数への変換で、元の値が変換先の型で
表現できなければ、その値は処理系定義となる。
0500デフォルトの名無しさん
2006/08/03(木) 03:28:10template <class T>
class vect{
T coord[3];
public:
vect operator+(const vect &back)const;
};
//vect.cpp
#include "vect.h"
template <class T>
vect<T> vect<T>::operator+(const vect<T> &back)const{
・・・
}
という風に書き、main関数内でdouble型のインスタンスを二つ生成し、そのインスタンス同士を足して
オペレーターを呼ぶようなソースを書くと、リンカが
error LNK2019: 未解決の外部シンボル
"public: class vect<double> __thiscall vect<double>::operator+(class vect<double> const &)const " (??H?$vector3d@N@@QBE?AV0@ABV0@@Z) が関数 _main で参照されました。
というエラーが出て実行できません
コンパイルしたときはエラーも何もなく、どうしたらいいのかわからなくて困っています
なにが原因だかわかりますでしょうか?
0501デフォルトの名無しさん
2006/08/03(木) 03:59:31FAQ だなぁ。
↓の 940- 見て。
http://pc5.2ch.net/tech/kako/1052/10526/1052625846.html
(http://pc5.2ch.net/test/read.cgi/tech/1052625846/940-)
0502デフォルトの名無しさん
2006/08/03(木) 06:15:31ヒープが壊れていることが原因として考えられます。iTraxx.exe または読み込まれた DLL にバグがあります。
というエラーメッセージが出て困ってるのですが、何か心当たりはありませんか?
無視して継続すると、普通に処理ができます。
0503502
2006/08/03(木) 06:17:30というのも書いてありました。
0504502
2006/08/03(木) 06:46:19メモリを確保していない領域に書き込んでしまっていたようです。
初歩的な問題で場を濁してすみませんでした。
0505500
2006/08/03(木) 19:09:29ありがとうございました
今後きちんとログを調べるようにします
0506デフォルトの名無しさん
2006/08/03(木) 19:10:39ヒープ上に作成することは禁止したい。このようなことは可能ですか?
0507デフォルトの名無しさん
2006/08/03(木) 19:22:360508506
2006/08/03(木) 20:36:090509デフォルトの名無しさん
2006/08/03(木) 20:49:23class No_free_store {
class Dummy { };
void* operator new(size_t, Dummy);
// ...
};
0511夜も眠れない
2006/08/05(土) 16:57:400512デフォルトの名無しさん
2006/08/06(日) 01:08:1432年後か?
0513デフォルトの名無しさん
2006/08/06(日) 10:55:14大きくなっている環境が増えてきているぜ?
0514デフォルトの名無しさん
2006/08/06(日) 14:14:36JavaやC#のように、スタックトレースの出力は行えないのでしょうか。
0516デフォルトの名無しさん
2006/08/06(日) 14:17:050517516
2006/08/06(日) 14:17:580518デフォルトの名無しさん
2006/08/06(日) 14:18:060519デフォルトの名無しさん
2006/08/06(日) 14:33:240520デフォルトの名無しさん
2006/08/06(日) 14:55:01誰が美味い米を食えと言った
0521デフォルトの名無しさん
2006/08/06(日) 15:14:51自動的には行われない。自分で例外オブジェクトに __FILE__ とか __LINE__ とか
埋めれば、それっぽいことはできる。
0522デフォルトの名無しさん
2006/08/06(日) 15:19:040523デフォルトの名無しさん
2006/08/06(日) 15:21:010524デフォルトの名無しさん
2006/08/06(日) 15:23:38マップファイルを出力しておけば、エラーダイアログに表示されるアドレスから、
どこで落ちたか特定できる。
0525デフォルトの名無しさん
2006/08/06(日) 16:17:08例外オブジェクトのコンストラクタに毎回渡すってことか?
0526デフォルトの名無しさん
2006/08/06(日) 16:39:47そうだよ。
0527デフォルトの名無しさん
2006/08/06(日) 17:12:25カナシス
0528デフォルトの名無しさん
2006/08/06(日) 17:31:05#ifdef NDEBUG
#define THROW throw
#else
#define THROW fprintf(stderr, "%s (%d)\n", __FILE__, __LINE__), throw
#endif
とかして、THROW を使えばいい。
0529デフォルトの名無しさん
2006/08/06(日) 18:14:530530524
2006/08/06(日) 19:38:400531デフォルトの名無しさん
2006/08/06(日) 19:43:18落ちた場所じゃなくて例外がスローされた場所の話だからね。
0532デフォルトの名無しさん
2006/08/06(日) 20:12:48Win2K, MSVC++6.0
以下のプログラムを実行すると
unknown software exception(0xc00000fd) が発生して落ちてしまいます。
どこに問題があるのか分かる方お願いします。
#include <fstream>
#include <iostream>
int main(int argc, char* argv[])
{
//test.txtは存在しています。内容に関わらずエラーが出ます。
std::ifstream fin("test.txt", std::ios::in | std::ios::binary);
if(!fin){
return 0;
}
const int bufSize = 1024*1024;
unsigned char buf[bufSize];
while(!fin.eof()) {
std::cout << "r:";
int len = fin.read(reinterpret_cast<char*>(buf), bufSize).gcount();
std::cout << len << std::endl;
}
return 0;
}
0533デフォルトの名無しさん
2006/08/06(日) 20:17:48スタックサイズ
0534デフォルトの名無しさん
2006/08/06(日) 20:18:25デバッガでステップ実行しろよ
0535デフォルトの名無しさん
2006/08/06(日) 20:23:52�d。1MBは駄目でしたか。
スタックにバッファ取る場合は常識的にどれくらいまで可能可能なんでしょうか?
再帰などは無しとして100KBくらいでも大きすぎでしょうか?
0536デフォルトの名無しさん
2006/08/06(日) 20:36:56VC++のデフォルトは1MBだと思ったが。
0537デフォルトの名無しさん
2006/08/06(日) 20:37:43C++ 処理系が満たすべき最低限の指標として、規格中に
> Size of an object [262 144].
というのがある。
移植性のためにも単一のオブジェクトサイズは
ここまでにしとくのがいいんじゃないかね?
スタックサイズという概念は規格には無いので、
実際のところは環境に合わせて考えないとだめだよ。
0538デフォルトの名無しさん
2006/08/06(日) 20:48:29ありがとうございます。
最大でも200KBくらいということですね。
Linux+GCCでも使うので一般的なアプリの環境で考えていました。
0539デフォルトの名無しさん
2006/08/06(日) 20:50:000540デフォルトの名無しさん
2006/08/06(日) 20:52:03早速誤解しやがったな。
"Size of an object" とスタックに確保可能なサイズは関係ない。
0541デフォルトの名無しさん
2006/08/06(日) 21:05:490542デフォルトの名無しさん
2006/08/06(日) 21:48:18コンパイルオプションを変えるほどの処理では無いので。
バッファは64KBにしました。
0543デフォルトの名無しさん
2006/08/06(日) 21:58:560544デフォルトの名無しさん
2006/08/06(日) 22:01:30「バッファ程度」という基準の意味がわからん。 static のほうが嫌だし。
0545デフォルトの名無しさん
2006/08/06(日) 22:04:410546デフォルトの名無しさん
2006/08/06(日) 23:25:45をDLしてインストールしましたが、IIS(インターネントインフォメーションサービス)?が
コントロールパネルのコンポーネントと追加の削除の中からできるようにしておかないと
ダメみたいなので探しても見当たらない・・・。
これってもともとPCに入ってるものなの??
XPを使ってて他の方法も考えてますが誰かエロイ人教えてくれませんか??
お願いします><
0547デフォルトの名無しさん
2006/08/06(日) 23:31:470548デフォルトの名無しさん
2006/08/06(日) 23:33:300549デフォルトの名無しさん
2006/08/06(日) 23:35:11http://www.microsoft.com/japan/msdn/vstudio/express/visualc/
0550546
2006/08/06(日) 23:35:58マルチでもなんでもないんです!!(実はマルチの意味すら分かってない
0551549
2006/08/06(日) 23:39:01相手して損した
0552デフォルトの名無しさん
2006/08/06(日) 23:39:190553546
2006/08/06(日) 23:44:18ありがとう〜今やってるとこだけど俺は違うのを落としてたのかな?
ちなみにマルチってどういう意味?
マルチ商法??
0554デフォルトの名無しさん
2006/08/06(日) 23:46:34複数のスレッドに同じ内容を書き込むこと。
それくらい自分で調べろよ。
0555546
2006/08/06(日) 23:48:34ありがとう〜初心者なのでこれから頑張っていきます!!
0556546
2006/08/07(月) 00:17:07その部分に関しては何も変わってないきががする・・・
0557デフォルトの名無しさん
2006/08/07(月) 00:21:000558546
2006/08/07(月) 00:21:48意味わかんないんだけど・・・
0559デフォルトの名無しさん
2006/08/07(月) 00:22:10ドキュメント読んで一通りセットアップしてから、それでも問題が出たら VC スレに逝け。
0560546
2006/08/07(月) 00:25:030561デフォルトの名無しさん
2006/08/07(月) 00:28:050562546
2006/08/07(月) 00:51:30出た!教えて訓!
0563デフォルトの名無しさん
2006/08/07(月) 01:07:05class parents{...};
class child:public parents{...};
以上の親クラスと、親を継承する子クラスがあったとして
base *obj = new child;
delete obj;
このようにdeleteにポインタを渡す時点で型が変わってる時、
正常なdelete処理は行われますか?
なんとなくparents型のサイズしか開放されない気がするのですが・・・。
教えて欲しいです。
0564デフォルトの名無しさん
2006/08/07(月) 01:08:58なんか損した気分
>>562
騙りレス番消し忘れてるぞ
0565デフォルトの名無しさん
2006/08/07(月) 01:10:25問題ない。deleteは型の認識はせずにサイズだけ記憶している。
0566デフォルトの名無しさん
2006/08/07(月) 01:10:590567デフォルトの名無しさん
2006/08/07(月) 01:19:470568563
2006/08/07(月) 01:27:42ありがとうございます。メモリ自体は正常に破棄されるんですね。
>>566さん
おっしゃるとおりです・・・ただデストラクタは呼ばれなかったけど
C言語のmallocとfreeなら正常に破棄してくれそうなので。
>>567さん
仮想デストラクタの機能は今知りました!
まさにこういうのを求めてたので・・・ありがとうございました!
0569デフォルトの名無しさん
2006/08/07(月) 01:53:06556までの間違いだろバカ!
なんか損した気分
0570デフォルトの名無しさん
2006/08/07(月) 02:45:340571デフォルトの名無しさん
2006/08/07(月) 03:07:160572デフォルトの名無しさん
2006/08/07(月) 04:08:50<HTML>
<HEAD>
<TITLE>Hello JavaScript</TITLE>
</HEAD>
<BODY>
<SCRIPT language="JavaScript">
document.write("Hello! JavaScript!!");
</SCRIPT>
</BODY>
</HTML>
IEで開こうとしてもなぜかHP調の画面にならず、そのまま文字が表示されるだけでした。これはなぜでしょうか?
すみませんマルチになってしまい申し訳ありませんが
0573デフォルトの名無しさん
2006/08/07(月) 04:10:050574デフォルトの名無しさん
2006/08/07(月) 06:18:26みんなでvip実況スレを盛り上げよう
ニュー速VIP
ttp://ex16.2ch.net/news4vip/
FF4→5→6 リレー実況 ttp://ex16.2ch.net/test/read.cgi/news4vip/1154895492/
ゲームセンターCX ttp://ex16.2ch.net/test/read.cgi/news4vip/1154888213/
エロゲ実況 ttp://ex16.2ch.net/test/read.cgi/news4vip/1154839702/
おまいらが指定したゲーム実況 ttp://ex16.2ch.net/test/read.cgi/news4vip/1154896516/
RPG実況 ttp://ex16.2ch.net/test/read.cgi/news4vip/1154857556/
女神転生とかを実況 ttp://ex16.2ch.net/test/read.cgi/news4vip/1154776872/
実況!アニメ流すぜ!3本目 ttp://ex16.2ch.net/test/read.cgi/news4vip/1154877307/
【東方】弾幕実況 ttp://ex16.2ch.net/test/read.cgi/news4vip/1154852500/
ファミコンジャンプ実況スレ ttp://ex16.2ch.net/test/read.cgi/news4vip/1154878214/
エロゲ実況すればいいじゃねーか ttp://ex16.2ch.net/test/read.cgi/news4vip/1154885750/
大神実況してみる その4ttp://ex16.2ch.net/test/read.cgi/news4vip/1154880537/
ICO実況 ttp://ex16.2ch.net/test/read.cgi/news4vip/1154896258/
好きなゲームを実況するスレ ttp://ex16.2ch.net/test/read.cgi/news4vip/1154861584/
ToHeart2系実況ttp://ex16.2ch.net/test/read.cgi/news4vip/1154774247/
かまいたちの夜x3を実況してみるttp://ex16.2ch.net/test/read.cgi/news4vip/1154863755/
映画実況するのかも ttp://ex16.2ch.net/test/read.cgi/news4vip/1154895107/
FF4→5→6→7 リレー実況 ttp://ex16.2ch.net/test/read.cgi/news4vip/1154898127/
0575デフォルトの名無しさん
2006/08/07(月) 13:16:20(i = 3) && printf("%d",i);
これを一文で書きたくて
( int i = 3 ) && printf("%d",i);
としたらiが定義されていないとエラーになります
一文では書けないのでしょうか?
0576デフォルトの名無しさん
2006/08/07(月) 13:59:520577デフォルトの名無しさん
2006/08/07(月) 14:47:340578デフォルトの名無しさん
2006/08/07(月) 15:01:11けどこれ結局、式文にして式の値使ってないから、
普通のブロックでも代りないのでは?
{ int i = 3; i && printf("%d",i); }
0579デフォルトの名無しさん
2006/08/07(月) 15:06:54それどこらへんがgcc拡張?
0580デフォルトの名無しさん
2006/08/07(月) 15:21:16↓使いたい人はこちらをご覧あれ
http://gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/Statement-Exprs.html#Statement-Exprs
0581デフォルトの名無しさん
2006/08/07(月) 16:52:13my ($n) = /^(hoge)/ or die()
まぁ、そもそも宣言しなくて変数使えるんだけど。
0582デフォルトの名無しさん
2006/08/07(月) 16:58:210583デフォルトの名無しさん
2006/08/07(月) 18:06:12どのような記述をすればよいのでしょうか。
VC6.0です。
0584呼んでみた
2006/08/07(月) 18:24:580585デフォルトの名無しさん
2006/08/07(月) 18:30:25ohi $file.chm or die()
まぁ、そもそも呼ばなくてもchmファイルやってくるんだけど。
0586デフォルトの名無しさん
2006/08/07(月) 18:40:500587デフォルトの名無しさん
2006/08/07(月) 19:04:19まぁまぁ。せっかく夏休みにPerl覚えたばっかりだから
ひけらかしたいんだろう。
0588デフォルトの名無しさん
2006/08/07(月) 19:19:21そんなわけあるかw
だが、perlだとあっても不思議ではない気がするのが怖い。
0589デフォルトの名無しさん
2006/08/07(月) 19:36:23int i = (((i = 3) && printf("%d", i)), i);
これで出来ないことはないが、こんなコードは採用するな。
0590デフォルトの名無しさん
2006/08/07(月) 19:44:59それじゃ意味がちがくない?
というか、元々の文の意味も、何がやりたいのかよー分からんのだがな・・・。
i = 3 は常に真だから、
int i = 3;
printf("%d", i);
でいいじゃん。
0591デフォルトの名無しさん
2006/08/07(月) 19:51:39>それじゃ意味がちがくない?
どのへんが?
>i = 3 は常に真だから、
わざわざ判定してるぐらいだからサンプルとして"3"を代入してるだけで
変わる可能性があるんじゃないのか?
0592デフォルトの名無しさん
2006/08/07(月) 20:24:55例えば、プログラムA、プログラムBという、
VC++6.0できちんと動作する別々のプログラムがあったとして、
プログラムA上でプログラムBを呼び出し、(コマンドボタンなどで)
別窓で動かすにはどうしたら良いでしょうか。
0593デフォルトの名無しさん
2006/08/07(月) 20:37:190594デフォルトの名無しさん
2006/08/07(月) 20:39:240595デフォルトの名無しさん
2006/08/07(月) 20:41:53Windowsの仕様にもコマンドボタンというものは(ry
0596デフォルトの名無しさん
2006/08/07(月) 21:57:08想像力が欠如してるな
0597デフォルトの名無しさん
2006/08/07(月) 22:42:10std::bad_alloc例外を投げてもワトソンがログ吐いてくれないのですが、
後でクラッシュした箇所を知ろうとしたときどうすればいいでしょうか。
クラッシュした直後であればクラッシュ報告ダイアログ上で情報が見られるようですが、
この情報はどこかに保存されていたりするのでしょうか…
0598デフォルトの名無しさん
2006/08/07(月) 22:50:52>>それじゃ意味がちがくない?
>どのへんが?
i の値が保存されない
0599デフォルトの名無しさん
2006/08/07(月) 22:51:30問題ないわ。スマソ。
0600デフォルトの名無しさん
2006/08/07(月) 22:54:21を実行すると
iの値は3
0601デフォルトの名無しさん
2006/08/07(月) 22:55:080602デフォルトの名無しさん
2006/08/07(月) 22:58:43if(int i = 3) printf("%d",i);
0603デフォルトの名無しさん
2006/08/07(月) 23:01:40i のスコープがどーなるか知ってて言ってんのか?
0604デフォルトの名無しさん
2006/08/07(月) 23:03:550605デフォルトの名無しさん
2006/08/07(月) 23:05:14言ってますよ。
0606デフォルトの名無しさん
2006/08/07(月) 23:13:18すまんかった。
printf の ,i もあるから、それと勘違いしてたのね。
0607デフォルトの名無しさん
2006/08/07(月) 23:18:16i のスコープはprintf()まで有効なんじゃねーの?
(if 文抜けたら無効)
0608デフォルトの名無しさん
2006/08/07(月) 23:20:01おっと、だからイクナイのか、スマソ
0609デフォルトの名無しさん
2006/08/07(月) 23:34:51どうやらそうとも言い切れないようだ。
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#504
0610デフォルトの名無しさん
2006/08/07(月) 23:52:19英語ヨメネ
コンパイラ依存?
0611デフォルトの名無しさん
2006/08/08(火) 00:16:00禿とその仲間たちが int i = i; なんてエラーにしたほうがいいんだろうな、とか言ってる。
0612デフォルトの名無しさん
2006/08/08(火) 00:27:17禿とその仲間たち→禿と愉快な仲間たち
0613デフォルトの名無しさん
2006/08/08(火) 00:28:41禿げの言うことならほっとくか
0614デフォルトの名無しさん
2006/08/08(火) 00:44:22そのくせ void *p = &p; はおk、とか言ってるあたりがなんだかなぁもうって感じ。
確かにそうしたほうが非常に C++ っぽいとは思うが。
0615デフォルトの名無しさん
2006/08/08(火) 00:49:20はぁ?それはOKに決まってるだろ。馬鹿ですぅかぁ?
0616デフォルトの名無しさん
2006/08/08(火) 00:51:50はiにどんな値が入るか完全に不定だが、
void *p = &p;
はpにpへのポインタが入る。
なんだかなぁもうって言ってる人がなんだかなぁって感じ。
何にも分かってないんだね。
0617デフォルトの名無しさん
2006/08/08(火) 00:53:040618デフォルトの名無しさん
2006/08/08(火) 00:55:31そんなことはわかった上で言ってるんだが。
0619デフォルトの名無しさん
2006/08/08(火) 00:55:510620デフォルトの名無しさん
2006/08/08(火) 01:07:45ハイハイw 俺もお前が馬鹿と分かった上で言ってるよw
0621デフォルトの名無しさん
2006/08/08(火) 01:35:33pへのポインタっつうことはポインタへのポインタってことなんすよね?
何か左辺と右辺で型が違うような気がする
分からんようになってきてもうた
0622デフォルトの名無しさん
2006/08/08(火) 01:43:51void型のポインタだから合法
0623デフォルトの名無しさん
2006/08/08(火) 01:45:06まあ、void *p = &p; なんてすることに
どれだけの意味があるのか知らんが。
0624デフォルトの名無しさん
2006/08/08(火) 08:50:00time_t や time() がグローバルな名前空間に見えています。
std::time_t や std::time() じゃないと気持ち悪いのですが、
何とかなりませんでしょうか?
ちなみに開発環境は Visual Studio 2005 Professional です。
0625デフォルトの名無しさん
2006/08/08(火) 10:36:47中で激しくコピーが起こりまくっているんでしょうか?
リファレンスカウントにするとか、copy-on-write に
するとかは実装者依存なんですか?
0626デフォルトの名無しさん
2006/08/08(火) 10:48:57RVOが働けば最低限のコピーでう済むだろうなあ。
リファレンスカウントとかは実装依存。
0627デフォルトの名無しさん
2006/08/08(火) 10:54:38std::wstring o(L"おなにぃ")
//処理
return o;
とかはやっぱやるべきじゃないんだろうか。
戻り値じゃなく参照な引数で返すべきなんだろうか。
0628デフォルトの名無しさん
2006/08/08(火) 10:55:36扱おうと思ったら、なんでもかんでも boost::shared_ptr ?
0629デフォルトの名無しさん
2006/08/08(火) 11:12:22http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#456
0630デフォルトの名無しさん
2006/08/08(火) 11:18:28Boehm GCとかもある。shared_ptrなんかだと循環参照とか気にする必要がある。
0631デフォルトの名無しさん
2006/08/08(火) 12:43:25参照返すんじゃまずいのか?
0632デフォルトの名無しさん
2006/08/08(火) 12:45:200633デフォルトの名無しさん
2006/08/08(火) 12:56:490634デフォルトの名無しさん
2006/08/08(火) 13:03:16コピーコンストラクタが呼ばれなければ
効いているって考えていいんでしょうか?
#include <iostream>
using namespace std;
struct A {
A () {}
A (const A &p) {cout << "hoge" << endl;}
};
A func () {return A ();}
int main () {
A a (func ());
return 0;
}
0635デフォルトの名無しさん
2006/08/08(火) 13:13:15それだと func() の戻り値と a の生成で2回コピーコンストラクタが使われる可能性がある。
0636デフォルトの名無しさん
2006/08/08(火) 13:21:25なるほど
hogeが表示される回数は0ないし1ないし2の可能性があって
何回呼ばれるかは規格では定まってないと.
勉強になりました.
0637592
2006/08/08(火) 14:41:47お答えくださった方々、ありがとうございました。
スレが違っていたみたいです、申し訳ありません。
失礼しました。
0638デフォルトの名無しさん
2006/08/08(火) 15:36:41>>625に自動変数なんて制約はないよ。
0639デフォルトの名無しさん
2006/08/08(火) 18:06:171)デフォルトコンストラクタ
2)コピーコンストラクタ
3)代入演算子
が生成されますか?
0640639
2006/08/08(火) 18:13:03自動定義されなくなりますが、コピーコンストラクタと代入演算子は
あいかわらず自動で定義されたものがそのまま存在するのですね。
勝手に使われているのが不安な場合は両者を protected などに
しておくというのが常套手段なんですか?
0641デフォルトの名無しさん
2006/08/08(火) 18:41:140642デフォルトの名無しさん
2006/08/08(火) 19:04:370644デフォルトの名無しさん
2006/08/08(火) 21:24:22代入演算子とコピーコンストラクタを、privateで宣言するのが常套手段。定義の必要はない。
何が何でもboost使いたければ、お好きなように。
0645デフォルトの名無しさん
2006/08/08(火) 21:34:390646デフォルトの名無しさん
2006/08/08(火) 21:37:17日本語でおk
0647デフォルトの名無しさん
2006/08/08(火) 22:00:05どうやって見分けるかは完璧に君の自由だ羨ましいぜこのやろう
0648デフォルトの名無しさん
2006/08/08(火) 22:55:340649デフォルトの名無しさん
2006/08/08(火) 23:10:170650デフォルトの名無しさん
2006/08/08(火) 23:40:222
4
8
16
32
64
128
256
512
0651デフォルトの名無しさん
2006/08/08(火) 23:43:500652デフォルトの名無しさん
2006/08/08(火) 23:53:250653デフォルトの名無しさん
2006/08/09(水) 00:02:15実際には、抽象クラスを継承したものを入れたいんですが。
0654デフォルトの名無しさん
2006/08/09(水) 00:05:540655デフォルトの名無しさん
2006/08/09(水) 00:08:12なるほど。盲点でした。
ありがとうございました。
0656デフォルトの名無しさん
2006/08/09(水) 00:35:09君、Effective C++読まないと!
0657デフォルトの名無しさん
2006/08/09(水) 10:00:470658デフォルトの名無しさん
2006/08/09(水) 10:08:080659デフォルトの名無しさん
2006/08/09(水) 12:31:15遅レスでどうでもいいツッコミだが
「参照返す」って言われたら中で自動変数作って参照の戻り値を返す以外に
なんかあるか?
0660デフォルトの名無しさん
2006/08/09(水) 12:44:070661デフォルトの名無しさん
2006/08/09(水) 12:45:06return *(new T);
}
0662デフォルトの名無しさん
2006/08/09(水) 12:54:550663デフォルトの名無しさん
2006/08/09(水) 12:57:340664デフォルトの名無しさん
2006/08/09(水) 13:13:43std::string *p = new std::string;
ああだこうだ;
return *p;
}
普通にやる
0665デフォルトの名無しさん
2006/08/09(水) 13:24:23ちゃんと責任もって delete してやれよ・・・
0666デフォルトの名無しさん
2006/08/09(水) 13:52:14>>665の意味でわけわからなくなるから、やらないこと推奨の方法。
0667デフォルトの名無しさん
2006/08/09(水) 13:57:19のとき、
delete &a;
ってなるのか?
すごく気持ち悪いけど、よく使うやり方なのかな。
俺がもしどうしてもこういう場面になったらshared_ptr使うとおもうけど。
0668デフォルトの名無しさん
2006/08/09(水) 14:10:100669デフォルトの名無しさん
2006/08/09(水) 14:43:52参照を返すときの話をしてるんだけど
0670デフォルトの名無しさん
2006/08/09(水) 16:19:340671デフォルトの名無しさん
2006/08/09(水) 16:24:20ただ、継承しつつ内部に包含する(?)というのがある程度一般的になされることなのか
自信がありません。コメント頂けるとありがたいです。
struct base { virtual void func(void) = 0; }; // インターフェイス
struct derived1 : public base { void func(void) { cout << "d1" << endl;} };
struct derived2 : public base { void func(void) { cout << "d2" << endl;} };
struct t1 {}; // 切り替え用の
struct t2 {}; // タグ
struct X : public base {
X(t1) : m_impl(new derived1) {} // t1指定でderived1の動作
X(t2) : m_impl(new derived2) {} // t2指定でderived2の動作
~X() { delete m_impl; }
void func(void) { m_impl->func(); }
base* m_impl;
};
int main(void) {
t2 t; // t2を
X x(t); // 指定したので
x.func(); // d2と表示
return 0;
}
0672デフォルトの名無しさん
2006/08/09(水) 16:32:250673671
2006/08/09(水) 17:22:07ふつーですか。
「インターフェイスの継承+包含による実装の委譲」と理解しました。
継承と委譲の関係を混同していたので気持ち悪く感じてしまったようです。
どうも〜。
0674デフォルトの名無しさん
2006/08/09(水) 17:55:51デザインパターンのストラテジーパターンなどの説明を読むとすっきりするかもね。
0675デフォルトの名無しさん
2006/08/09(水) 18:15:399yq@t@0w@deleteduese:joyw@rt?
0676デフォルトの名無しさん
2006/08/09(水) 18:17:530677デフォルトの名無しさん
2006/08/09(水) 18:46:38?
0678デフォルトの名無しさん
2006/08/09(水) 18:48:18??
0679デフォルトの名無しさん
2006/08/09(水) 18:58:46structだと何がまずいの?
0680デフォルトの名無しさん
2006/08/09(水) 19:02:34別にまずくないんじゃないの
0681デフォルトの名無しさん
2006/08/09(水) 19:06:02なんでまずくないんじゃないの?
0682デフォルトの名無しさん
2006/08/09(水) 19:08:520683デフォルトの名無しさん
2006/08/09(水) 19:19:26さあ?普段からstruct使う人かもよ?
0684671
2006/08/09(水) 19:30:58structもclassも同じだと思ってましたがまずいですか?
structとした理由に>>682以上の意味はありませんが。
0685デフォルトの名無しさん
2006/08/09(水) 19:39:300686デフォルトの名無しさん
2006/08/09(水) 19:40:27>>671の内容だったら、classにしてもたかだか1行しか変わらないと思うけど。
0687デフォルトの名無しさん
2006/08/09(水) 19:57:04本質とは関係ないものを排除して、見やすくしてるんだよ。
0688デフォルトの名無しさん
2006/08/09(水) 22:47:360689デフォルトの名無しさん
2006/08/10(木) 00:11:460690デフォルトの名無しさん
2006/08/10(木) 00:20:33コンストラクタの部分特殊化ができれば、
インスタンス作らないでもできるのにね。
0691デフォルトの名無しさん
2006/08/10(木) 00:23:52同じような用途のiterator_categoryも、
ほとんどの場合struct使って書いてあるよ。
規格書からしてそうだから。
24.2 Header <iterator> synoposis
0692デフォルトの名無しさん
2006/08/10(木) 00:24:520693デフォルトの名無しさん
2006/08/10(木) 00:26:180694デフォルトの名無しさん
2006/08/10(木) 01:11:190695デフォルトの名無しさん
2006/08/10(木) 03:27:40それは視点がずれてるとオモ。
0696デフォルトの名無しさん
2006/08/10(木) 14:55:49自分なりに調べたところ、VisualC++に依存したものしか見つかりませんでした。
出来ればWindowsでもUNIXでも使えるコードを書きたいのでVisualC++に依存した
物は作りたくありません。
STLやboostなどの(準)標準的なライブラリを使ってこういう事は実現出来ますか?
0697デフォルトの名無しさん
2006/08/10(木) 14:57:280698デフォルトの名無しさん
2006/08/10(木) 14:59:170699デフォルトの名無しさん
2006/08/10(木) 15:18:340700デフォルトの名無しさん
2006/08/10(木) 15:21:54マジレスすると、ファイルシステムはOSによって異なるから、ディレクトリ操作は異なるAPIを使わざるを得ない。
それがいやなら、処理系依存部分をラップしてくれるライブラリを探してきて使う。
0701デフォルトの名無しさん
2006/08/10(木) 15:22:270702デフォルトの名無しさん
2006/08/10(木) 15:30:44ありがとうございました。他にライブラリ探すのも面倒なんで、おとなしくboost使ってみます。
ところで、なぜboostはこんなに嫌われてるんですか?(>>698, >>699, >>701)
0703デフォルトの名無しさん
2006/08/10(木) 15:59:280704デフォルトの名無しさん
2006/08/10(木) 16:04:330705デフォルトの名無しさん
2006/08/10(木) 16:07:59どうやらboostが大嫌いな人が1人このスレに粘着してるみたい
無視していいよ
0706デフォルトの名無しさん
2006/08/10(木) 16:15:070707デフォルトの名無しさん
2006/08/10(木) 16:15:14理解しようとした途端に投げたくなるよね
0708デフォルトの名無しさん
2006/08/10(木) 16:22:19糞プログラマが誕生したのであった。
0709デフォルトの名無しさん
2006/08/10(木) 16:26:360710デフォルトの名無しさん
2006/08/10(木) 16:50:46まっとうなやり方って、autoconf使って場合わけとか?
0711デフォルトの名無しさん
2006/08/10(木) 16:52:09これをするには、boostに限らずとも、
なんらかのクロスプラットフォームなラッパを使うしかないのだがな。
//! それとも、WindowsとUNIX両方のやり方を覚えてみる?
0712デフォルトの名無しさん
2006/08/10(木) 17:10:21ちまちま糞ラッパー書かせとけばいいんだよ。
0713デフォルトの名無しさん
2006/08/10(木) 17:37:15ところでどこが嫌いなの?
0714デフォルトの名無しさん
2006/08/10(木) 19:05:45普通の人は、WindowsとUnixの両方のやり方を覚えるけど、それが何か?
0715デフォルトの名無しさん
2006/08/10(木) 19:30:15WindowsとかUnix固有のやり方を答えるのは気が引ける。
逆に言えばそういう環境依存の答えを求めるなら、初心者歓迎のC/C++室で聞いてほしい。
0716デフォルトの名無しさん
2006/08/10(木) 19:32:590717デフォルトの名無しさん
2006/08/10(木) 19:38:290718デフォルトの名無しさん
2006/08/10(木) 19:44:36boostでいいだろ。
ただまぁ、Win32APIやUnixのシステムコールの使い方くらいは知っといても損はない。
0719デフォルトの名無しさん
2006/08/10(木) 19:50:45仕事で使って好いときとイカンときがあること。
楽だから禁止のプロジェクトだと泣ける
0720デフォルトの名無しさん
2006/08/10(木) 20:14:23それじゃboostのことは大好きなんじゃない?
嫌うべきは禁止するプロジェクトだよ
0721デフォルトの名無しさん
2006/08/10(木) 20:20:220722デフォルトの名無しさん
2006/08/10(木) 20:50:03ソース納品の時の顧客の要望 orz
チームのレベル全体を見た時の上司の決定 orz
それだけに使えるときのありがたさときたら。
0723デフォルトの名無しさん
2006/08/10(木) 21:00:440724デフォルトの名無しさん
2006/08/10(木) 21:16:44保障されていない外部ライブラリの使用を禁止される場合なんてざらだよ。
多分、反論したいと思うだろうけど、そういう場合が多いのが現実。
0725デフォルトの名無しさん
2006/08/11(金) 00:50:29boostだろうけど、普通はラッパ書くよなぁ。
0726デフォルトの名無しさん
2006/08/11(金) 00:55:56特に根拠は示せないけど、自分の意見を通したい馬鹿が使う言葉
類似語 「一般的には」「常識では」「みんなもってるもん!」
0727デフォルトの名無しさん
2006/08/11(金) 00:58:44社会不適合奢が好んで使う言葉。
0728デフォルトの名無しさん
2006/08/11(金) 01:00:24「馬鹿」
自分が馬鹿な奴が使う言葉。賢い奴は他人に馬鹿と言わない。
0729デフォルトの名無しさん
2006/08/11(金) 01:04:520730デフォルトの名無しさん
2006/08/11(金) 01:08:14お、図星だったみたいだな。
0731デフォルトの名無しさん
2006/08/11(金) 01:08:19真の社会不適合奢が好んで使う言葉
0732デフォルトの名無しさん
2006/08/11(金) 01:12:24本当に馬鹿だなぁお前。
728の何が図星当ててるレスだっていうのやら。
さっさと日本語勉強してこい。
0733デフォルトの名無しさん
2006/08/11(金) 01:33:080734デフォルトの名無しさん
2006/08/11(金) 01:53:42余程くやしいようですね( ´,_ゝ`)
0735デフォルトの名無しさん
2006/08/11(金) 02:06:090736デフォルトの名無しさん
2006/08/11(金) 03:50:250737デフォルトの名無しさん
2006/08/11(金) 04:48:150738デフォルトの名無しさん
2006/08/11(金) 04:48:17それは置いといて、普段は仕事でも boost 使っているけど、
実行時型情報が使えない事情のあるプロジェクトで
boost 禁止ってのがあった。
boots の中でも使ってもいいライブラリとそうでないモノを
分離すれば良かったんだろうけど、とりあえず面倒なので
boost 禁止、と。
0739デフォルトの名無しさん
2006/08/11(金) 10:47:45STLでさえ禁止だったり、C++なのに一時変数は関数の先頭に必ず宣言をまとめろ、みたいな
規約(というか慣習)があるプロジェクトも多い品
0740デフォルトの名無しさん
2006/08/11(金) 10:51:48これは普通だろ。
0741デフォルトの名無しさん
2006/08/11(金) 10:54:520742デフォルトの名無しさん
2006/08/11(金) 11:22:55以下のコードだと実体が無いのか未解決の外部シンボルを参照したとリンカに怒られました。
template <typename T>
void NotOp(T& c) { c = ~c; }
std::for_each(buf, bufend, NotOp<unsigned int>);
0743デフォルトの名無しさん
2006/08/11(金) 11:46:510744デフォルトの名無しさん
2006/08/11(金) 12:00:03VC7.0(.NET 2002)です。
0745デフォルトの名無しさん
2006/08/11(金) 12:03:40じゃ、たぶんバグだな。明示的インスタンス化を置いとけば一応動くはず。
こうだっけ?
template void NotOp(unsigned int&);
まぁバージョンアップをお勧めする。
0746デフォルトの名無しさん
2006/08/11(金) 12:09:320747デフォルトの名無しさん
2006/08/11(金) 12:11:42バグって無いコンパイラなら普通に通るよ。
それとも VC7.0 でテストしてるってこと?
0748デフォルトの名無しさん
2006/08/11(金) 12:13:330749デフォルトの名無しさん
2006/08/11(金) 12:15:38なんかあやしいから、コンパイルできて問題が再現する最小のコードと
エラーメッセージのコピペを貼ってほしい。
0750742
2006/08/11(金) 12:17:450751デフォルトの名無しさん
2006/08/11(金) 12:22:07#include <algorithm>
template <typename T>
void NotOp(T& c) { c = ~c; }
int _tmain(int argc, _TCHAR* argv[])
{
unsigned int buf[256];
std::for_each(buf, buf+256, NotOp<unsigned int>);
return 0;
}
Linker error LNK2019: 未解決の外部シンボル "void __cdecl NotOp(unsigned int &)" (?NotOp@@YAXAAI@Z) が関数 _main で参照されました。
Linker fatal error LNK1120: 外部参照 1 が未解決です。
やはりエラーが出ます。
0752デフォルトの名無しさん
2006/08/11(金) 12:41:12俺も2002愛用してたけど色々と諦めて2005にした。
インテリセンスが鈍い事以外に不満はなくなったよ
0753742
2006/08/11(金) 12:47:32とりあえず>>745氏の方法で回避したいと思います。
2005は余裕が有れば購入してみます。
回答してくださった皆様ありがとうございました。
0754デフォルトの名無しさん
2006/08/11(金) 13:19:032. TCHAR.hはどこでインクルードしているのか?というかこれMFCプロジェクト?
3. 1行目を削除してvsvars32.batからclだけでコンパイルしてみろ。
0755デフォルトの名無しさん
2006/08/11(金) 13:40:11馬鹿かお前
0756デフォルトの名無しさん
2006/08/11(金) 13:58:29コンパイラによって暗黙に生成されるものを使うほうが良い場合って
ありますか?常に明示的に定義したほうがよいですか?
0757デフォルトの名無しさん
2006/08/11(金) 14:07:550758デフォルトの名無しさん
2006/08/11(金) 14:12:04「定義しなくていい」のか、「定義しないほうがいい」のか、どちらでしょうか?
0759デフォルトの名無しさん
2006/08/11(金) 14:14:10スタンスだったら、人それぞれ。
0760デフォルトの名無しさん
2006/08/11(金) 14:15:14ということはないのですか?
0761デフォルトの名無しさん
2006/08/11(金) 14:21:43俺は後で必要になるかもしれないから全部作ってるけど。
コンストラクタはメンバ初期化にも使えるから便利だし。
(初期化は代入よりも効率いいらしいよ)
0762L
2006/08/11(金) 14:58:17出現回数の略順にソートして表示するプログラムの場合で、
処理時間が最も短くできるのは何ですか?
0763デフォルトの名無しさん
2006/08/11(金) 14:59:160764デフォルトの名無しさん
2006/08/11(金) 21:12:13ASP.NETでセッション作って、
ISAPIフィルタでセッションIDとか取得できる?
ISAPIフィルタで認証ちっくなことしたい。
0765デフォルトの名無しさん
2006/08/11(金) 21:26:14俺が答えられないのは内緒だぞ
0766デフォルトの名無しさん
2006/08/12(土) 00:18:45string型の変数にそのタグのテキストを代入することはできたのですが、
それをintの変数に代入できません。(下の式)
初歩的な質問で申し訳ないですが、ヒントで結構ですので
教えていただけませんでしょうか?
private void btnApply_Click(object sender, EventArgs e)
{
foreach (ListViewItem itm in lvwSkillTable.CheckedItems)
{
int tagNum;
if (itm.Checked) tagNum = Convert.ToInt16(itm.Tag.ToString());
if (tagNum = 77) MessageBox.Show("できた"); //intに変換できたか確認
}
}
0767デフォルトの名無しさん
2006/08/12(土) 00:20:010768デフォルトの名無しさん
2006/08/12(土) 00:21:33それは C++ じゃないので、まずは自分の使用している言語を確かめて、
適切な別のスレを探してください。
0769デフォルトの名無しさん
2006/08/12(土) 01:56:110770デフォルトの名無しさん
2006/08/12(土) 09:15:110771デフォルトの名無しさん
2006/08/12(土) 13:54:06標準じゃないからじゃない?
0772デフォルトの名無しさん
2006/08/12(土) 14:12:44C++0xでは標準になる可能性大です。
0773デフォルトの名無しさん
2006/08/12(土) 21:15:44「boost::→std::」になるのはどうもやだな
0774デフォルトの名無しさん
2006/08/12(土) 22:51:48boostd::
で。
0775デフォルトの名無しさん
2006/08/12(土) 23:01:510776デフォルトの名無しさん
2006/08/12(土) 23:17:59”C++ ORM”で調べるくらいのことはしましょうぜ
0777デフォルトの名無しさん
2006/08/13(日) 17:24:57クラスのインスタンスを、ヒープ上には作成できるけど、
スタック上には作成できないようにしたいです。
コンストラクタをprivateにすればいいのかなと思いましたがnewもできなくなるみたいですね。
今はnewInstanceというクラスメソッドを作ってそこから生成していますが、
出来れば、ClassName::newInstance()という記述が嫌なので、
new ClassNameと書ければいいかと思っているのですが。
0778デフォルトの名無しさん
2006/08/13(日) 17:32:58小汚いテクニックを使えばできんこともないだろうけど、
いまのやり方のままのほうがええよ。
0779アナルロックオン
2006/08/13(日) 17:33:57コンストラクタを隠蔽してファクトリメソッドを使うところまでは良し。
で、後は new 演算子をオーバーロードすればいいんじゃね?
0780デフォルトの名無しさん
2006/08/13(日) 18:00:05ttp://www.ogis-ri.co.jp/otc/hiroba/technical/CppUnit/chapter3.html
のサンプルを試しています。
automakeがinstall-shをconfig以下に作るのはいいのですけどconfigure
の方のac_aux_dirが空のままで./configureを実行すると
configure: error: cannot find install-sh or install.sh in . ./.. ./../..
となってMakefileが作られません。
aclocal --acdir=configも試したのですが
aclocal: configure.ac: 6: macro `AM_INIT_AUTOMAKE' not found in library
となってしまいます。今使っているのはautoconf 2.5xなのでサンプル
通りにはいかないのでしょうか?
configureでac_aux_dir=configと手動で設定してやれば./configureは
成功するのですが自動生成する方法はないでしょうか?
0781デフォルトの名無しさん
2006/08/13(日) 19:18:34すれ違いです
http://pc8.2ch.net/test/read.cgi/tech/1148393695/
0782デフォルトの名無しさん
2006/08/13(日) 21:12:16Effective C++の第八章(第三版で)「newとdeleteのカスタマイズ」は読んだ?
0783デフォルトの名無しさん
2006/08/13(日) 21:30:51あちらは過疎ぎみだったのでこちらに書き込みさせて頂いたしだいです。
マルチポストになってしまった。
0784デフォルトの名無しさん
2006/08/13(日) 22:34:19じゃぁどっちでもスルーだね
0785777
2006/08/14(月) 01:10:00名前が長いのが嫌っていうだけなので、小汚いテクニックとなるならば今のままにしておきます。
>>779
オーバロード!?すれば出来そうなのですか?ちょっと調べてみます。
>>782
えっ!?その手のネタが書いてありました!?読み直してみます。
あっ。ウチにあるの第2版でした。
0786デフォルトの名無しさん
2006/08/14(月) 01:31:160787デフォルトの名無しさん
2006/08/14(月) 06:34:28void proc(int iLen)
{
0788デフォルトの名無しさん
2006/08/14(月) 06:36:21void proc(int iLen)
{
char buf[iLen]; ← これ
・・・・
}
gccや、C99で可とか教えてほしいです
0789デフォルトの名無しさん
2006/08/14(月) 06:41:19c99で可。
今のgccはc99対応なので勿論可。
実装はalloca()相当を使うからスタックサイズに注意。
0790デフォルトの名無しさん
2006/08/14(月) 06:56:23即レスサンクス
c99なのか、寝る前に分かって良かった、ありがとう
0791デフォルトの名無しさん
2006/08/14(月) 21:29:13WORDが読めないジャン。。。
readはchar*かwchar_t*のどっちかしかないし。キャストすんのきもいよー。
なんか解決策ありませんか?
0792デフォルトの名無しさん
2006/08/14(月) 21:30:53int i;
WORD w;
};
0793デフォルトの名無しさん
2006/08/14(月) 21:37:51はや!レスサンキュー!!
そういう方法になるのかー。うーん。
DWORD の場合はどうしますか?(32bit符号なし整数の場合。intも32bit)
0794デフォルトの名無しさん
2006/08/14(月) 21:47:27unsigned long ul;
DWORD dw;
};
0795デフォルトの名無しさん
2006/08/14(月) 21:54:17それはどこの処理系?
それはともかく自分でグローバルな関数を作ればよいだけでは?やや面倒かもしれないけど。
template <...>
std::basic_istream<...> operator >>(std::basic_istream<...>, unsigned short&);
0796デフォルトの名無しさん
2006/08/14(月) 21:57:07まぁ、微妙に標準やぶることになるけど気にしない。
0797デフォルトの名無しさん
2006/08/14(月) 22:10:17レスサンキュー。
VC2005EEなんだけど、どうやらunsignedの>>オペレータはどれも無いみたい。あとint64関連も無いみたい。
オペレータオーバーロードはいいけど、ちゃんとsignedで読んでunsignedに代入で反映されるかちょっと不安です。。。
補数とかそういうのあんまり詳しくないんです(汗
*余談*
ビットマップの汎用クラス作ってるんだけど、
構造体のアラインメント関係でガーっと読んでっていうのができない(処理系に依存する)から要素を一個ずつ読んでるのです。
まーこの際そんなこといってる場合じゃないかもしれないけど・・・。
0798デフォルトの名無しさん
2006/08/14(月) 22:42:53allocaとva_argsと例外とsetjmpとWIN構造化例外って排他的関係にならないの?
0799デフォルトの名無しさん
2006/08/14(月) 22:47:42待て待て。VC++ 2005ならある。MSDNにも書いてあるし、実際にヘッダを覘いても書いてある。
http://msdn2.microsoft.com/en-us/library/whtx1k1x.aspx
0800デフォルトの名無しさん
2006/08/14(月) 22:55:56例外を受け取るときには使えないようだが、ほかは問題なさそう。
http://msdn2.microsoft.com/ja-jp/library/wb1s57t5.aspx
排他的関係というのは無いと思う。
allocaとva_argsはスタックの大きさが可変になるだけで特に不都合は考えられない。
VC++なんかだとC++例外処理にはWindowsの構造化例外処理(SEH)を使っている。
Windowsの構造化例外処理(SEH)はsetjmpなんかにも対応している。
たとえばVC++ではコンパイラオプションでSEHを使うよう指定したら、
setjmpでもローカルオブジェクトのデストラクタが呼び出されるようになる。
よそのスレへ行くべきだな、すまん。
0801デフォルトの名無しさん
2006/08/14(月) 22:59:04> VC2005EEなんだけど、どうやらunsignedの>>オペレータはどれも無いみたい。
氏ねや、MS。
>>798
alloca()は標準じゃないので、コンパイラのマニュアル読んでください。
一般的なalloca()の実装では、例外で外に出て、問題ないはずです。
0802デフォルトの名無しさん
2006/08/14(月) 23:03:50va_args は実際に問題が起きることはないだろうが、
va_end が呼ばれないままになる場合は問題が起きても文句は言えない。
0803デフォルトの名無しさん
2006/08/14(月) 23:06:00レスサンキュー。
・・・あれ?ほんとだ。あるなー。
・・・あれ?コンパイル普通に通った。
さっきの格闘はどこへ??
あっれーーーーー!? XP
ごめん。勘違いだった。
ほんとにごめんなさい。
0804デフォルトの名無しさん
2006/08/14(月) 23:11:06氏ねや、MS。
0805デフォルトの名無しさん
2006/08/15(火) 17:53:46void func(const hoge& i=0) { // 参照を引数にして
if (i!=0) i.huga(); // 引数が渡された場合に実行
}
↑こういうことしたいのですが、引数がポインタなら問題ないのですが、
参照の場合operator!=()を定義しないと駄目ですよね。
そこまでするのは大袈裟なので、参照を使いつつ、
簡単に書くお約束の方法があれば知りたいのですが…。
何かいい方法はありますでしょうか。
0806デフォルトの名無しさん
2006/08/15(火) 18:14:42オーバーロードすれば?
0807デフォルトの名無しさん
2006/08/15(火) 18:17:54どうも。実は
func();
func(const hoge&);
という関数が無茶苦茶たくさんあって、
オーバーロードするとコードサイズが倍になってしまうんです。
0808デフォルトの名無しさん
2006/08/15(火) 18:20:13プリプロセッサでサボる
0809デフォルトの名無しさん
2006/08/15(火) 18:34:17func(){ func(0) ; }
func(const hoge & i )
{
if (i != 0) i.huga() ;
}
0810デフォルトの名無しさん
2006/08/15(火) 18:36:390811デフォルトの名無しさん
2006/08/15(火) 18:36:34それは最後の手段に取っておくとして…
>>809
それは…>>805と同じでは。
0812809
2006/08/15(火) 18:38:230813デフォルトの名無しさん
2006/08/15(火) 18:39:35func(const hoge & i )
{
if (i != 0) i.huga() ;
func ();
}
じゃない?
0814813
2006/08/15(火) 18:40:55ifはいらね
func(const hoge & i )
{
i.huga() ;
func ();
}
0815デフォルトの名無しさん
2006/08/15(火) 18:54:47どうも。結局func()とfunc(const hoge&)の両方必要なのは変わらず、
という感じでしょうか(実装部の流用はできますが)。
諦めて全部書こうかな…。
関数宣言が引数やテンプレートの特殊化の組み合わせですごい数に…。
テンプレート引数a種類×関数b種類×…×コンストラクタ引数z種類=('A`)
0816デフォルトの名無しさん
2006/08/15(火) 18:58:420817デフォルトの名無しさん
2006/08/15(火) 19:02:25コンストラクタが関わってくる理由がわからない。
0818デフォルトの名無しさん
2006/08/15(火) 19:11:27何言ってるんですか?頭大丈夫ですか?
とても心配です。お便り待ってます。
0819デフォルトの名無しさん
2006/08/15(火) 19:11:28あぁ、>>815は少し変な書き方でした。すみません。
上でfuncとしていたのは全部コンストラクタです。
仮想コンストラクタにしているので
struct hoge1 {
template <typename T> hoge* create(引数リストA);
template <typename T> hoge* create(引数リストB);
template <typename T> hoge* create(引数リストC);
};
struct hoge2 {...};
struct hoge3 {...};
...
みたいになるということです。
デフォルトの引数で多少なりとも量を減らせるかなと思った次第。
0820デフォルトの名無しさん
2006/08/15(火) 19:27:47俺だったらこーする。
void func(const hoge &i = *(const hoge*)NULL) {
if (&i) i.huga();
}
参照の実装は結局ポインタだからな。
0822デフォルトの名無しさん
2006/08/15(火) 19:48:290823デフォルトの名無しさん
2006/08/15(火) 19:48:560824805
2006/08/15(火) 19:53:500825デフォルトの名無しさん
2006/08/15(火) 20:02:10アホは氏ね
0826デフォルトの名無しさん
2006/08/15(火) 20:06:390827デフォルトの名無しさん
2006/08/15(火) 20:15:12なにそんなに必死になってんの?
0828デフォルトの名無しさん
2006/08/15(火) 20:44:570829デフォルトの名無しさん
2006/08/15(火) 20:56:560830805
2006/08/15(火) 20:57:58んー、参照に未練…。
>>826
参照だと
struct mypred { bool operator()() ... ; } };
func(mypred());
って出来るのがうれしい…。
0831デフォルトの名無しさん
2006/08/15(火) 21:06:52じゃあ必死だなオマエw
0832デフォルトの名無しさん
2006/08/16(水) 05:25:06流れを読まないでレス。
それってポインタならfunc(& mypred());って話?
#中身見てないから意味があるのか知らんけど。
0833デフォルトの名無しさん
2006/08/16(水) 07:52:17if(ifs.is_open() == false) return false;
if(ifs.fail()) return false;
if(ifs.good() == false) return false;
if(ifs.bad() == true) return false;
if(ifs.eof()) return false;
std::ios::iostate state=ifs.rdstate();
if(!(state == std::ios::goodbit)) return false;
0834デフォルトの名無しさん
2006/08/16(水) 08:14:02直前の読み込みなどの結果を反映する静的なものということはないか?
0835デフォルトの名無しさん
2006/08/16(水) 08:31:08レスthx
えーっと、>>演算子の後にチェックをかけたら、エラーを返しました。
チェックのやり方がまずかったみたいです。おかげで何とかなりそうです。
ありがとうです。
0836デフォルトの名無しさん
2006/08/16(水) 08:42:22この手のって、実際に読んでみてから
「読んでみたらエラーだった」「読んでみたらEOFだった」しか
わからないだろ。
で、その結果に応じてフラグを設定するんだから。
いや、ライブラリに限らず、OSのファイルアクセスだってそういう仕組みだし。
0837デフォルトの名無しさん
2006/08/16(水) 09:00:270838デフォルトの名無しさん
2006/08/16(水) 09:08:59なんてのもあるよな。
0839デフォルトの名無しさん
2006/08/16(水) 09:14:10まさか、実装してないとかそういうことじゃないだろうし。うーん。
0840デフォルトの名無しさん
2006/08/16(水) 11:05:380841デフォルトの名無しさん
2006/08/16(水) 11:17:47漢字なら良かったか?
0842デフォルトの名無しさん
2006/08/16(水) 11:21:35それだと「一次変数のアドレスを渡そうとしてる」って警告が出ます。
0843デフォルトの名無しさん
2006/08/16(水) 12:15:42参照だと警告が出ないの?
0844デフォルトの名無しさん
2006/08/16(水) 12:21:32標準でもconst参照は右辺値で初期化できるから、警告になるわけがない。
0845843
2006/08/16(水) 12:39:040846デフォルトの名無しさん
2006/08/16(水) 16:33:16あ!それです!!たぶん。
やっとわかった。(TT;
大分投げやりになってたとこです。
レスが遅くなって申し訳ない。
ありがとうございました。
0847デフォルトの名無しさん
2006/08/16(水) 17:42:04CentOSを使ってC++のプログラミングの勉強をしています
今、mainを書いたファイルとは別にclassを書いた二つのソースを作って、分割コンパイルしてみようと思ったのですが、やり方がさっぱりわかりません
分割コンパイルのやり方はいろんなサイトに乗っているのですが、こういったclassを丸ごと別のソースにするやり方がどこにも書いてないので、困っています
やり方をご存知の方は教えていただけませんでしょうか?
あと、ひょっとしてこういうプログラムの書き方って普通しないものなんでしょうか?
0848デフォルトの名無しさん
2006/08/16(水) 17:46:43やりたいことは、まぁわかった。
あとは、自分でやったことと、その結果(エラーメッセージとか)を
書いてもらわないと話にならん。
0849デフォルトの名無しさん
2006/08/16(水) 17:47:26foo.cpp: Fooの実装
bar.h: clas Bar{}
bar.cpp: Barの実装
main.cpp: #include "foo.h" #include "bar.h"
$ g++ -c foo.cpp
$ g++ -c bar.cpp
$ g++ -c main.cpp
$ g++ -o hoge foo.o bar.o main.o
あるいは
$ g++ -o hoge foo.cpp bar.cpp main.cpp
普通はMakefile書くね。
0850デフォルトの名無しさん
2006/08/16(水) 17:55:48all: hoge
hoge: main.o foo.o bar.o
[TAB]g++ -o $@ $?
main.o: main.cpp foo.h bar.h
foo.o: foo.cpp foo.h
bar.o: bar.cpp bar.h
[TAB]のところはTABキーでインデント。
0851デフォルトの名無しさん
2006/08/16(水) 18:12:29あのものすごいバカな質問してしまうかもしれませんが教えてください
foo.cpp の実装ってなんなんでしょうか?
foo.hに
class foo{
int x;
foo(){
x = 1;
}
}
とか書くとして、foo.cppには何を書けばいいんでしょうか?
0852デフォルトの名無しさん
2006/08/16(水) 18:21:52それで終わりなら foo.cpp 要らない。
0853デフォルトの名無しさん
2006/08/16(水) 18:24:41分割コンパイルの目的からすれば foo.h で foo(); と宣言だけで済ませて、
foo.cpp で foo::foo() { ... } と(実装を加えて)定義する。
0854デフォルトの名無しさん
2006/08/16(水) 18:26:37以下のようにメンバ関数の定義を別ファイルでやる場合に*.cppが必要になる。
こうするとなぜ良いのかというと、class Fooの内容(実装詳細とかいう)が変わっても、
foo.hをincludeしているソースをコンパイルしなくても済むため。
foo.h:
class Foo {
public:
Foo() {}
virtual ~Foo() {}
int open(void);
int close(void);
};
foo.cpp:
int Foo::open(void)
{
}
int Foo::close(void)
{
}
0855デフォルトの名無しさん
2006/08/16(水) 18:51:320856デフォルトの名無しさん
2006/08/16(水) 18:53:40言われたとおりやってみたら、.oファイルは作成できましたが、リンクが上手くできませんでした
エラーがあまりに大量にでているので、全部は書けませんが
GUI.o(.text+0x202): In function `GUI::~GUI()':
: undefined reference to `XCloseDisplay'
のようなものが大量に出ています
コンパイルの仕方に問題があるのでしょうか?
mpiとX Windowを使うので
mpicxx -o -lX11 -L/usr/X11R6/lib main.o GUI.o
としてコンパイルしてみたのですが・・・
0857デフォルトの名無しさん
2006/08/16(水) 18:57:11ライブラリの指定を最後にしてみろ。
こっから先は別スレでやってくれ。 gcc スレでいいんじゃないかな?
0858デフォルトの名無しさん
2006/08/17(木) 03:57:49「いや」という表現がよくなかったかも。
目的に合わないから、とかかな。構文解析とか、scanfみたいなやつで使うと思うんだけども。
http://www.microsoft.com/japan/developer/library/vccore/_crt_ungetc.2c_.ungetwc.htm
C++から離れてしまって申し訳ない。
0859デフォルトの名無しさん
2006/08/17(木) 17:17:26選択して、あれこれ書き込みたい) のですが、コンパイルエラーが出ます。ストリーム
は複製できない、というのが理由だと思うのですが、かといって s2() から auto 変数
への参照を返すこともできないし… (Java なら GC されるまでストリームが消えない
ので平気なのですが)。どうするのがよいのでしょう?
#include <cstdlib>
#include <ctime>
#include <fstream>
#include <iostream>
using namespace std;
ostream s1() { return cout; }
ostream s2() { return ofstream("foo.log"); }
int main()
{
srand(time(NULL));
ostream out(rand() % 2 == 0 ? s1() : s2());
out << "foo" << endl;
out << "bar" << endl;
// and more...
return 0;
}
0860859
2006/08/17(木) 17:17:59foo.cc: In copy constructor `std::basic_ios<char, std::char_traits<char> >::basic_ios(const std::basic_ios<char, std::char_traits<char> >&)':
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/ios_base.h:781: error: `std::ios_base::ios_base(const std::ios_base&)' is private
foo.cc:7: error: within this context
foo.cc: In copy constructor `std::basic_filebuf<char, std::char_traits<char> >::basic_filebuf(const std::basic_filebuf<char, std::char_traits<char> >&)':
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/streambuf:769: error: `std::basic_streambuf<_CharT, _Traits>::basic_streambuf(const std::basic_streambuf<_CharT, _Traits>&) [with _CharT = char, _Traits = std::char_traits<char>]' is private
foo.cc:8: error: within this context
0861デフォルトの名無しさん
2006/08/17(木) 17:26:24std::ostream* out =
argc > 1 ?
new std::ofstream( argv[1] ):
new std::ostream( std::cout.rdbuf() );
*out << "foo" << std::endl;
// and more
delete out;
0863デフォルトの名無しさん
2006/08/19(土) 02:11:52http://ex16.2ch.net/test/read.cgi/news4vip/1155903854/
>>1(巨乳・ナンパ多し) 会社の先輩
年齢:23歳 年齢:33歳 ♂
彼氏いない暦:半年 彼女いない暦:恐らく年齢
身長:158�a 身長:160cmくらい
体重:51�` 体重:80�`くらい
先輩は>>1がVIPPERとは知らない
Sサイズのシャツから肉がはみ出てる
変にオサレぶってかっこつけてキモイ。
でもオバサマには人気ある
上司とすげー仲良い(信頼されてる)
メールの内容
「今日は楽しかったおo(^ω^)o 注)一緒に帰っただけ
また月曜に会おうNe星
ちゃんとお風呂入るんだおwwwww」
「俺はインターネッツに詳しい」と豪語(ry
会社が終わるとロッカー前で毎日待ち伏せ
→同じ路線なので着いてこられる
→「本屋に寄るから」と断ると一緒に来る
→「今度一緒に映画行こうか(^ω^)」
→断ると以下ループ
0864デフォルトの名無しさん
2006/08/19(土) 13:14:49#include <fstream>
using namespace std;
int main () {
int length;
char * buffer;
ifstream is;
is.open ("test.txt", ios::binary );
// get length of file:
is.seekg (0, ios::end);
length = is.tellg();
is.seekg (0, ios::beg);
// allocate memory:
buffer = new char [length];
// read data as a block:
is.read (buffer,length);
is.close();
cout.write (buffer,length);
return 0;
}
このコードで5Gくらいのファイルを読むと処理に時間がかかるんですが
どういった方法で読み込んで処理すればよいでしょうか?
0865デフォルトの名無しさん
2006/08/19(土) 13:23:21速度はきわめて環境に依存するので各環境スレへどうぞ。
#その場合、OS、コンパイラ、CPU、ディスクなどの情報も忘れずに。
目安としては、そのファイルをできる限りシンプルな方法でコピーしてみて
その所要時間より速くはできないと思っておけばいい。
0866デフォルトの名無しさん
2006/08/19(土) 13:27:240867デフォルトの名無しさん
2006/08/19(土) 13:30:46template<class x>
struct id{
typedef x::result result;
};
とすると宣言するだけで
warning C4346: 'x::result' : 依存名は型ではありません。
error C2146: 構文エラー : ';' が、識別子 'result' の前に必要です。
error C2501: 'id<x>::result' : 識別名を宣言するのに、型が指定されていません。
とエラーになってしまいます.(VC)
どうすればよいでしょうか.
0868デフォルトの名無しさん
2006/08/19(土) 13:35:09やりたいことを全部書け
0869デフォルトの名無しさん
2006/08/19(土) 14:09:17コンパイラはx::resultが型かどうかわからない。
テンプレートの初歩からやり直すべき。
template < typename T >
struct id
{
typedef typename T::result result ;
} ;
0870デフォルトの名無しさん
2006/08/19(土) 15:51:24ありがとうございます.解決しました.
初歩からやり直してきます…
0871デフォルトの名無しさん
2006/08/19(土) 16:25:03どちらも同じ物が返ってるようなのですが。
0872デフォルトの名無しさん
2006/08/19(土) 16:34:06dataは\0で終わってるとは限らない。
0873デフォルトの名無しさん
2006/08/19(土) 16:36:43ありがとうございました
0874デフォルトの名無しさん
2006/08/19(土) 16:39:35毎日シコシコとコンピュータばっかいじってないで、お外に出て遊べよ
おれはこの真夏の光の中を走ってきたぜ
0875デフォルトの名無しさん
2006/08/19(土) 16:55:550876デフォルトの名無しさん
2006/08/19(土) 17:12:03void print()の行をぬくとコンパイルできます。
#include <iostream>
using namespace std;
class Entry {
public:
Entry(string& name) { theName = name; }
void print() { cout << theName << endl; }
private:
string theName;
};
int main()
{
return 0;
}
0877デフォルトの名無しさん
2006/08/19(土) 17:12:48error C2679: 二項演算子 '<<' : 型 'std::string' の右オペランドを扱う演算子が見つかりません (または変換できません)。
です。意味がわかりません・・・
0878デフォルトの名無しさん
2006/08/19(土) 17:13:45#include <string>
0879デフォルトの名無しさん
2006/08/19(土) 17:16:28あ、コンパイルはできました。ありがとうございます。
・・・でもincludeしてなかったのに
private
string theName;
でコンパイルエラーでなかったんですが。
0880デフォルトの名無しさん
2006/08/19(土) 17:23:22<iostream>ではstringの定義部分だけインクルードされてたのだろう。
0881デフォルトの名無しさん
2006/08/19(土) 17:33:02何か複雑みたいなのでstring使うときはincludeすることにします。
0882デフォルトの名無しさん
2006/08/19(土) 17:34:50実用ならboost::mpl::identity使えよ。
やっていることは全く同じだから。
0883デフォルトの名無しさん
2006/08/19(土) 17:43:09宣言があっただけだろ。
>>881
まぁ、std::stringを使うなら<string>をインクルードしておけってこった。
0884デフォルトの名無しさん
2006/08/19(土) 17:46:19やってることが全く同じだったら、boostを使う必要は無いのでは?
0885デフォルトの名無しさん
2006/08/19(土) 19:05:51宣言だけだと theName = name やEntryのメンバtheNameでエラーになると思うよ。
0886デフォルトの名無しさん
2006/08/19(土) 19:32:050887デフォルトの名無しさん
2006/08/20(日) 10:10:40c++の関数やiostream、STLを詳しく書いてあるサイトはありますか?
ないなら英語でいいので教えてください。
0888デフォルトの名無しさん
2006/08/20(日) 10:20:14詳しくは無いかもしれんが。
http://www.cppreference.com/
http://www.cppll.jp/cppreference/
次スレではテンプレに入れよう。
詳しいやつは、規格書を見るのが手っ取り早いな。
英語でもいいなら >>5 のリンク先からどうぞ。
0889デフォルトの名無しさん
2006/08/20(日) 16:32:050890デフォルトの名無しさん
2006/08/21(月) 13:00:10ms-help://MS.MSDNQTR.2004JAN.1041/vcstdlib/html/vcoriStandardCLibraryReference.htm
0891デフォルトの名無しさん
2006/08/21(月) 13:03:08http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang98/HTML/IOS_basic_ios.asp
0892891
2006/08/21(月) 13:04:08http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang98/HTML/vclanghm.asp?frame=true
0893デフォルトの名無しさん
2006/08/21(月) 20:29:18ttp://www.microsoft.com/japan/developer/library/vclang/stdlbhm.htm
0894デフォルトの名無しさん
2006/08/21(月) 20:55:31class buf{
char* buf_;//ここにバッファが確保されているとする
template <typename T>
T operator [](size_t idx);
};
を定義して、[]演算子でアクセスしようと思ったんですが、どう書けばいいのかわかりません
template <typename T>
T get(size_t idx); など関数を定義すれば
buf b;
int val;
val = b.get<int>(0x0012);//バッファ内の0x0012をintとして取り出す
可能なんですが・・・
val = b[0x0012]<int>;//こんなかんじ???
0895デフォルトの名無しさん
2006/08/21(月) 21:01:28本当にこんなことがやりたいかどうかは知らん。
0896デフォルトの名無しさん
2006/08/21(月) 21:20:03ttp://www.tietew.jp/cppll/archive/1071
ちょっと違うだろうが参考にはなるだろ。
0897デフォルトの名無しさん
2006/08/21(月) 21:29:38私もその呼び出し形式は考えたんですが、
そこまでやるならget()等通常のメンバ関数呼び出しにしようかなと・・
>>896
ありがとうございます
読んでみます
0898デフォルトの名無しさん
2006/08/21(月) 22:26:00int *a;
a=(int *)malloc(5*sizeof(int));
こうするとa[0]からa[4]まで使えますが、
後から配列の要素数を減らして不要な配列を解法したいときはどうすればいいんでしょうか?
free((a+2));
とかやるとa[0]とa[1]だけ使えてa[2]から先は開放されるんでしょうか?
0899デフォルトの名無しさん
2006/08/21(月) 22:35:41realloc
C++ならstd::vector使った方が楽。
0900デフォルトの名無しさん
2006/08/21(月) 22:39:54ありがとうございます。
0901デフォルトの名無しさん
2006/08/21(月) 22:54:03swap使え
が正しい答えじゃね?
0902デフォルトの名無しさん
2006/08/21(月) 22:56:050904デフォルトの名無しさん
2006/08/21(月) 23:01:28AがBを後方参照できないんだけど、回避策あるかなあ?
class B;
class A{
public:
void f(B& b){}
};
template<class T>
class BBase{
public:
};
typedef BBase<int> B;
int main(){
Bb;
}
0905デフォルトの名無しさん
2006/08/21(月) 23:01:42内部で確保されているメモリは減らないけどね。
0906デフォルトの名無しさん
2006/08/21(月) 23:10:500907デフォルトの名無しさん
2006/08/21(月) 23:51:47たぶん、そういうレスのために>>901を用意していたのだろう。
↓「でも、OSにメモリが・・・」
0908デフォルトの名無しさん
2006/08/22(火) 00:31:28前方宣言は正しく
0909デフォルトの名無しさん
2006/08/22(火) 02:43:46?
0910デフォルトの名無しさん
2006/08/22(火) 03:00:32Aの前でBをtypedefするか
A::fをメンバ関数テンプレートにするか
くらいかなぁ?
0911デフォルトの名無しさん
2006/08/22(火) 03:40:11typedef BBase<int> B;
class A{
public:
void f(B& b){}
};
template<class T>
class BBase{
public:
};
0912デフォルトの名無しさん
2006/08/22(火) 03:44:39template<class T> class BBase;
typedef BBase<int> B;
class A { ... };
だけど、そういうこと言ってるんじゃなくて、
class Bというのが別にあって、
それがtypedefした名前とぶつかってるって話だよね。
例えば、struct statなんてのは、関数のstat()と名前がかぶっているんだけど
直前に"struct"を付ける事で回避できる(同じスコープで同時に使用できる)から
class Bに限っては、直前に"class"をつければ使えるかもしれないね。
試してないけど。
0913デフォルトの名無しさん
2006/08/22(火) 04:15:06すんません、絡まってたんでわかりずらかったんですが、
911,912さんので解決です。どうもです。
0914デフォルトの名無しさん
2006/08/22(火) 07:28:35を
class B;
で前方宣言したつもりだったのか。
そりゃうまくいかない。
0915デフォルトの名無しさん
2006/08/22(火) 17:45:03このソースの+とはどういう意味なのでしょうか?
0916デフォルトの名無しさん
2006/08/22(火) 17:46:11おそらく&_iconGroupData[offset]と同じこと。
0917デフォルトの名無しさん
2006/08/22(火) 18:13:35SGIのサイト見ろや。
0918デフォルトの名無しさん
2006/08/22(火) 18:16:46通常、サイズ変更は大きなコストを支払うことになるから、
あらかじめ適切なサイズを確保することにしたり、
一時領域を使い廻したりすることを考えた方がよいことがある。
0919デフォルトの名無しさん
2006/08/23(水) 00:13:26こうですか!? わかりません!
http://www.sgi.org/
0920デフォルトの名無しさん
2006/08/23(水) 01:33:03メソッドを全く持たない class foo があったとして、
foo を弄らずに foo::bar() を後から定義して
myfoo.bar() みたいな感じで呼び出すみたいな。
0921デフォルトの名無しさん
2006/08/23(水) 01:34:400922デフォルトの名無しさん
2006/08/23(水) 01:36:57クラス定義内で宣言した奴を外で定義できる。
クラス定義外でメンバの宣言を追加すことは出来ない。
0923デフォルトの名無しさん
2006/08/23(水) 01:40:060924デフォルトの名無しさん
2006/08/23(水) 01:47:16クラス定義内で宣言していないメソッドを追加する事が出来ないかなと考えていました。
特に必要なわけではないのですが、文法上問題無さそうなのに何でだろうと思いまして。
0925デフォルトの名無しさん
2006/08/23(水) 01:50:12勝手にメンバ関数追加できたら private も糞もねーな。
0926デフォルトの名無しさん
2006/08/23(水) 02:38:230927デフォルトの名無しさん
2006/08/23(水) 03:16:58ヤマシタ! ヤマシタ! オマエズルイモン!
0928デフォルトの名無しさん
2006/08/23(水) 04:39:56private は考えてませんでした。
後から定義したメソッドからはアクセス不可にするのでも良いような気がしますが、
言語仕様としては複雑になってしまいますね。
アウターワールドは開始直後のワカメみたいなのに殺されて以来プレイしていません。
0929デフォルトの名無しさん
2006/08/23(水) 05:12:100930デフォルトの名無しさん
2006/08/23(水) 08:35:34そもそもC++をなんでもありと思うのが間違い。
C++(に限らないことのはずだが)どんな機能もそれにはきちんとした必要性があったから導入された。
あ、でももしoperator .の多重定義ができるようになったとしたら、
外見上924の考えているのと同じことになりそうだけど。
0931デフォルトの名無しさん
2006/08/23(水) 09:49:58とりえあず>>920はgeneric function風の
bar(myfoo)の多重定義で我慢して。
0932デフォルトの名無しさん
2006/08/23(水) 10:17:20template< typename Function, class T > class dynamic_method {
Function fun; T * obj;
public:
typedef typename function_traits
< typename remove_pointer<Function>::type >::result_type result_type;
dynamic_method( Function fun, T * obj ) : fun( fun ), obj( obj ) {}
result_type operator()() const {
return fun( *obj );
}
template< typename A1 > result_type operator()( A1 & a1 ) const {
return fun( *obj, a1 );
}
};
template< typename T > struct use_dynamic_method {
template< typename Function >
dynamic_method< Function, T > operator->*( Function func ) {
return dynamic_method< Function, T >( func, static_cast<T*>(this) );
}
};
class foo : public use_dynamic_method<foo> {};
void bar( foo & obj, char const * message ) { cout << message << endl; }
int main() {
foo myfoo;
(myfoo->*bar)("dynamic call");
}
変態とか言うな
0933デフォルトの名無しさん
2006/08/23(水) 11:13:010934デフォルトの名無しさん
2006/08/23(水) 11:32:530935デフォルトの名無しさん
2006/08/23(水) 11:58:14あ…
さ、最初は連想配列に、function オブジェクト突っ込んでほんとに動的に追加できるように
しようと思ってたけど、可変引数に対応させようと色気だしてごちゃごちゃやっているうちに
静的になってしまったんだよ。ホントだよ。
呼び出し方は、↓のように文字列か、数字をキーにしようと思ってた。
(myfoo->*"bar") = function< void ( foo & ) >( bar ); // 関数追加
(myfoo->*"bar")();
(myfoo->*"dar")(); // throw そんな関数は存在しない例外
見たいな。
ちなみに、仮想関数的な振る舞いは最初から考慮しておりません。
0936デフォルトの名無しさん
2006/08/23(水) 12:00:030937デフォルトの名無しさん
2006/08/23(水) 12:15:46template<typename T, typename Functor>
boost::function<void ()>
operator ->*(T obj, Functor f)
{
return boost::bind(f, obj);
}
class Hoge {};
void hello(Hoge) {std::cout << "Hello" << std::endl;}
int main()
{
Hoge hoge;
(hoge->*hello)();
}
0938デフォルトの名無しさん
2006/08/23(水) 15:09:23それだと、複数引数に対応できないから、無理に operator->* 使うより
普通に hello( hoge ); で呼んだほうがええね。
0939デフォルトの名無しさん
2006/08/23(水) 21:17:49よくわからないけど凄い。
ちなみに
template< typename Function >
dynamic_method< Function, T > operator->*( Function func ) {
のtemplate引数Functionは明示的にinstantiateされていないけど、
コンパイラが自動的に推測してくれるのでしょうか?
(myfoo->*bar)("dynamic call");
で利用されているからFunction = void (foo&, char const *)とか
0940デフォルトの名無しさん
2006/08/23(水) 23:25:02たのむ
0941デフォルトの名無しさん
2006/08/24(木) 00:45:35>>932じゃないけど解説してみる。
use_dynamic_methodをCRTPでpublic継承すると、operator ->* () が使えるようになる。
operator ->* ()は、関数オブジェクトを引数にとり、dynamic_method型のオブジェクトを返す。
ここでいう関数オブジェクトとは、use_dynamicmethodを継承するクラスへの参照と、任意の型を引数に取るもののこと。
ここでは、任意の型はひとつしか引数の取れないが、
dynamic_methodをちょっといじれば、現実的に問題のないくらい多数の引数を取るようにもできる。
dynamic_methodは、関数オブジェクトのラッパ。
使用例を分かりやすく書くと
myfoo.operator->*(bar) ("dynamic call") ;
operator->*を呼び出すことで、dynamic_method型のオブジェクトが返される。
で、そのoperator()()が呼び出されることで、実際の本当に呼び出したい関数オブジェクト、barが呼び出される。
でもまあ、bar(myfoo) ; でいいじゃんというのはまた別の話
0942941
2006/08/24(木) 01:02:030943デフォルトの名無しさん
2006/08/24(木) 16:51:28template< typename T > struct dynacall {
T & o;
any & c;
dynacall( T * object, any & content ) : o( *object ), c( content ) {}
template< typename R > R operator()( type<R> ) {
return (any_cast< function< R ( T & ) > >(c))(o);
}
template< typename R, typename A1 > R operator()( type<R>, A1 a1 ) {
return (any_cast< function< R ( T &, A1 ) > >(c))(o,a1);
}
template< typename R > R value_of() const { return any_cast< R >(c); }
};
template< typename T > struct prototype {
typedef map< string, any > map_type;
map_type m;
dynacall<T> operator->*( typename map_type::size_type index ) {
typename map_type::iterator it = m.begin();
advance( it, index );
return dynacall<T>( static_cast<T*>(this), it->second );
}
dynacall<T> operator->*( typename map_type::key_type const & key ) {
return dynacall<T>( static_cast<T*>(this), m[key] );
}
template< typename F > void register_fun( typename map_type::key_type const & key, F f ) {
m[key] = function< remove_pointer<F>::type >(f);
}
template< typename V > void register_val( typename map_type::key_type const & key, V v ) {
m[key] = v;
}
};
0944943
2006/08/24(木) 16:55:13class foo : public prototype<foo> {};
int bar( foo & x, int a ) { return a; }
int main() {
foo myfoo;
myfoo.register_fun( "bar", bar );
myfoo.register_val( "hage", 12 );
cout << (myfoo->*"bar")( type<int>(), 10 ) << endl; // 10 と表示
cout << (myfoo->*0)( type<int>(), 20 ) << endl; // 20 と表示
cout << (myfoo->*1).value_of<int>() << endl; // 12 と表示
}
どうみても変態です。
必要なヘッダは、<boost/any.hpp> や、<boost/function.hpp> など。
良い子でなくてもマネしちゃだめ。
0945デフォルトの名無しさん
2006/08/24(木) 17:27:13でも、C++0xの標準ライブラリに入ることが予定されているんだよな……。
0946デフォルトの名無しさん
2006/08/24(木) 17:40:040947デフォルトの名無しさん
2006/08/24(木) 18:54:400948デフォルトの名無しさん
2006/08/24(木) 19:24:14関数f の引数として、関数ポインタを渡す場合、f( bar ) と記述してもいいことになってます。
なので、(myfoo->*bar) は、(myfoo->*&bar) と同じ意味になります。
よって、Function の型は、「 void (*)( foo &, char const * ) 」 つまり関数ポインタ型。
このままだと、function_traits に渡せないので、remove_pointer して、「 void ( foo &, char const * ) 」にしているわけです。
0949943
2006/08/24(木) 19:42:30冷静になると、ぜんぜん prototype ってカンジじゃねーな。
map_type m; を、static map_type m; にすれば、少しは prototype っぽくなるかも。
0950デフォルトの名無しさん
2006/08/24(木) 23:49:42どうもありがとうございます。普通のtemplate classの場合と違って、
myfoo->*<void (*)(foo&, char const *)>bar
と書かなくて良いのは、何か特例なんでしょうか?
0951デフォルトの名無しさん
2006/08/25(金) 00:02:19関数テンプレートのテンプレート引数は引数の型から推論される。
std::max(4, 2);などと書けるのと同じ。
0952デフォルトの名無しさん
2006/08/25(金) 00:04:040953デフォルトの名無しさん
2006/08/25(金) 00:08:30class Camera;
などのような使用クラスの宣言とはどんなものなのでしょうか?
ヘッダファイルに書いてあったのですが。
入門書などではClass Camera{---}; Camera camera1;などのように宣言
してありチンプンカンプンです。
0954デフォルトの名無しさん
2006/08/25(金) 00:11:08Cameraがクラスであることを宣言するが、どんなクラスであるかの定義は行わない。
0956デフォルトの名無しさん
2006/08/25(金) 00:53:23なるほど、有難うございました.。
0957デフォルトの名無しさん
2006/08/25(金) 20:17:19できましたっけ?
template<class T>
T GetMaxSize(T t){}
的な感じで。
0958デフォルトの名無しさん
2006/08/25(金) 20:21:39template<typename T>
T GetMaxSize(const T&){
return std::numeric_limits<T>::max();
}
0959デフォルトの名無しさん
2006/08/25(金) 20:35:14return (T)(-1);
的な感じでできるかなと思ってましたが、unsignedとsignedの見分けが・・
とか思ってました。numeric_limitsは特殊化で全型分用意してるみたいですね。
最近自分のコードの型あふれに対する対処がすごく甘いなあと。
なんというか包括的な対処法っていうのはなんかないんですかねえ。(例外飛ばすとか)
みなさんどうしてますか?
0960デフォルトの名無しさん
2006/08/25(金) 22:24:370961デフォルトの名無しさん
2006/08/25(金) 23:25:17お前だけだよ
0962デフォルトの名無しさん
2006/08/25(金) 23:52:530963デフォルトの名無しさん
2006/08/26(土) 00:00:060964デフォルトの名無しさん
2006/08/26(土) 00:15:050965デフォルトの名無しさん
2006/08/26(土) 00:21:48> unsigned long l=std::numeric_limits<unsigned long>::max();
> // This works, because unsigned integral types cannot cause overflow.
> unsigned char c=numeric_cast<unsigned char>(l);
エエェェ(´Д`)ェェエ
0966デフォルトの名無しさん
2006/08/26(土) 00:51:57ありがとうございます。たぶん解決しそうです。
>>965
今のところunsignedでも動いてます
0967デフォルトの名無しさん
2006/08/26(土) 00:54:07>>962
ありがとうございます。たぶん解決しそうです。
>>965
今のところunsignedでも動いてます
0968デフォルトの名無しさん
2006/08/26(土) 01:00:51いちいち例外投げられたら面倒でやりきれないからじゃないの?
と勝手に想像してみる。
0969デフォルトの名無しさん
2006/08/26(土) 01:11:460970デフォルトの名無しさん
2006/08/26(土) 01:14:26numeric_cast<int>(i * 3)
とかしなくちゃいけなくなるな
0971デフォルトの名無しさん
2006/08/26(土) 01:16:21int * 3 の評価の時点でオーバーフローする場合、
オーバーフローの結果である int 型の値に対して
numeric_cast<int> しても意味無い。
0972デフォルトの名無しさん
2006/08/26(土) 01:24:330973デフォルトの名無しさん
2006/08/26(土) 01:29:500974デフォルトの名無しさん
2006/08/26(土) 01:30:18int i2 = numeric_cast<int>(i * 3);
iの3倍をi2に入れるときにbad_numeric_castを出させるには
こうするしかないでしょ。
0975デフォルトの名無しさん
2006/08/26(土) 01:36:57i の型は何だ? int 以下のサイズの整数型なら、その numeric_cast は利かないだろう。
0976デフォルトの名無しさん
2006/08/26(土) 01:38:13boostばかり使っていると、こういう馬鹿になりますよ。
0977デフォルトの名無しさん
2006/08/26(土) 01:45:24演算のオーバーフローについてチェックしてくれてるわけじゃないから
0978デフォルトの名無しさん
2006/08/26(土) 01:47:060979デフォルトの名無しさん
2006/08/26(土) 01:50:04それは次のコードと等しい。
int temp = i * 3;
int i2 = numeric_cast<int>(temp);
お前が望んでいる動作は、仮にsizeof (int) < sizeof (long)だとすれば、一例だが次のような感じになる。
int i2 = numeric_cast<int>(implicit_cast<long>(i) * 3);
それとも、もしやiはint型ではないと言うつもりか?
0980デフォルトの名無しさん
2006/08/26(土) 01:52:290981デフォルトの名無しさん
2006/08/26(土) 01:53:10int i;
i = ???;
int i2 = i * 3;
毎回if(i < INT_MAX/3)みたいに事前にあふれチェック?
0982デフォルトの名無しさん
2006/08/26(土) 01:55:350983デフォルトの名無しさん
2006/08/26(土) 02:02:19なんか難しいこと言ったか?例えばC#はchecked blockとかで演算の
オーバーフローをチェックできるだろ?
0984デフォルトの名無しさん
2006/08/26(土) 02:04:200985デフォルトの名無しさん
2006/08/26(土) 02:05:340986デフォルトの名無しさん
2006/08/26(土) 02:06:42ずいぶん頭悪いんだね。。
0987デフォルトの名無しさん
2006/08/26(土) 02:07:53アホ。関連レスを最初から読め。
0988デフォルトの名無しさん
2006/08/26(土) 02:14:46ついてチェックしてくれるだけで、演算についてはしてくれないだろ?
じゃあ、演算についてはどうするんだ?C#はcheckedとかあるよな?
で、C++ってどうすりゃいいんだったっけ?と言っただけだがまだ難しいか?
0989デフォルトの名無しさん
2006/08/26(土) 02:15:36なぜ「あれ?じゃ・・・」なのか意味不明だが、ケースバイケースだな。
0990デフォルトの名無しさん
2006/08/26(土) 02:16:42まさか本当に「難しいから回答が得られない」と思ってるわけではないだろうな。
0991デフォルトの名無しさん
2006/08/26(土) 02:17:400992v(^・^)v
2006/08/26(土) 02:18:15C++相談室 part52
http://pc8.2ch.net/test/read.cgi/tech/1156525695/
0994デフォルトの名無しさん
2006/08/26(土) 02:20:57むしろ例外を投げてくれた方がありがたいよ。
0995デフォルトの名無しさん
2006/08/26(土) 02:20:57で?
0996デフォルトの名無しさん
2006/08/26(土) 02:23:10何が「で?」だよw
答え知りたいなら、それなりの質問態度でなw
0997デフォルトの名無しさん
2006/08/26(土) 02:24:540998デフォルトの名無しさん
2006/08/26(土) 02:26:090999デフォルトの名無しさん
2006/08/26(土) 02:27:141000デフォルトの名無しさん
2006/08/26(土) 02:27:44素で間違えた。ハズカシー
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。