C++相談室 part64

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2008/12/27(土) 00:14:40
>>949
それって結局別の処理かかなきゃいけないわけだしいいんじゃないの?
駄目なの?
必要もないのに必要のない値が一括で流れてる構造っていいの?駄目なの?
引数できっちり渡すことこそきちんとしたプログラムじゃない?
それとも実装の手間惜しんでバグ増やすほど作業時間切迫してるの?
953デフォルトの名無しさん:2008/12/27(土) 00:30:39
class T
{
public:
 void foo(C& c);
 void bar(C& c);
 // foo() と bar() には必ず同じインスタンスを渡してください!!
};

こんなコメント書くぐらいなら T の中に C& c を持ったほうがいいこともあるでしょ。
954デフォルトの名無しさん:2008/12/27(土) 00:32:09
>>953
ないって
よしんばあったら設計がまずい
955デフォルトの名無しさん:2008/12/27(土) 00:33:01
どんな状況だそれは
956デフォルトの名無しさん:2008/12/27(土) 00:44:21
そもそも使う側からみて

if(pC)chinko.setC(pC);
chinko.foo();
unkounko();←実はこのときにpCシボンヌ
chinko.bar();←そうとは知らないchinkoがpC使おうと必死の形相で実行

なんて見た目問題おきないようなコードでやられたら一生バグがみつからん
っていうかチェックが甘すぎる
このコードはせめてこうなってなきゃ駄目だろ
素人じゃないんだから

if(pC)chinko.setC(pC);
if(pC)chinko.foo(pC);
if(pC)unkounko(pC);
if(pC)chinko.bar(pC);

なら使用してる側からもpCにアクセスしてるってわかるだろ常考(エラー処理もほしいが)

↓これじゃ意味不明じゃん

if(pC)chinko.setC(pC);
chinko.foo();
unkounko();
chinko.bar();
957デフォルトの名無しさん:2008/12/27(土) 01:07:14
>924
AとBは一対一対応?
何で多重継承じゃダメなの? 動的に切り替わったりするの?


>956
昔からある所有権の問題だな。
素直にスマートポインタ使うのがベター。
958デフォルトの名無しさん:2008/12/27(土) 01:09:08
>>957
そうかぁ?
スマートポインタって落ちないだけじゃね?
俺は引数を使ってうまく組むべきだと思うけどね
959デフォルトの名無しさん:2008/12/27(土) 01:09:29
>>953
自分ならせめてこうする。
class T
{
public:
  void foo_bar(C& c) {
    foo(c);
    bar(c);
  }
private:
  void foo(C& c);
  void bar(C& c);
}
960デフォルトの名無しさん:2008/12/27(土) 01:14:50
>>959
ポインタの保持の問題をいってるのにおかしなこという
961957:2008/12/27(土) 01:16:25
>958
依存関係を減らすのは重要だけど、本質的に依存するものを切り離すのは本末転倒だからね。
結局のところ、クラス同士がどういう関係で、何を処理するか次第だと思うよ。
962デフォルトの名無しさん:2008/12/27(土) 01:23:36
>>961
いや、そんなことねぇよ
やっぱり、こういうポインタを保持しちまうなんてのは
PGの怠慢なんだよ

怠慢するならするでさ
なにかフォローが必要なんだと思うぜ
もちろん他の人間もわからないしさ
人に対してもソースに対してもそういう配慮が必要になるのを忘れちゃいけない
資料作ったりコメント残したりね

そういうのが嫌だったら引数で渡すようにしたほうがいいぜ
引数だって構造体でまとめて変更あってもソース変わらないですよね?
なんて意地悪しないでちゃんと一つ一つチェックして渡すべき
963957:2008/12/27(土) 01:25:32
ついでに言うと
・引数で渡す
 オブジェクトが生きていることを保証する責任は関数を呼び出す側(のプログラマ)が持つ

・スマートポインタのメンバとして保持
 オブジェクトが生きていることを保証するのはスマートポインタ。
 ただし、循環参照など別の問題が発生するかどうかを管理する責任はスマートポインタを
 扱う部分全体(のプログラマ)が持つ

といった感じかね。
964デフォルトの名無しさん:2008/12/27(土) 01:27:26
> 基本的に、最適化しづらいコードってよくないと思うんだ。
最適化されますようにって気を使って技巧的に書いたソースからできたバイナリよりも
深く考えず自然な形で書いたソースからできたバイナリのほうが最適化されていることがある罠。
965957:2008/12/27(土) 01:30:24
>962
だから内容次第だってば。
例えばイテレータとかはポインタをメンバとして持たないと何にもできないぜ?
966デフォルトの名無しさん:2008/12/27(土) 01:36:02
>>965
ごめん
C++のそういう機能全般使ったことないわ
俺、C+クラスぐらいの機能でもう10年ぐれーそれで通ってきてる

これまで言語は規制をかけることで発展してきたけど
C++のテンプレート類はなんか便利な機能群な感じがして
これまでの言語の進歩とは違うっていうか勘違い系が入ってる気がするんだよね

毎回、何がいいの?その程度の機能って感じがする
967957:2008/12/27(土) 01:43:49
さすがにC++をC++として使うのなら、STLとか使わないのは勿体無いよ。
ベターCとして使うんだったら別に構わないけど。

もちろん、純粋関数だけを使用して宣言的にプログラムすることもある程度可能だけど、
全部それでやろうとすると大変な部分が出て来るからね。
968デフォルトの名無しさん:2008/12/27(土) 01:52:42
>>967
あんまり便利にならなくね?
むしろ、問題ばっかりおきる
あれだけ汚いコードかかせてやってくれること可変配列だけっていらないだろ
969デフォルトの名無しさん:2008/12/27(土) 01:55:27
配列 new ダイレクトに使ってんのか?
ちょっと例外起きただけでメモリリークするようなプログラム組んでんじゃねーだろうな。
970デフォルトの名無しさん:2008/12/27(土) 01:59:14
newはオーバーライドしてあるからいいチェック入ってるな
でもmallocラップした関数のがいい機能あるんだよね・・・orz
971デフォルトの名無しさん:2008/12/27(土) 02:03:05
いい機能w
972デフォルトの名無しさん:2008/12/27(土) 02:03:56
shared_ptrとか使わずにnewやmallocをラップしただけで対策してる気になってる?
だったら間違いなく例外脆弱なコードになってるな

「俺は例外なんか使わないから関係ないぜ!」とか言わないように
関係なくないから
973デフォルトの名無しさん:2008/12/27(土) 02:08:37
>>972
引数通すから必要ないよ
お前が想定してる自体のほとんどの可能性からいって潰れてるから
必要ないんだろうな
974デフォルトの名無しさん:2008/12/27(土) 02:08:56
ライブラリが勝手に例外投げる事もあるからな。
975デフォルトの名無しさん:2008/12/27(土) 02:09:43
>>973
騙るならまず日本語を勉強してからにしてくれ。
976デフォルトの名無しさん:2008/12/27(土) 02:15:33
ポインタの保持もしない
引数で渡してるならほとんど問題おきないな

引数で渡すって怠慢をするから他の多くのものが必要になってる感はたしかにある
977デフォルトの名無しさん:2008/12/27(土) 02:16:18
X引数で渡す
○引数で渡さないでポインタを保持する
978デフォルトの名無しさん:2008/12/27(土) 02:19:39
newしたポインタを誰も管理せずに関数の引数で持ち回ってるの?
それだから例外安全だって言ってるの?

ダメだこいつ早く何とかしないと
979デフォルトの名無しさん:2008/12/27(土) 02:23:28
void foo(X *px){
...
bar(px);
...
}

int main(){
foo((X*)malloc_wrapper(sizeof(X)));
delete X;
}

引数で渡すってこういうこと?
980デフォルトの名無しさん:2008/12/27(土) 02:28:11
>>978
どういう場合を考慮して駄目って言ってるの?

>>979
インスタンス1つに付き変数1つみたいな感じだ
なんではじめのmallocで確保したときは変数もってもいいぜ
でもそれ以外は駄目
引数で渡すってのはそれであってる
981デフォルトの名無しさん:2008/12/27(土) 02:49:44
fooやbarが例外投げたらとか下らないことは言うなよ
絶対投げない関数しか使わないから
982デフォルトの名無しさん:2008/12/27(土) 02:57:32
エラーメッセージだして終了だろ常考
983デフォルトの名無しさん:2008/12/27(土) 03:36:18
例外を送出しない保障の関数しか使わないのかー。
そんな最強クラスに強い例外安全性だけでコード書くとか俺には無理すぎる。
984デフォルトの名無しさん:2008/12/27(土) 03:52:25
>>983
例外使えないとなんか駄目なんだw
そんなにあの機能役に立つとは思えないけどなー
コードスタイルひっくり返すほど重要なんだw
あんまり応用効かない技術に頼ってんのな
985デフォルトの名無しさん:2008/12/27(土) 03:55:16
なんかの位置間違えたんだろうなきっと
986デフォルトの名無しさん:2008/12/27(土) 06:05:13
>>984
だって便利とかの以前にC++の他の人が書いたライブラリはほぼ全滅。
標準ライブラリもboostも諦めるしかない。
newもnothrowとかplacement newとかしか使えないじゃん。

ついでにoperator hoge(=,+,etc)系は、
本質的に例外使えないとエラーを表現できないから使えない
同じくコンストラクタもエラーの通知方法は例外だから使えない
operator =とコンストラクタが使えないって事は結局ただのPODと殆ど同じ。

エラーの発生しない事が保障できるなら上の構文も使えるけど、
そんなのはPODに毛が生えたようなしょぼいデータ構造だけだろうし役には立たなさそう。

POD相当のクラスしか使えないC++って何に使えるの?
本当にCよりはマシってぐらいしか使い道なさそう。

個人的にはC++では例外は空気のように存在してて、それが無い世界が割と想像できん。
987デフォルトの名無しさん:2008/12/27(土) 06:41:42
Google 社では例外禁止だけどな。
988デフォルトの名無しさん:2008/12/27(土) 07:10:12
>>987
突然、どうしたんだ?
989デフォルトの名無しさん:2008/12/27(土) 08:39:31
>>986
だから全部使ってねぇって
C+クラスしか使ってねぇっていってんじゃん
990デフォルトの名無しさん:2008/12/27(土) 08:43:22
つまり、C99で拡張された機能も使えずC++の便利な機能も一切使えず、
未だに20年近く前の技術にしがみつくということなのですね、判ります。
991デフォルトの名無しさん:2008/12/27(土) 08:47:02
>>990
仮に使うと何がどうよくなんの?
って機能ばっかりだけどな
クラスにしてもあんまりご利益ないんだよね
992デフォルトの名無しさん:2008/12/27(土) 08:54:07
老害
993デフォルトの名無しさん:2008/12/27(土) 09:28:12
いやだから、頭が20年前のレベルから進化してないのだろ?
大人しくCを使っておけばいいと思うよ。
COBOL専業のソフトハウスだってあるご時世だ、C専業もあるだろさ。
つーか、>992に同意。
994デフォルトの名無しさん:2008/12/27(土) 09:59:51
>>960
ならそもそも、954も言っているが、953のような有り得ない状況を元に話をするなよ。
995デフォルトの名無しさん:2008/12/27(土) 10:09:48
>>993
みんなそうだけど
全然説明できないよね
テンプレートまわりの利点ってさ
作り手のオナニー以上の効果は絶対にない
996デフォルトの名無しさん:2008/12/27(土) 10:19:34
こういうのをマクロではなく関数として記述できるとか、
#define swap(type, x, y) do {type t = (x); (x) = (y); (y) = t;} while (0);
CのqsortよりC++のsort関数テンプレートのほうが見た目が自然でしかも速いとか。
997デフォルトの名無しさん:2008/12/27(土) 10:21:06
>>996
枝葉末節だな
998デフォルトの名無しさん:2008/12/27(土) 10:22:40
言ってみろって言われて初っ端そんなことしかでてこないところとか
もうホントなんもねぇだろw
999デフォルトの名無しさん:2008/12/27(土) 10:24:52
↓最後に当を射たレス
1000デフォルトの名無しさん:2008/12/27(土) 10:25:32
1000ならC言語に戻す
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。