【初心者歓迎】C/C++室 Ver.67【環境依存OK】

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2009/09/16(水) 03:48:33
>>948
ポリシークラスは、ホストクラスからアクセスされるクラスであって、
ポリシークラスからホストクラスにアクセスするのは設計が良くないと思う。
ポリシークラスで必要になるデータは、ポリシークラスのメンバ関数の引数で受け取るようにするのが無難。
どうしてもホストクラスにアクセスしたいというなら、仮想関数しかないね。

以下個人的に思う事。
Policy設計は、ポリモフィズムが必要なケースには向いてないと思う。
STLやboostのような汎用的なライブラリを作るのに向いてると思う(趣味グラマではそういうケースがほとんどない)。
953デフォルトの名無しさん:2009/09/16(水) 14:50:20
template<class Writer> class Hoge : public Writer
{
  list<int> data_;
};
struct Writer
{
  void Write(); // どうにかしてdata_を取得して出力
};
Hoge<Writer> h; h.Write();

こういうのは悪手ということですかぁdです
本読んだときはなんかすごいと思ったんだけど実際やってみようとすると
難しい割りにうまくいかなくてしょんぼり・・・
954デフォルトの名無しさん:2009/09/16(水) 14:58:10
template<class DataType>
struct Writer
{ void Write(const DataType &data); };

typedef Writer<std::list<int> > Writer_IntList;

template<class Writer_IntList>
class Hoge : public Writer_IntList
{ std::list<int> data_; };

こんな感じかなあ
955デフォルトの名無しさん:2009/09/16(水) 14:58:37
自己言及テンプレートは普通、
template <typename T>
class base {
public:
T foobar();
}
class derivedA : public base<derivedA>;
こういう構成な気がするが…
956デフォルトの名無しさん:2009/09/16(水) 14:59:20
かぶった予感
957デフォルトの名無しさん:2009/09/16(水) 17:18:05
クラスというものを少しずつ覚え始めたんですが、
C言語に移植するんてことを考えない限り、構造体や関数を定義するより
なんでもかんでもクラスにしてしまったほうがいいんでしょうか?
958デフォルトの名無しさん:2009/09/16(水) 17:19:35
ケースバイケース
959デフォルトの名無しさん:2009/09/16(水) 17:55:30
うーん、そうですか。ありがとうございますた
960デフォルトの名無しさん:2009/09/16(水) 17:58:38
基本的にはクラスでやるもんじゃねーの?
961デフォルトの名無しさん:2009/09/16(水) 18:23:13
ケースバイケース
962デフォルトの名無しさん:2009/09/16(水) 18:40:59
関数で色々作っておいて、後からそれらを使ってクラス化するほうが
大抵失敗しない気がする。
963デフォルトの名無しさん:2009/09/16(水) 18:47:22
情報単位じゃなくて処理単位だよね
初期のC+オブジェクトな考え方を大声で吹聴するジジイどもは早く引退してくれ
964デフォルトの名無しさん:2009/09/16(水) 18:56:22
>>954
template<class DataType, template<class> class Writer>
class Hoge : public Writer<DataType>
{ DataType data_; };
こうじゃないかな。

>>957
構造化プログラミングもOOPもその他のパラダイムもできてしまうのがC++の柔軟さであり、罠でもあるところ。
柔軟に使いこなせればベストなんだろうけど、OOPだけを考えて作った方が失敗が少ないかもしれない。
965デフォルトの名無しさん:2009/09/16(水) 19:31:26
OOPだけ考えて作ると、例えばソート処理とかひどいことになるんじゃね?
966デフォルトの名無しさん:2009/09/16(水) 19:36:41
ソートするなら、構造化まで戻るか、総称型まで進むか、かな
メソッドや継承だけでどうにかしようとは思わないな
967デフォルトの名無しさん:2009/09/16(水) 21:23:16
>>965
STLとboostは使うべきだと思う。
OOPで作るのが難しい物ってそうもない気がする。
まあ、ゲームなんかは物によってはOOPで作るのが難しいかもしれないが。
968デフォルトの名無しさん:2009/09/16(水) 21:42:54
少なくとも学生が使っていいもんじゃないと思う。
969デフォルトの名無しさん:2009/09/16(水) 22:04:39
「OOPじゃオーバーキルだ」という場面と「OOPじゃ機能不足だ」という場面が
ある。
前者は、構造化くらいで十分適切なところを無理にOOP化しても、という考え方で、
これに対しては「別に全部OOPでいいよね」って話になる。(Applicationクラスを
作ったりObjectクラスを作ったりするのはやりすぎだけど)
後者は逆に、ジェネリックプログラミングとかメタプログラミングとか便利じゃん、
という考え方で、こっちは「OOP縛りじゃ時々困るよ」って話になる。
この二つの話が混乱してる気がする。
970デフォルトの名無しさん:2009/09/16(水) 22:08:51
>>969
> 「OOPじゃオーバーキルだ」という場面と「OOPじゃ機能不足だ」という場面が
「OOPじゃ役不足だ」という場面と「OOPじゃ力不足だ」という場面が
でいいのに、オーバーキルとかゲームする人じゃないと通用しなくね?
971デフォルトの名無しさん:2009/09/16(水) 22:16:06
普通の英語じゃね?
IT関係の記事とかにも使われてるじゃん
972964==967:2009/09/16(水) 22:34:32
>>969
前者も後者も開発効率を問題にしているという意味では同じでしょ。
C言語が手続き型しかできないからといって、作れないプログラムがあるわけじゃない。

俺が言いたいのは、適切にパラダイムを選んで柔軟に書く能力があればベストだけど、
経験の浅いPGにとって、選択肢の多さは良くない設計を選ぶリスクの増加になってるんじゃないかという事。
973デフォルトの名無しさん:2009/09/16(水) 22:40:45
>>967
boostと出会ったおかげでSTLを使う気になった。STL単独では使う気にならないな。
974デフォルトの名無しさん:2009/09/16(水) 22:45:30
>>972
後者はランタイム効率も変わるぞ
975デフォルトの名無しさん:2009/09/16(水) 22:48:14
>>974
前者もランタイム効率は変わるぞ

というか、基本は手続き型、必要ならクラス、必要ならジェネリック、必要ならメタ、
ってそんなリスキーかね?
全部クラスにする方がリスキーだと思うけど
976デフォルトの名無しさん:2009/09/16(水) 22:53:20
STLだとVCでテストしてる時に、IDE上で中身が簡単に見れるから使う
自作listだと、わざわざnextポインタから開いていかないといけないからメンドイ
977デフォルトの名無しさん:2009/09/16(水) 22:57:16
懐かしいなw俺もクラスに目覚めた頃は>>957だった
実際、一人で開発するならそれもいいかもしれない
もう少しプログラムを作りまくれば、ケースバイケースが見えてくるだろう。
あえて言うなら趣味でも、時間的な区切りをつけてみるといい。プログラムの効率をもっともっと考えれるようになる・・かもしれない
978デフォルトの名無しさん:2009/09/16(水) 23:42:49
>>974
パラダイムの違いによって出るランタイム効率の差なんて問題にならないレベルでしょ。
>>975
これを言ってはおしまいだが、C++がリスキーだと思う。
いろいろできるC++より、制限の多い言語の方が初学者向きという意味で「OOPだけ〜」と言った。
熟練したPGがC++をどう使うべきか、は宗教論争にしかならないんじゃない?
979デフォルトの名無しさん:2009/09/17(木) 02:37:27
何だ、C++を覚える時にいきなりOOP縛りの方がいい、って主張してるんじゃなくて、
OOP縛りの言語に乗り換えろって意味だったのか。
初心者だろうが熟練者だろうが、C++を使うなら最初から最後まで、必要なところだけ
OOPという使い方で十分だろ。
C++以外の「制限の多い初学者向き言語」の話はどうでもいい。
980デフォルトの名無しさん:2009/09/17(木) 02:48:36
なんかやらしい言い方をしてるな
できることが多くて混乱してしまう可能性があるから、使い方を制限して慣れてみたらどう?と言ってるんだろうと思うよ。

制限するくらいなら制限された言語を使えばよろしい、というのはもっともだけれど、ここはC/C++スレ。
981デフォルトの名無しさん:2009/09/17(木) 02:58:37
>>975
たいていのプログラムはデータをどうにかするものなんだから、
基本はクラス、必要なら手続き型、ジェネリック、メタ、
でよくない?
982デフォルトの名無しさん:2009/09/17(木) 03:13:12
>>979
OOP縛りの方がいいと主張してる。
なぜOOP縛りの方がいいと思ったか、理由を説明するために他の言語の話を出した。

> 初心者だろうが熟練者だろうが、C++を使うなら最初から最後まで、必要なところだけ
> OOPという使い方で十分だろ。
「必要なところだけ」とは言うが、全部Cライクで書くこともできるし、全部OOPで書くこともできる。
必要不必要の判断基準なんて人それぞれで、議論しても宗教論争になるだけだと思うんだが。
他人がどういう判断基準持っていようがケチつけるつもりはないよ。
>>957の質問に対して自分の考えを述べたまで。
983デフォルトの名無しさん:2009/09/17(木) 03:24:56
すべての根底となるクラスが存在しない時点で、C++を用いた完全なOOPは
不可能であるという、一つの結論が出てたような
984デフォルトの名無しさん:2009/09/17(木) 03:30:00
完全の定義がよく分からん。
985デフォルトの名無しさん:2009/09/17(木) 03:30:05
エントリポイントを 変えれば いいじゃない
986デフォルトの名無しさん:2009/09/17(木) 03:38:44
> 全部OOPで書くことができる
俺はこれがもうわからんのだが、>>984はどう
987デフォルトの名無しさん:2009/09/17(木) 03:45:51
基底クラスがない代わりにテンプレートを作ったのかもしれないと今思ったが、どうなの
988デフォルトの名無しさん:2009/09/17(木) 06:56:30
>>983 不完全を証明するにはただの1例を示せばよい。

具体例をどぞ
989デフォルトの名無しさん:2009/09/17(木) 07:42:38
とりあえずそのエントリ変えた完全なOOPとやらがどうしようもない糞コードなのは間違いないが
990デフォルトの名無しさん:2009/09/17(木) 07:58:29
C++でもOOP縛りがいい、という主張には全面的にNOだな。
「OOPより簡単な物じゃ駄目だよ」と「OOPより複雑な物は初心者には要らないよ」を
同時に主張しているが、OOPは銀の弾丸じゃない。
昔よく見たような「OOPは難しいから初心者は全て手続き型でいいよ、でも構造化は
絶対に習得しようね」というOOP知らずな連中の甘言をそっくりそのまま一段進めた
だけにも見える。
大体、初心者を馬鹿にしすぎ。
991デフォルトの名無しさん:2009/09/17(木) 08:14:32
本人が実際に両方やりゃ勝手に分かるだろ
どうせここでは結論なんか出ない
992デフォルトの名無しさん:2009/09/17(木) 11:54:52
旧世代なオッサン怒涛の逆襲来たー
993デフォルトの名無しさん:2009/09/17(木) 12:43:06
柔軟に適切な選択をするのは難しいから、OOPと手続き型がどっちが良い?
と言うのであれば、俺の主観だと OOP3 : 手続き7 くらいの割合を選ぶ。
4:6くらいでも良い。

OOP主体だと汎用性を高めようとして記述量が増えるか、インターフェースが
ゴタゴタで使い手側が気をつけないと危険な物になる印象。
それらを乗り越えるためにあえてOOPの練習するのも良いかもしれないが。
994デフォルトの名無しさん:2009/09/17(木) 13:32:52
「OOPL」と「手続き型」は背反しませんが。
995デフォルトの名無しさん:2009/09/17(木) 13:55:39
OOP無しの構造化だけのパラダイムを指してるんだろ常考
996デフォルトの名無しさん:2009/09/17(木) 13:57:59
初心者だからと言って、OOPなんて古典的なやり方だけに閉じこめる理由は無いだろ
997デフォルトの名無しさん:2009/09/17(木) 14:04:22
次スレは?
998デフォルトの名無しさん:2009/09/17(木) 14:28:02
なし
999デフォルトの名無しさん:2009/09/17(木) 14:31:36
そして
1000デフォルトの名無しさん:2009/09/17(木) 14:33:23
伝説へ(パラダイム的な)
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。