■過去ログ置き場に戻る■ 1- 次250 最新50


[memo] "9999999999_00.html#R20" という感じで、URLの最後に "#RレスNo" を追加すると幸せになれます。

C++相談室 part51
1 名前:v(^・^)v :2006/07/17(月) 04:48:17
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE(VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

テンプレその他 >>1-15 付近参照

前スレ
C++相談室 part50
http://pc8.2ch.net/test/read.cgi/tech/1149427282/

2 名前:v(^・^)v :2006/07/17(月) 04:50:53
1 http://piza.2ch.net/tech/kako/980/980175292.html
2 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

3 名前:v(^・^)v :2006/07/17(月) 04:51:25
16 http://pc5.2ch.net/tech/kako/1045/10457/1045746245.html
17 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/

4 名前:v(^・^)v :2006/07/17(月) 04:52:24
31 http://pc5.2ch.net/test/read.cgi/tech/1086185282/
32 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/

5 名前:v(^・^)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より新しい)ドラフトがダウンロードできる。

6 名前:v(^・^)v :2006/07/17(月) 05:31:23
■Books■
amazon.com C,C++関連書籍
 http://www.amazon.com/exec/obidos/tg/browse/-/3956/ref=br_bx_c_1_3/

The C++ Programming Language
 ttp://www.amazon.com/exec/obidos/ASIN/0201700735/
 ttp://www.amazon.co.jp/exec/obidos/ASIN/475611895X/ (翻訳)
C++ Primer (3rd Edition)
 ttp://www.amazon.com/exec/obidos/ASIN/0201824701/
 ttp://www.amazon.co.jp/exec/obidos/ASIN/4756140068/ (翻訳)
The C++ Standard Library
 ttp://www.amazon.com/exec/obidos/ASIN/0201379260/
 ttp://www.amazon.co.jp/exec/obidos/ASIN/4756137156/ (翻訳)
Effective C++
 ttp://www.amazon.com/exec/obidos/ASIN/0201924889/
 ttp://www.amazon.co.jp/exec/obidos/ASIN/4756118089/ (翻訳)
More Effective C++
 ttp://www.amazon.com/exec/obidos/ASIN/020163371X/
 ttp://www.amazon.co.jp/exec/obidos/ASIN/4756118534/ (翻訳)
Exceptional C++
 ttp://www.amazon.com/exec/obidos/ASIN/0201615622/
 ttp://www.amazon.co.jp/exec/obidos/ASIN/4894712709/ (翻訳)
More Exceptional C++
 ttp://www.amazon.com/exec/obidos/ASIN/020170434X/
Exceptional C++ Style
 ttp://www.amazon.com/exec/obidos/ASIN/0201760428/
C++ Coding Standards
 ttp://www.amazon.co.jp/exec/obidos/ASIN/0321113586/
 ttp://www.amazon.co.jp/exec/obidos/ASIN/4894716860/ (翻訳)

7 名前:v(^・^)v :2006/07/17(月) 05:31:55
■Books(Templateまわり)■
Effective STL
 http://www.amazon.com/exec/obidos/ASIN/0201749629/
 http://www.amazon.co.jp/exec/obidos/ASIN/4894714108/ (翻訳)
Modern C++ Design
 http://www.amazon.com/exec/obidos/ASIN/0201704315/
 http://www.amazon.co.jp/exec/obidos/ASIN/4894714353/ (翻訳)
C++ Templates
 http://www.amazon.com/exec/obidos/ASIN/0201734842/
C++ Template Metaprogramming
 http://www.amazon.com/exec/obidos/ASIN/0321227255/

8 名前:v(^・^)v :2006/07/17(月) 05:32:31
■Libraries■
[Boost]
 Boost http://www.boost.org/
 (日本語) http://www.kmonos.net/alang/boost/
 (日本語) http://shinh.skr.jp/boost/
[標準ライブラリ]
 SGI-STL http://www.sgi.com/tech/stl/
 STLport http://stlport.sourceforge.net/
 GNU libstdc++ http://gcc.gnu.org/libstdc++/
 Apache STDCXX http://incubator.apache.org/stdcxx/
 STLFilt http://www.bdsoft.com/tools/stlfilt.html
 (日本語) http://www005.upp.so-net.ne.jp/episteme/html/stlprog/
 (日本語) http://www.wakhok.ac.jp/~sumi/stl/
[Loki]
 http://sourceforge.net/projects/loki-lib/
 LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport

9 名前:v(^・^)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/

10 名前:v(^・^)v :2006/07/17(月) 05:35:33
テンプレ終了。例のやつは、そろそろ飽きたんで好きな人は勝手にやって。

11 名前:デフォルトの名無しさん :2006/07/17(月) 06:25:58
STLつかうと一気に実行ファイルサイズが10倍に?!

環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。

すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。


C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?

#include <stdafx.h>
後死ね。

言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。

12 名前:デフォルトの名無しさん :2006/07/17(月) 06:27:31
>>11


13 名前:デフォルトの名無しさん :2006/07/17(月) 07:06:31
>STLつかうと一気に実行ファイルサイズが10倍に?!

懐かしいwこれ書いたの俺だww

14 名前:デフォルトの名無しさん :2006/07/17(月) 08:02:50
>環境によるだろ。

懐かしいwこれ書いたの俺←本当です。

15 名前:デフォルトの名無しさん :2006/07/17(月) 08:08:49
>>14
ほんと!?
このスレって3人くらいしかいないんじゃないの?

じゃぁ指摘してあげる。

>ランタイムを使用するようにして使っているが、例えばstd::vectorを
>使っても使わない時と比べ10Kほどしか増えない。

これさ、テンプレート引数を変えるたびに10KBずつ増えるってことでしょ?
それぞれ別のクラスに対するvectorが10個あったら100KBだよね?
100個あったら1MB。
環境によらず、一気に10倍なんじゃないの?

ちなみに俺が10倍って書いたのは冗談だよw

16 名前:デフォルトの名無しさん :2006/07/17(月) 08:26:57
>>15
いや、今はさすがにわかってる。

BCCのバージョンもBDS2006のを使ってるから5.82に上がってるし。
わざわざ書いてくれてスマン。あの頃は俺も初心者だった。

17 名前:デフォルトの名無しさん :2006/07/17(月) 10:48:02
和んだ

18 名前:デフォルトの名無しさん :2006/07/17(月) 11:38:33
流されてしまったようなのでもう一度お願いします
class C {
public:
    void setHoge(@) { ... }
    A getHoge() { ... }
private:
    tr1::shared_ptr<Hoge> hoge_;
};
このようなクラスがあったとき、@とAはHoge*かtr1::shared_ptr<Hoge>の
どちらにするのがいいのでしょうか?
Aはユーザーが誤ってdeleteできないようにtr1::shared_ptrを返す
べきとは思うのですが

19 名前:デフォルトの名無しさん :2006/07/17(月) 12:49:30
この辺もテンプレにいれてみよう。

Guru 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/

20 名前:デフォルトの名無しさん :2006/07/17(月) 12:54:38
>>18
俺だったら1も2もshared_ptrにするな。

21 名前:デフォルトの名無しさん :2006/07/17(月) 13:14:40
>>18
その2択なら shared_ptr しかあり得ない。 Hoge* を使うと
- set に new されてないポインタが渡されたら...
- 気づいているようだが get で返したポインタを delete されたら...

前スレで言われてたように、ポインタの set/get なんて無くすことができれば
一番いいんだけどね。

22 名前:デフォルトの名無しさん :2006/07/17(月) 13:31:18
setterはもうアンチパターンだな

23 名前:デフォルトの名無しさん :2006/07/17(月) 13:31:26
>set に new されてないポインタが渡されたら...
というのはshared_ptrを知っているユーザーなら決して
newしてないオブジェクトを渡さないから少しはマシってことでしょうか?

set/get はない方がいいとは思いますがあらゆるものが不足してなくせないんです
interfaceをどうとかと言っていた方がいましたが・・

24 名前:デフォルトの名無しさん :2006/07/17(月) 13:35:06
>>22
例えば、

class Person {
public:
explicit Person(int age) : age_(age) {}
...
private:
    int age_;
};

のようなクラスがあった場合もsetはない方がよいですか?
時代はImmutableなのでしょうか?

25 名前:デフォルトの名無しさん :2006/07/17(月) 13:45:21
>>24
Person に含まれるほかの情報との整合性が無いなら全部 public な構造体にする。
整合性が必要なら、ほとんどの場合は「年齢をセットする」という単一の操作が
意味を成さないことになるので、そんなインターフェースは要らない。

26 名前:25 :2006/07/17(月) 13:46:49
言い切るとちょっとまずいな。要は set/get なんてのを書きたくなったときは、
書かなくていいコードを書いてるんじゃないかと疑う余地があるってことだ。

27 名前:デフォルトの名無しさん :2006/07/17(月) 13:58:47
難しくて良く理解出来ませんでしたが、要するにこういうことでしょうか?
・ageが他のメンバと関係ないデータならageをpublicにして、直接アクセス
・ageが他のメンバと関係有る場合、ageだけを変更するなんて操作はいらない
見当違いなこと言ってたらすいません・・

28 名前:デフォルトの名無しさん :2006/07/17(月) 13:59:04
>>23
引数の型を shared_ptr にしとけば shared_ptr を渡すか、
shared_ptr のコンストラクタを使った明示的な変換を必要とするので
間違いがあっても気づきやすいってこと。
「決して〜」とは言い切れないけど、だいぶマシとは言える。

set/get については、 >>25-26

29 名前:25 :2006/07/17(月) 14:00:52
>>27
そういうこと。

30 名前:デフォルトの名無しさん :2006/07/17(月) 14:02:22
>>23
> set/get はない方がいいとは思いますがあらゆるものが不足してなくせないんです

それを詳しく説明しない限り、shared_ptrでいいかどうか説明できないでしょ?
外でどう使われるか説明してないんだから。


31 名前:デフォルトの名無しさん :2006/07/17(月) 14:15:52
要するに、書かなくていい不要なコードを書いているという点で
setterはアンチパターンになりうるということですよね?
age_に大して何らかの前処理や後処理をする必要が有る(または予期される)場合など
(例えばマルチスレッドで同期を取る)可能性がある場合、setterは避けられませんか?

>>30
不足しているのは私の頭です
それに、どうも今まで読んできた本の内容を素直に受け入れすぎる傾向もあるようです

32 名前:デフォルトの名無しさん :2006/07/17(月) 14:53:32
>>24
Person son2(son1.age());でいいからね
まあImmutableパターン知ってるなら>>25-のアドバイスは聞かないことだ
つーかdataをpublicにするな

33 名前:25 :2006/07/17(月) 15:47:34
>>32
データを public にするなというのもクラスとしての整合性を
前提にしたルールであって、整合性の必要無いデータについて
盲目的に適用するものではないと考える。

データを組み合わせただけの構造体のほうがクラスよりも単純だ。
明確な必要性が無い限り単純さを損なわないほうがいい。

34 名前:デフォルトの名無しさん :2006/07/17(月) 16:23:31
shared_ptrとそのsetter/getterだけあって、
どうですか?って聞かれても困るよね。

shared_ptrだけじゃまずいの? って思うけど…
なぜclassにする必要があるのかわかりません。


35 名前:デフォルトの名無しさん :2006/07/17(月) 16:33:52
    同
    志
    社
同志社同志社同志社
    同
    志
    社


36 名前:デフォルトの名無しさん :2006/07/17(月) 16:34:29
    同
    志
    社
    同
同志社同志社同志社
    社
    同
    志
    社


37 名前:デフォルトの名無しさん :2006/07/17(月) 16:38:18
>>27
年齢という数値だけを持つ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が言っているのは、意味的に等価なら前者のコードは単なる無駄なんじゃないか
ってこと。漏れも同意で、盲目的な雪駄と下駄は個人的には面倒なので使わないな。


38 名前:デフォルトの名無しさん :2006/07/17(月) 21:28:49
だからっつってageをpublicにするのは馬鹿。
雪駄、ゲッタをとりあえず盲目的にでもつけとくのは正解

39 名前:デフォルトの名無しさん :2006/07/17(月) 21:29:39
二行目、ageをpublicにするぐらいなら、が抜けていた

40 名前:デフォルトの名無しさん :2006/07/17(月) 21:33:33
int value = obj.GetValue();
value++;
obj,SetValue(value);
みたいな文が増えるくらいならpublicにしてる。
それ以外ならとりあえずprivateにしてセッターゲッターかな


41 名前:デフォルトの名無しさん :2006/07/17(月) 21:50:27
もう、publicなメンバ変数を言語的に禁止してもいいころじゃないか

42 名前:デフォルトの名無しさん :2006/07/17(月) 21:55:40
>>38
「僕の大好きな雪駄、ゲッタを悪く言うやつなんてみんな馬鹿だ!」ってことか。
小学生かよ。

プログラムするならもっと論理的に考えな。

43 名前:デフォルトの名無しさん :2006/07/17(月) 22:20:12
雪駄、ゲッタよりpublicの方が優れている理由を、論理的に説明してください。

44 名前:デフォルトの名無しさん :2006/07/17(月) 22:21:41
>>43 >>33

45 名前:デフォルトの名無しさん :2006/07/17(月) 22:23:10
>>43
だれがどっちが優れてるなんて話をしている?
盲目的なコードを書くんじゃなくて、理由に基づいて書けってことだ。

46 名前:デフォルトの名無しさん :2006/07/17(月) 22:28:56
>>43
「整合性の必要が無いデータ」とはどのようなものですか。

47 名前:デフォルトの名無しさん :2006/07/17(月) 22:29:55
>>45
どちらかがより目的に適合するなら、それは優れているというのではないですか。

48 名前:デフォルトの名無しさん :2006/07/17(月) 22:35:37
>>46
名前と住所を持った単純なデータ構造を考えてみてくれ。
どんな文字列も有効な名前だし、どんな文字列も有効な住所だ。
そうなると、それは構造体だ。 struct で表せ。何も private にするな。

(意訳)
http://www.artima.com/intv/goldilocks3.html

49 名前:デフォルトの名無しさん :2006/07/17(月) 22:37:10
「盲目的な」という言葉で、もうこいつとは議論する価値なし。
したいようにすればいいよ。

50 名前:デフォルトの名無しさん :2006/07/17(月) 22:37:42
>>47
紙を切るという目的にはカッターナイフが適合する。
木片を切るという目的にはノコギリが適合する。
しかしどっちが優れているとも言えない。

プログラムするならもっと論理的に考えな。

51 名前:デフォルトの名無しさん :2006/07/17(月) 22:44:06
>>48
リンク先を読みましたが、最後のBjarne Stroustrupの発言を意図的に
無視しているのは何故ですか。

52 名前:デフォルトの名無しさん :2006/07/17(月) 22:49:40
>>51
最後のって、でかいな。どこのつもりだ。どこにしても無視してるつもりは無いけど。

53 名前:デフォルトの名無しさん :2006/07/17(月) 22:59:29
>>52
あなたの発言は、Bjarne Stroustrupの最後から二番目の内容を
恣意的に解釈しただけのものではありませんか。

54 名前:デフォルトの名無しさん :2006/07/17(月) 23:06:54
>>43
常に一方が勝るというほどの差はない。文脈によって良かったり悪かったりだろう。
想定される使用状況ではある一方が有利と判断できるなら、それを選べばいい。

例えば、既存のコードに追加するときや開発チーム内でのルールがあるときなどは、
周囲のコードやルールに合わせておくべき。

>>48
なかなか丁寧で面白いね。"Classes Should Enforce Invariants" という題名が秀逸。
「不変条件がないならクラスにするべきではない」ってところ?


55 名前:デフォルトの名無しさん :2006/07/17(月) 23:08:08
>>50
紙を切るという目的において、カッターナイフとノコギリの
どちらかが優れているということも出来ませんか。

56 名前:デフォルトの名無しさん :2006/07/17(月) 23:09:25
EffectiveC++ではセッタゲッタにすべき理由を書いてあったんじゃないかな。

57 名前:デフォルトの名無しさん :2006/07/17(月) 23:11:35
>>56
100%同意します。

58 名前:デフォルトの名無しさん :2006/07/17(月) 23:13:03
>>53
2番目の内容からさらに一部だけ意訳した。
恣意的で間違っているというならさっさと指摘してくれ。
まどろっこしい。

59 名前:デフォルトの名無しさん :2006/07/17(月) 23:13:43
>>56
同感です。
ageごときにsetter, getterを付けるのは常に冗長のような決め付けは、
そちらの方が盲目的に見えます。

60 名前:デフォルトの名無しさん :2006/07/17(月) 23:16:16
>>56
その理由がプログラムとマッチすれば使えばいい。盲目的に使うのは無駄で迷惑。

61 名前:デフォルトの名無しさん :2006/07/17(月) 23:16:41
>>58
別に間違っているとは言ってません。

62 名前:デフォルトの名無しさん :2006/07/17(月) 23:17:33
>>60
では、publicの方が優れているというのですね。

63 名前:デフォルトの名無しさん :2006/07/17(月) 23:19:46
>>60
つまり、あなたが「単純なデータ」だと思うようなメンバ変数の場合は、
相手はいつでも「盲目的にsetter/getterを作っている」と思っていると
いうことですね。

64 名前:デフォルトの名無しさん :2006/07/17(月) 23:22:08
相手って誰?

65 名前:デフォルトの名無しさん :2006/07/17(月) 23:22:24
この議論、どこに向かわせようとしてるんだ?>参加者w

66 名前:デフォルトの名無しさん :2006/07/17(月) 23:23:21
publicにするか、setter/getterにするかの議論のための理論武装ですが?

67 名前:デフォルトの名無しさん :2006/07/17(月) 23:25:06
メンバ変数をpublicにするときのexcuseの練習でしょう。

68 名前:デフォルトの名無しさん :2006/07/17(月) 23:29:14
あー盲目的にセッタゲッタ化するアホいたわ
commentまでネチネチつけてた
時間の無駄だってのに・・・

69 名前:デフォルトの名無しさん :2006/07/17(月) 23:29:29
>>42
僕の大好きなpublicデータメンバを悪く言うやつなんて皆バカだ」ってことか

小学生はおのれじゃボケ!

70 名前:デフォルトの名無しさん :2006/07/17(月) 23:34:46
ageをひとつ進める必要があるなら、それ用のI/Fを作るべきじゃなかろうか

71 名前:デフォルトの名無しさん :2006/07/17(月) 23:41:03
本は所詮、机上の空論

ソース行数が多いほうが儲かるとき、オブジェクトっぽく見せたいとき、setter/getter
納期まで時間がないとき、public

72 名前:デフォルトの名無しさん :2006/07/17(月) 23:45:36
クラスを作る場合の setter/getter vs public だと勘違いしている人が多いが、
元は(データを隠蔽した)クラスを作るべきかどうかって話だろ?
噛み合ってないよ。

73 名前:デフォルトの名無しさん :2006/07/17(月) 23:53:14
まあsetter/getterは、データを隠蔽するだけが目的じゃナインだけど

74 名前:デフォルトの名無しさん :2006/07/17(月) 23:57:25
>>56
せっかくなので拾ってきた。引用元は和訳第3版。

22項: データメンバはprivate宣言しよう
(ざっくり飛ばして最後)
覚えておくこと
・データメンバはprivate宣言しよう。それにより、データアクセスにおける構文の
 一貫性、精度のよいアクセス制御、不変な条件の保証、クラスの制作者が実装を
 変更できる柔軟性が得られる。
・protectedはpublicよりカプセル化を進めるものではない。

例えば、後からインタフェースを変更せずに内部機能を追加したいとき
(例えば外部から不可視のオブザーバを追加するなど)、
データメンバがprivateなら安心。てことか。

>>48の引用元とは部分的に対立するね。どっちもどっちだなあ。


75 名前:デフォルトの名無しさん :2006/07/18(火) 00:01:16
草鞋(わらじ)
草履(ぞうり)
樏(かんじき)
足袋
・・駄目だ

76 名前:デフォルトの名無しさん :2006/07/18(火) 00:06:55
>>74
対立しないよ。リンク先をよく読め。

77 名前:デフォルトの名無しさん :2006/07/18(火) 00:17:05
ageはpublicなメンバ変数で、nameとaddressはsetter/getterでアクセスする?
そんな無様なクラスは使いたくない。

78 名前:デフォルトの名無しさん :2006/07/18(火) 00:31:48
setter/getterと生を混在させるのはやめて欲しいな。


79 名前:デフォルトの名無しさん :2006/07/18(火) 00:34:46
>>77
それは駄目だろ。
実在はしてそうでイヤだが

80 名前:デフォルトの名無しさん :2006/07/18(火) 00:36:14
クラスのメンバ変数をpublicにする奴はダメということで。

81 名前:デフォルトの名無しさん :2006/07/18(火) 00:48:31
混在いやなの?
じゃ「盲目的に」全てにsetter/getterを作るしかないねw

82 名前:デフォルトの名無しさん :2006/07/18(火) 00:54:05
>>81
同じクラスで混在するのは変じゃないか?


83 名前:デフォルトの名無しさん :2006/07/18(火) 00:56:32
全部publicのものとsetter/getterのものに分ければいいじゃん。
俺はある程度規則性があれば一つのクラス内で混在させてもいいと思うけどな

84 名前:デフォルトの名無しさん :2006/07/18(火) 00:57:35
メンバ変数が全部publicなクラス?
そんな無様なクラスは使いたくない。

85 名前:デフォルトの名無しさん :2006/07/18(火) 00:59:34
>>60
思考停止の見本。

86 名前:デフォルトの名無しさん :2006/07/18(火) 01:02:04
>>84
それはもうclassじゃなくてstructだろって話だろ。

87 名前:デフォルトの名無しさん :2006/07/18(火) 01:04:49
>>81
そもそもgetter/setterをいちいち作って回ること自体設計失敗してるけどな。

88 名前:デフォルトの名無しさん :2006/07/18(火) 01:11:22
そもそもageをコンストラクタで設定できるのにsetterが必要になる理由がわからん。
インクリメントするI/Fでもあれば済む話なんじゃないか?

89 名前:デフォルトの名無しさん :2006/07/18(火) 01:21:24
それはageに固有の概念だと思う。
元々はポインタのset/getのようだし、もう少し話題は広いようだよ。

90 名前:デフォルトの名無しさん :2006/07/18(火) 01:50:45
発端は>>18だけど、>>24>>27>>33が今の話題の元かな。

整合性の必要ない(つまり不変条件が壊れない)データの集合をカプセル化するとき、
「データメンバをpublicにしてget/setは使わない」のか、
「データメンバをprivateにしてget/setを使う」のか、
どっちがよりいいのかって話。

>>18>>24
混乱してるかもしれんが、整合性が必要なデータを扱うとき(例えば生ポインタに
保持したメモリを勝手に開放されては困るとき)や、状態遷移に制約を付けたいとき
(例えば年齢は初期化後はインクリメントしかできないようにしたいとき)などは、
データメンバをpublicにするのはNGだ。これらの状況では、単純なget/setも
NGになるかもしれない(NGなことが多いと思う)。


91 名前:デフォルトの名無しさん :2006/07/18(火) 03:03:09
setter/getterつけて満足してる奴、多そう

92 名前:デフォルトの名無しさん :2006/07/18(火) 03:21:45
>>91
   /*
   |
   |
   |
  ∧|∧
 ( / ⌒ヽ     | ̄ ̄ ̄ ̄ ̄ ̄ ̄
  | |   |     |
  ∪ / ノ  .   |
  ノ ノ ノ      */
 main       (
           )
           {
           }

93 名前:デフォルトの名無しさん :2006/07/18(火) 08:21:09
すげえこの会話、一つの例外もなく頭が悪いw

94 名前:デフォルトの名無しさん :2006/07/18(火) 08:49:26
何もわざわざ自分で頭が悪いと認める流れの中に
入らなくてもいいんじゃないかと思うんだがw

95 名前:デフォルトの名無しさん :2006/07/18(火) 10:34:19
>>92
うわ、すげー懐かしい AA だ。
確か、俺が作ったんだった気がする。

96 名前:デフォルトの名無しさん :2006/07/18(火) 12:05:48
この議論の滑稽なところは、「熟慮の結果publicメンバ変数にする」派が
えらそうなところだ。この派閥は決まってsetter/getterを付ける奴を馬鹿にする。

97 名前:デフォルトの名無しさん :2006/07/18(火) 12:19:03
お前の滑稽さには敗ける。

98 名前:デフォルトの名無しさん :2006/07/18(火) 12:39:34
後で setter/getter に余計な処理つける可能性もあるのにね。

99 名前:デフォルトの名無しさん :2006/07/18(火) 12:44:10
余計てw

100 名前:デフォルトの名無しさん :2006/07/18(火) 12:59:21
付けないほうが良い処理ってことかw

101 名前:デフォルトの名無しさん :2006/07/18(火) 12:59:32
「熟慮」の結果がpublicメンバ変数だというところが笑える

102 名前:デフォルトの名無しさん :2006/07/18(火) 13:00:10
そもそもsetter/getterなんていうのがアレだな。
アクセッサとでも言いたまえ。

103 名前:デフォルトの名無しさん :2006/07/18(火) 13:01:42
アラエッサ

104 名前:デフォルトの名無しさん :2006/07/18(火) 13:04:57
少なくともこの流れの中に俺以外の馬鹿が一人いることを確信した。

105 名前:デフォルトの名無しさん :2006/07/18(火) 13:42:40
ところで話は変わるが、
も前ら Point クラス (メンバは int x; int y; の2つ)って
どうやって実装してる?
private にして setter や getter 付けてる?

漏れは struct にしてるけど。

106 名前:デフォルトの名無しさん :2006/07/18(火) 13:45:24
そのポイントクラスはどのような機能を持っているのか
語っていただこうか

107 名前:デフォルトの名無しさん :2006/07/18(火) 13:51:13
画面やビットマップ上の位置を表すのに用います。
整数型の数値を2つ保持するのが機能の全てです。

108 名前:デフォルトの名無しさん :2006/07/18(火) 13:56:36
なんでclassにするかstructにするか悩むんだ?

109 名前:デフォルトの名無しさん :2006/07/18(火) 14:11:05
PODにするかどうかで悩んでるってことだろう

110 名前:デフォルトの名無しさん :2006/07/18(火) 14:12:38
>>109
なにそれ

111 名前:デフォルトの名無しさん :2006/07/18(火) 14:14:08
>>110
ttp://en.wikipedia.org/wiki/Plain_Old_Data_Structures

112 名前:デフォルトの名無しさん :2006/07/18(火) 14:21:53
極座標変換が気になる人どうぞ


113 名前:デフォルトの名無しさん :2006/07/18(火) 14:23:52
>>111
>>108と何が違うんだ?

114 名前:デフォルトの名無しさん :2006/07/18(火) 14:28:45
PODSにはsetter/getterなど無い

115 名前:デフォルトの名無しさん :2006/07/18(火) 14:52:38
漏れならアクセサは作るがセッタゲッタは作らないな。

116 名前:デフォルトの名無しさん :2006/07/18(火) 15:19:18
PODSってクラスなの?

117 名前:デフォルトの名無しさん :2006/07/18(火) 17:17:22
>>113
structとclassの違いはデフォルトがpublicかprivateかだけ。
PODなclassも存在するし、PODでないstructも存在する。
普段は108の言い方でも大体通じるが、こういう所でそれは期待できない。

118 名前:デフォルトの名無しさん :2006/07/18(火) 17:19:33
PODなclassって、structと比べて何がいいの?

119 名前:デフォルトの名無しさん :2006/07/18(火) 17:20:26
軽い

120 名前:デフォルトの名無しさん :2006/07/18(火) 17:23:36
何が?

121 名前:デフォルトの名無しさん :2006/07/18(火) 17:30:24
>>117
少なくともgccでは同じコードを吐く。
だから、PODであることを表明したければstructにするのがいいと思う。

122 名前:デフォルトの名無しさん :2006/07/18(火) 17:31:01
アンカー間違えた。
>>117じゃなくて>>118

123 名前:デフォルトの名無しさん :2006/07/18(火) 18:35:57
おまんこ

124 名前:デフォルトの名無しさん :2006/07/18(火) 21:40:15
A==========================
void 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の方がスコープが限定されている分、最適化されやすい

という認識で良いのでしょうか?

125 名前:デフォルトの名無しさん :2006/07/18(火) 21:47:48
Javaじゃあるまいし、そのくらい最適化で消えてなくなる
よって常にBで書く方がよい

126 名前:デフォルトの名無しさん :2006/07/18(火) 21:59:35
Javaと何の関係があるのか分からない

127 名前:デフォルトの名無しさん :2006/07/18(火) 22:04:31
for (int i=0; i < 10; ++i) {
  // scope A
}
// scope B

i のスコープはどこまで?
A だと思ってたんだけど、B までなソースに出くわした。

128 名前:デフォルトの名無しさん :2006/07/18(火) 22:07:20
ソースっつーかコンパイラに依る

129 名前:デフォルトの名無しさん :2006/07/18(火) 22:07:36
Aが正解。
でも外に漏れる実装は確かにあるな、VCとか。


130 名前:デフォルトの名無しさん :2006/07/18(火) 22:14:08
>>125
ははー、どっちでも同じなんですね
レスありがとうございました

131 名前:デフォルトの名無しさん :2006/07/18(火) 22:19:53
正確にはVC6以前がB、
VC7〜7.1はローカルスコープに同名の変数がない限りB、
VC8はデフォルトでA。

132 名前:デフォルトの名無しさん :2006/07/18(火) 22:48:27
外に漏れるのが嫌な場合は

#define for if(0); else for

133 名前:デフォルトの名無しさん :2006/07/18(火) 23:33:33
一応書いておくと昔はBが正解だった。

134 名前:デフォルトの名無しさん :2006/07/19(水) 00:21:58
今は昔

135 名前:デフォルトの名無しさん :2006/07/19(水) 00:27:02
>>132をつかえば
いまも昔も関係ないわけですね。
ありがとうございました。

136 名前:デフォルトの名無しさん :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



137 名前:デフォルトの名無しさん :2006/07/19(水) 01:28:50
VC6 でも?

138 名前:デフォルトの名無しさん :2006/07/19(水) 01:35:34
>>137
窓から投(ry

139 名前:デフォルトの名無しさん :2006/07/19(水) 01:39:29
昔がどうあれBはおかしい

140 名前:デフォルトの名無しさん :2006/07/19(水) 09:33:20
だからこそ、B から A に仕様変更したわけだしな。

141 名前:デフォルトの名無しさん :2006/07/20(木) 01:35:42
デストラクタで例外投げるなって聞いたんですけど、じゃあエラーが出たらどうすればいいんです?
例えばソケットとかcloseメソッドは当然作るとして、デストラクタでも念のためにcloseしますよね?
そのときにエラーが出たら?


142 名前:デフォルトの名無しさん :2006/07/20(木) 01:44:40
>>141
俺はエラーチェックしない。
そんなcloseなんてまず失敗するほうがおかしい、
せいぜい引数がおかしいなどと言った理由だろと決め付けている。
そして、もしエラーチェックしたければデストラクタに頼らず、自分でクローズする。

143 名前:デフォルトの名無しさん :2006/07/20(木) 02:20:27
>>141
まぁエラーが出るような処理はデストラクタではまずやらんが、
やったとしても、ログ出して終わり。

144 名前:デフォルトの名無しさん :2006/07/20(木) 02:35:10
>142-143
じゃあエラーが起こりうる場合はデストラクタでは資源解放しないってことでしょうか。
明示的にクローズするんですか?数が多くても?

あとsocket closeはあくまでも例なんで、解放時にエラーの可能性はあるって前提でお願いします。


145 名前:デフォルトの名無しさん :2006/07/20(木) 02:44:01
>>144
いやあのね、だからエラーが起こるような処理は基本的にはデストラクタでは
やらないって書いてるでしょ。

146 名前:デフォルトの名無しさん :2006/07/20(木) 02:46:36
>>144
たとえばさ、資源解放が出来ないことが「致命的」な場合に、それをデストラクタでやって、
解放できないときの「異常」をデストラクタが飲み込んでしまうような設計をしたいんです、
とおまえさんは言っとるわけだ。

答えは、それが困るならデストラクタで解放するな、だ。

147 名前:デフォルトの名無しさん :2006/07/20(木) 02:52:42
>>144
エラーの処理をデストラクタでやればいいじゃん。
まぁ、資源解放時のエラーでできる事なんかログを書く事ぐらいだと思うけど。
だから、>>143 が正解だと思う。

148 名前:デフォルトの名無しさん :2006/07/20(木) 02:55:36
始めにデストラクタありき、っていう>>144はキモイ。

149 名前:デフォルトの名無しさん :2006/07/20(木) 03:06:37
>>141
Win32APIベースのプログラムなら SetLastError でも使ってあとから GetLastError で問題がなかったか調べろ。
それ以外の環境だったら似たようなグローバルエラー変数ソリューションを自作するなりして使え。

150 名前:デフォルトの名無しさん :2006/07/20(木) 03:32:33
エラーが起こるような処理をデストラクタでやってるのってありがちじゃない?
1、エラーチェックしない
2、closeを別に作って呼ぶ
3、ログ吐く
4、GetLastError等を使う
どれもいまいちだね。


151 名前:デフォルトの名無しさん :2006/07/20(木) 03:42:12
>>150
基本3で、可能なら2もできるようにしておくのがいいんじゃないかな。
std::fstream なんか、そんな感じだね。

152 名前:デフォルトの名無しさん :2006/07/20(木) 05:01:42
longjm・・・いや、なんでもない。

153 名前:デフォルトの名無しさん :2006/07/20(木) 05:04:29
>>152
いや、それだったら例外と大して差がないから、結局同じ問題に帰着する。

154 名前:デフォルトの名無しさん :2006/07/20(木) 09:04:11
・dtorではエラーチェックはするが例外は投げない。どうするかはケースバイケース。
・終了処理用のmethodを別途作る。こちらは必要な例外を投げる。

と作っておき、エラーハンドリングをきちんとしたい時は2でやる。
簡便にやりたい時は1で済ませる。

というのはもはや定法です。

155 名前:デフォルトの名無しさん :2006/07/20(木) 09:06:26
俺は144の気持ちも分かるな
クライアントは、生成・削除以外の責任を持たなくて良いくらいのカプセル化の方が、気持ち良い

削除前に必ずrelease()を呼んでください…みたいのは嫌なんだよな
まぁ、今はしょうがないのでそうしてるけど、次があったらどうにかして欲しいわ

156 名前:デフォルトの名無しさん :2006/07/20(木) 10:56:55
デストラクタで例外を投げる可能性のあるメソッドを呼びたいときは、
きちんとcatchしといたほうがいいのでしょうか。


157 名前:デフォルトの名無しさん :2006/07/20(木) 11:09:13
Effective C++ 第三版
・デストラクタは例外を投げてはいけない。デストラクタ内で例外を投げる関数を呼び出す場合、
デストラクタがプログラムを中止させるか、その例外を補足し飲み込む(処理する)ようにする。
・クラスのクライアントが例外に対処する必要があるなら、クラスに「例外を投げるかもしれない処理」
をする通常の関数(つまり、デストラクタでない関数)を付ける。

158 名前:デフォルトの名無しさん :2006/07/20(木) 12:39:19
>>154
けっして定法ではないと思う。
ネットでも仕事でもよく見かけるのはエラーチェックしない糞プログラムばっかりだ。


159 名前:デフォルトの名無しさん :2006/07/20(木) 12:56:35
>>158
えーとそれは「定法である」ということにケチを付けたいということでよろしいか?

160 名前:デフォルトの名無しさん :2006/07/20(木) 13:41:59
たとえば、デストラクタで例外を投げたくなった場合、
その例外を受けたときどうしたいのかによって、答えは違うだろう。
ソケットクローズがエラーだったとして、それを検出したらどうするのかと。

161 名前:デフォルトの名無しさん :2006/07/20(木) 14:47:09
二重例外でぐぐればこの話題は終了?

162 名前:デフォルトの名無しさん :2006/07/20(木) 15:09:29
>>160
投げたくなっても、投げてはいけません。

163 名前:デフォルトの名無しさん :2006/07/20(木) 15:16:23
>>161
ただし、一番上のやつは駄目で、二番目を参照すること。

164 名前:デフォルトの名無しさん :2006/07/20(木) 21:43:43
ttp://www.ipa.go.jp/security/awareness/vendor/programming/b06_06_main.html
例えばここのFileHandleクラスはデストラクタでcloseしてエラーチェックしてないよ。
こういう場合はどうするの?


165 名前:デフォルトの名無しさん :2006/07/20(木) 22:14:37
>>164
それがおかしいだけ
お偉いさんが書くものすべて正しいと思ってるあほは氏ねば?w

166 名前:デフォルトの名無しさん :2006/07/20(木) 22:17:33
>>164
> どうするの?
どうしたいの?

167 名前:デフォルトの名無しさん :2006/07/20(木) 23:12:45
んじゃ誰か正しい例を探してきてくれない?


168 名前:デフォルトの名無しさん :2006/07/20(木) 23:17:32
>>167
正しい例など存在しない。

169 名前:デフォルトの名無しさん :2006/07/21(金) 02:18:07
なんかおかしくね?
デストラクタで資源解放→close等でエラーの可能性がある→デストラクタで例外は禁止→エラーを黙殺するな
で、初心者が困っててもどうすりゃいいのか妥当なサンプルも提示出来ないってことか
154は定法とまで言ってるのにな


170 名前:デフォルトの名無しさん :2006/07/21(金) 02:38:50
デストラクタから例外が漏れるのを抑えるという理由を確認するために
More Effective C++を久しぶりに読んだが、訳がひどいねえやっぱり・・・

しかし、例え初心者でも、この本は読むべきだろう。コード片を示せとか
言ってる奴がいるが、本で数ページを割いて説明している事を小さな
コード片にまとめるのは至難の業。

171 名前:デフォルトの名無しさん :2006/07/21(金) 03:16:23
>>169
だから何度も言ってるだろう。
リソースがリークして困るならデストラクタでやるな。

172 名前:デフォルトの名無しさん :2006/07/21(金) 03:17:31
>>171
何言ってんだ?リソースの解放をデストラクタでやるのは何も問題ないだろ。

173 名前:デフォルトの名無しさん :2006/07/21(金) 03:23:48
>>172
お前こそなに言ってんだよ。
「リークして困るなら」と言ってるだろうが。

174 名前:デフォルトの名無しさん :2006/07/21(金) 03:27:37
デストラクタでリソースの解放をしないと、リークするんじゃないの?

175 名前:デフォルトの名無しさん :2006/07/21(金) 03:28:03
そもそも誰もデストラクタで例外禁止なのは否定してないし、理由を聞いてるわけでもない。
ケースバイケースなのは分かったからサンプルを示してくれって話だろ。


176 名前:デフォルトの名無しさん :2006/07/21(金) 03:32:28
いったい何のサンプルが欲しいんだよ?

177 名前:デフォルトの名無しさん :2006/07/21(金) 03:33:07
サンプルって std::fstream じゃ不満なのか?

178 名前:デフォルトの名無しさん :2006/07/21(金) 03:41:22
デストラクタで例外が出るとき、何処かでcatchしないとプログラムは死ぬだろ。
そうなると、ほかの処理ができなくなるんじゃないのか。

そんなトラップのようなデストラクタを持つクラス、使いたくないな。
自分だけで使うんなら、いいんだろうけどね

179 名前:デフォルトの名無しさん :2006/07/21(金) 03:44:42
>>178
>>161,163

180 名前:デフォルトの名無しさん :2006/07/21(金) 03:46:25
>>178
>そもそも誰もデストラクタで例外禁止なのは否定してないし、理由を聞いてるわけでもない。

181 名前:デフォルトの名無しさん :2006/07/21(金) 03:52:32
>>169
違う。
黙殺していい場合にのみ、デストラクタでリソースの解放をやってもいい、が正解。

182 名前:デフォルトの名無しさん :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


183 名前:デフォルトの名無しさん :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が不可能となるようなケースってあるのでしょうか?
よろしくお願いします。

184 名前:デフォルトの名無しさん :2006/07/21(金) 09:36:52
コピーされていいなら好きにしろよ。

> a=b=cが不可能となるようなケースってあるのでしょうか?

コピーコンストラクタが宣言だけされて、定義されてない時。

185 名前:デフォルトの名無しさん :2006/07/21(金) 09:57:55
>>183
Hoge a, b, c;
(a = b) = c;

のように書いた際に、一時生成されたテンポラリオブジェクトにcが代入されて
a == cとならなくなってしまうから、必ず参照を返さなければいけない

186 名前:デフォルトの名無しさん :2006/07/21(金) 13:09:35

VC6で、

cout << (int)(18.4*100000) << endl;

と書いたときに、1839999 と表示されるのだが、
何か上手い回避手段は無いものか。

187 名前:デフォルトの名無しさん :2006/07/21(金) 13:12:40
ちなみに、VC++7.1 でも同じだった。

188 名前:デフォルトの名無しさん :2006/07/21(金) 13:17:05
>>186

- (int)(18.4*100000)
+ round(18.4*100000)

189 名前:デフォルトの名無しさん :2006/07/21(金) 13:26:54
>>188
あーなるほど。確かに。
でも、やりたいのは端数切捨て処理だから、やるとすればこうか。

template< typename T > inline T fix( T value ) {
 return ( value < 0 ) ? std::floor(value) : std::ceil(value);
}

面倒だけど、これでやってみるよ。

190 名前:デフォルトの名無しさん :2006/07/21(金) 13:34:02
>>189
あ、ceil と floor 逆だ。

191 名前:190 :2006/07/21(金) 13:38:20
あーーーでも、端数切捨てにすると、やっぱり >>186 の問題が浮上してきやがる。
>>186 の提案もいいが、それだと 18.65 を端数切捨てで 18 と表示したいときに
19 と表示されてしまう。

どうしたもんだろ。

192 名前:デフォルトの名無しさん :2006/07/21(金) 13:45:21
行列の計算で3行3列のaという行列とcという行列を定義したあと,
これをそれぞれ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文の計算を分割すればちゃんと計算されるのですが,
なぜこの場合同時にできないのでしょうか?
どのようにすれば解決できるのでしょうか?教えてください.よろしくお願いします.


193 名前:デフォルトの名無しさん :2006/07/21(金) 13:52:45
>>192
カッコ悪い。
慣れない内はforやifの後を必ず複文化しよう。

194 名前:デフォルトの名無しさん :2006/07/21(金) 13:55:59
>>191
どこをどう丸めたいのかよく判らんが、sprintf()の"%.2f"で四捨五入して
sprintf()の"%.*s"で切り捨ててから数値化するとかw
まぁ、100倍して整数に四捨五入してから100で割って切り捨ててもいいんでね?

195 名前:デフォルトの名無しさん :2006/07/21(金) 14:24:03
二進の無理数とか絡むようならどうやっても、最後は適当にごまかすしかないんじゃないか?
若しくは有理数クラスでも使う

196 名前:190 :2006/07/21(金) 14:29:18
>>194

double 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 );

197 名前:デフォルトの名無しさん :2006/07/21(金) 14:41:12
てか、intにcastするからだろ。

sprintf(buf, "%.0f", 18.4*100000);

or

std::cout << std::setprecision(0) << std::fixed << 18.4*100000 << std::endl;


198 名前:デフォルトの名無しさん :2006/07/21(金) 15:16:13
>>197
>>196
> 整数表示の際は端数を切り捨てることがきまっています。
と書いてるように、丸めてしまっては意味がありません。

199 名前:デフォルトの名無しさん :2006/07/21(金) 15:22:23
丸めてねーよタコ!節穴かお前。
こんな間抜けな質問するだけあるな。

200 名前:デフォルトの名無しさん :2006/07/21(金) 16:14:50
>>199
sprintf()の"%.0f"なら四捨五入ですが何か。

201 名前:デフォルトの名無しさん :2006/07/21(金) 19:02:51
>>186
Packed BCDとかDecimal Arithmeticのライブラリ使いなよ。
http://www2.hursley.ibm.com/decimal/

202 名前:デフォルトの名無しさん :2006/07/21(金) 22:51:44
int(d + floor(d)*DBL_EPSILON)
でなんとかなりそだとおもうんだけど・・・
テストすんのが面毒背

203 名前:183 :2006/07/21(金) 23:09:28
>>184
>>185
お二方よくわかりました。
クリアになりました。
本当にありがとうございました。

204 名前:デフォルトの名無しさん :2006/07/22(土) 13:22:40
質問です。XP、.NET 2005 です。

あるヘッダファイル内で 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; と同じ意味になるのでしょうか?

205 名前:デフォルトの名無しさん :2006/07/22(土) 13:54:17
x = y; という式の結果は、xの持つ値でしょうか?それとも、xという名前のメモリ領域
(変更可能な左辺値)でしょうか?

206 名前:デフォルトの名無しさん :2006/07/22(土) 13:56:31
>>205
そんなん試してみりゃすぐわかんじゃん・・・

207 名前:デフォルトの名無しさん :2006/07/22(土) 14:05:06
>>205
operator=の定義次第です。

208 名前:デフォルトの名無しさん :2006/07/22(土) 14:18:05
>>204
C++ではconst int は定数扱い。

209 名前:デフォルトの名無しさん :2006/07/22(土) 15:39:18
>>208
floatでもconstを付けると同じ現象となりますが、これはどう説明する気ですか?

210 名前:デフォルトの名無しさん :2006/07/22(土) 15:58:13
>>204
constはデフォルトで内部リンケージを持っている。

//file1.c
const int hoge = 3;
//file2.c
const int hoge = 7;

としても文法違反ではなくリンクエラーにはならない。

ということが、ビョーンのバイブルの246ページに書いてある。

211 名前:デフォルトの名無しさん :2006/07/22(土) 15:59:29
>209
現象っていうか文法を知らないだけではないかとjvんszぃ;vbds;pzvびsz@あvp

212 名前:デフォルトの名無しさん :2006/07/22(土) 16:03:26
ビヨ〜ン

213 名前:デフォルトの名無しさん :2006/07/22(土) 16:08:42
>>209
floatはコンパイラベンダのサービスだろw

// integral or enumertion typeのconstはinternal linkage
// 7.1.5.1.2より



214 名前:209に捧ぐ :2006/07/22(土) 16:13:28
未熟な質問者はすぐ切れます。

215 名前:209に捧ぐ :2006/07/22(土) 16:13:58
>>214
未熟な回答者もすぐ切れますが、これはどう説明する気ですか?

216 名前:デフォルトの名無しさん :2006/07/22(土) 16:46:33
ちんことまんこが合体しているのです

217 名前:デフォルトの名無しさん :2006/07/22(土) 16:54:30
>>215
>>210が説明してんだろぼけ

218 名前:デフォルトの名無しさん :2006/07/22(土) 17:16:58
>>214-215 
未熟な自演はトリップの修正を忘れます。

>>209
>ということは、スコープをファイル内に限定する static const int hoge=3; と同じ意味になるのでしょうか? 
>>210が説明しているとおりだが、お前にわかりやすく言えば、次の2つは同じ意味。
const int hoge=3
static const int hoge=3 (規格的に正しいかどうか走らないがVS2005ではとおる)

219 名前:デフォルトの名無しさん :2006/07/22(土) 17:21:29
>>218
×正しいかどうか走らないが
○正しいかどうかは知らないが

const をa.c b.c 間で共有する場合、これで出来てるようであるが規格上はどうなの?
// a.c
extern const float aa = 10
// b.c
extern const float aa


220 名前:禿@ベル研究所 ◆HsptrkZmYk :2006/07/22(土) 17:24:55
constはデフォルトでは内部リンケージを持つけど、
externを付けると外部リンケージを持つ

221 名前:デフォルトの名無しさん :2006/07/22(土) 17:37:40
>>220
うむ

だから

//file1
extern const int hoge = 7;
//file2
extern const int hoge = 8;

はリンクエラーだな

bcc32ではそうだった

ちなみに
//file1
extern const int hoge = 7;
//file2
const int hoge = 8;
も無問題だった

222 名前:デフォルトの名無しさん :2006/07/22(土) 18:29:53
operator const char*() { return mpBuf; }

これよく解らんのだが、どれが戻り値で、どれがオペレーターなの?

223 名前:デフォルトの名無しさん :2006/07/22(土) 18:38:30
const char*がオペレータかつ戻り値の型

224 名前:デフォルトの名無しさん :2006/07/22(土) 18:41:04
>222
C++は奇奇怪怪だなwww
この書式にすぐにくじけてしまう

225 名前:デフォルトの名無しさん :2006/07/22(土) 18:50:37
C++でゲームの作り方を勉強したいと思ってるんだけど、とりあえず
はゲームを作ることを目的とした参考書じゃなくて普通の参考書を買っ
て勉強したほうがいい?

226 名前:デフォルトの名無しさん :2006/07/22(土) 18:51:32
void C( const char *_buffer );
なんて関数があった場合に、
そのOPが定義してあると、
Class class;
C( class ); なんかで変換可能ってこと?

こういうのなんていうの?自動型変換オペレーター?

227 名前:デフォルトの名無しさん :2006/07/22(土) 18:57:24
PLC++3rdによれば、変換演算子(conversion operator)だそうな。

228 名前:デフォルトの名無しさん :2006/07/22(土) 19:00:36
ttp://www.research.att.com/~bs/glossary.html#Gconversion-operator

229 名前:デフォルトの名無しさん :2006/07/22(土) 19:05:24
サンクス。
ぃぁーC++すごいわー・・・

230 名前:デフォルトの名無しさん :2006/07/22(土) 19:28:41
>>213
アホハッケーン

231 名前:204 :2006/07/22(土) 19:29:00
const についての質問をしたものです。色々お返事ありがとうございます。
実体が複数作られるのは避けたいため、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 ハックを行う、以外に方法はありませんでしょうか?


232 名前:デフォルトの名無しさん :2006/07/22(土) 19:37:55
>231
>実体が複数作られるのは避けたいため
なぜ?

そもそもアドレス取らない限りコンパイル時に埋め込まれる。

233 名前:デフォルトの名無しさん :2006/07/22(土) 19:45:29
>>231
常識的には>>232だが、それ以外でないとどうしてもいやだ、それをやると
明日首をつらなければならないって言うんならそんな奴には#defineがお似合いだ。

234 名前:204,231 :2006/07/22(土) 19:57:28
>>232-233
深い意味はありませんでした。複数作られることが単に無駄な気がしただけです。
例えば、10KB くらい分の定義が 100 ファイルから読まれると、1MB も無駄に exe が大きくなるんじゃないかなーと。
気にしないことにします。ありがとうございました。


235 名前:デフォルトの名無しさん :2006/07/22(土) 20:00:25
>>234
>例えば、10KB くらい分の定義が 100 ファイルから読まれると、1MB も無駄に exe が大きくなるんじゃないかなーと。
普通その手のプログラムは実行モジュール自体が数100MBに達するだろうから無駄と言う観点では誤差。
#寧ろ他に減らすべきものがたくさんあるはずだ。

236 名前:デフォルトの名無しさん :2006/07/22(土) 20:02:39
// hoge.h (インクルードガード済み)
extern 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
ファイルからインクルードしてもリンクエラーにはならないと思うけど。

認識違いだったらすみません。


237 名前:デフォルトの名無しさん :2006/07/22(土) 20:08:44
>>236
プギャーm9(ry

238 名前:デフォルトの名無しさん :2006/07/22(土) 20:50:58
>>234
>232
>そもそもアドレス取らない限りコンパイル時に埋め込まれる。
exeが大きくなることは無いって意味だとおもうが

239 名前:デフォルトの名無しさん :2006/07/22(土) 21:09:04
const int HOGE = 3;

は、アドレスを取らない限りは

#define HOGE 3

とほぼ同じと思って構わない。
C++ では。

240 名前:デフォルトの名無しさん :2006/07/22(土) 21:10:07
ifstream inf(argv[1])
ってな感じでコマンドラインで渡したパスを開こうとしても開けない
渡しているパスがC:\Programm Files\〜なんだけれども空白が原因?
C:\test.txtは問題なかったし

241 名前:デフォルトの名無しさん :2006/07/22(土) 21:18:39
>>240
空白で問題が発生するのは考えにくいな。
perror() してみるとなにかわかるかもしれない。

242 名前:デフォルトの名無しさん :2006/07/22(土) 21:32:42
perror入れてみた
結果は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)
 {/*・・・

243 名前:デフォルトの名無しさん :2006/07/22(土) 21:44:11
>>240
× Programm Files
○ Program Files

244 名前:デフォルトの名無しさん :2006/07/22(土) 21:46:50
ヲイヲイ、空白が原因に決まってるだろw
引数をダブルコーテーションで囲め

245 名前:デフォルトの名無しさん :2006/07/22(土) 21:50:25
printf("%s\n",argv[1]);で正しい(と思ってる)パスが出てくるってことは
本当に>>243が原因なんじゃないだろうか

246 名前:デフォルトの名無しさん :2006/07/22(土) 22:15:55
>>243-245
ごめんProgrammは素で間違えた
けれど引数の方はちゃんとProgramで渡してるから問題ない
ダブルクォーテーションもつけてて下の状態でも通らない
"C:\Program Files\JaneDoeView\Logs\Logs\2ch\PC等\プログラム\1048668198.dat"

247 名前:デフォルトの名無しさん :2006/07/22(土) 22:18:52
>>246
いやその場合プログラム側でダブルクォーテーションを削除してからifstreamに渡さなければならない

248 名前:デフォルトの名無しさん :2006/07/22(土) 22:19:14
>>239
いいえ全然違います

249 名前:デフォルトの名無しさん :2006/07/22(土) 22:22:54
>>246
× C:\Program Files\JaneDoeView\Logs\Logs\2ch\PC等\プログラム\1048668198.dat
○ C:\Program Files\JaneDoeView\Logs\2ch\PC等\プログラム\1048668198.dat

250 名前:デフォルトの名無しさん :2006/07/22(土) 22:25:52
>>247
渡されたコマンドライン引数argv[1]をprintfで直接表示しても""はついてないから
それではないと思う

>>249
自分のだとlogs\logsの下にログがある
Jane入れたときに自分で設定を弄った


■過去ログ置き場に戻る■ 1- 次250 最新50
DAT2HTML 0.33f Converted.