【初心者歓迎】C/C++室 Ver.45【環境依存OK】
at TECH
[前50を表示]
950:デフォルトの名無しさん
07/12/26 22:36:45
逆に言えば、探せばライブラリは余裕で見つかる。
951:デフォルトの名無しさん
07/12/26 22:38:29
>>947
なるほど・・・まだC++の感覚を掴んでないようですorz
どうしても基本はCにあってクラスを利用する、という使い方しかできてないです
例えばそのPersonクラスがあったとして人が複数人居た場合Personクラスのオブジェクトを複数作るんですよね?
そういう時にPerson1とPerson2があるとして、Person1が何かするとPerson2に影響が出るような場合Person1のメンバ関数内でPerson2のメンバ変数を書き換える必要なんかが出てしまうと思うんです
そういうのがいくつか出てきて、クラス設計の失敗だろうか?と思ったんですが、なんかすごい勘違いしてそうです。
指摘してもらえると助かりますorz
952:デフォルトの名無しさん
07/12/26 22:47:08
デザインパターンの本を読めば世界が変わるよ。
953:デフォルトの名無しさん
07/12/26 23:03:43
>>951
人の定義をPersonというクラスで行ったわけだから、個別の太郎やら花子ちゃんは、変数として宣言していく
Person taro;
Person hanako;
taro.putOutUnko();
hanako.putOutUnko();
ここまではいいとして、
taroがhanakoのメンバ変数を直接いじるようなことはしない。
オブジェクト間の作用は「メッセージ」という考え方によって行われる。
この相互作用は設計の段階では、太郎やら花子みたいな具体的なオブジェクトではなく、Personといった抽象的なレベルで考える。
ここで、Personをうんこの国の国民とする。
うんこの国にはうんこの王様がいて、国民にうんこしろ、と命令できる。
この命令(メッセージ)を国民に伝えるには、王様が国民のputOutUnkoを呼び出せばいい。
954:デフォルトの名無しさん
07/12/26 23:04:49
と、その前に、王様と国民の関係を明確にしないといけない。
ここでは、王様は国民を管理する立場とする。国民は王様に管理される立場。
だから王様と国民は 1 : n の関係になる。
以上のことをC++として実装するとこうなる。
class King {
public:
// うんこ命令関数
void orderUnko(string& name) {
map<string, Person>::iterator ite = kokumin.find(name); // 国民を名前で探す
if( ite != kokumin.end() ) {
// 探している国民が見つかったら
ite->second.putOutUnko(); // うんこをしてもらう(国民への愛のメッセージ)
}
}
private:
map<string, Person> kokumin; // 国民を名前で管理する
};
955:デフォルトの名無しさん
07/12/26 23:18:59
Kingクラスのメンバ関数はstaticにはしないんだろうか
テンプレートってやつだろうか、まだやってないんだがなんとなくわかったかもしれない
しかしite->second.putOutUnko();のsecondってなんだろう
iteに見つかった国民の名前が格納されているとしたらsecondにはその国民nオブジェクト名が入ってるのか・・?
んなわけないよなぁorz
956:デフォルトの名無しさん
07/12/26 23:19:28
>779
errata に載ってたべ。
URLリンク(www.aristeia.com)
957:デフォルトの名無しさん
07/12/26 23:27:09
>>955
mapのイテレータの
firstはstring(ここでは国民の名前)、
secondはPerson(国民オブジェクト)
をそれぞれ示している
first second
┌─┬──┬───┐
│1│ "太郎"│ Person taro; │
2 "花子" | Person hanako;|
罫線ずれまくり、マンドクセ
Kingのメンバ関数orderUnkoはstaticにしない
具体的な王様が存在するわけだから
King ore;
ore.orderUnko("sakura");
とかやって、さくらたんに排泄を強要したりしてハァハァ
958:デフォルトの名無しさん
07/12/26 23:30:02
あ、なるほど
mapとやらに識別子(国民名)と該当オブジェクトへのポインタかなんかを宣言する時に格納していくのか
Kingのメンバ関数からPersonのメンバ関数が呼び出せるのは、普通だよな
なるほどさんくす、最初にテンプレートの方をやってくることにするぜ、助かりました
959:デフォルトの名無しさん
07/12/26 23:36:24
横から失礼、そのKingを複数宣言する必要がある場面でどういった場面なんでしょうか?
960:デフォルトの名無しさん
07/12/26 23:50:59
今回の場合は、ある特定のうんこの国に着目したから、Kingオブジェクトは1つしか登場しない。
でも、視点を変えて、国がたくさんある場合は話が違ってくる。
うんこの国が複数存在して、首脳会議とかやると、国の数だけ王様にご登場いただかなければならない
まぁ、ここらへんは実際の分析対象の事情による。
プログラムってのは目的があって存在するわけだから、その目的に沿ったように分析しなきゃいけない。
分析の話ついでに、
分析対象は視点によって認識のされ方が変化していくってのを忘れないで。
今回は王様と国民の関係に限定して分析したけど、
王様の家族からすれば、王様は父親だったり夫だったりするわけ。
だから、分析するときには、どういう視点で分析しなきゃいけないのかをまず決めとかなきゃいけない。
今のケースだと、王様と国民の関係って視点で分析したけど、
首脳会議なんか出てきて、国家間の視点に移行したわけだよ。これはこれで、話が違ってくるよね。
「視点が変わった」ってところを強く意識するのを忘れないでね、って話。
961:デフォルトの名無しさん
07/12/26 23:54:28
なるほど、map<int,string,Person>とかにして国を識別するわけではないんですね、ありがとうございました。
962:デフォルトの名無しさん
07/12/27 00:01:49
いや、そのnは要らない。
仮に、float型の変数fに必要だと言うのならfloat f = float(atof(str))でいい。
勿論、float f = atof(str)だけでも構わないし、float f = static_cast<float>(atof(str))としても構わないが。
963:デフォルトの名無しさん
07/12/27 00:21:56
どが3個くらいつく素人ですが・・・。
>>960
うんこ国同士の相互性や関係性をモデル化したプログラムを作るのと、
うんこ国内でのうんこ内政をモデル化したプログラムを作る場合とで、
うんこ国王に実装させるべきメソッドが変わってくるということでしょうか。
964:デフォルトの名無しさん
07/12/27 00:23:26
そもそも国王は必要なんでしょうか…。
とか思い出すと一行も書けなくなる。
965:デフォルトの名無しさん
07/12/27 00:25:05
うんこをさせる、働かせる、給料をやる、とかPersonクラスにある関数と同じ数だけKingクラスのメンバ関数が増えていくんじゃないの
966:デフォルトの名無しさん
07/12/27 00:26:10
国王が必要ない程度ならクラスを使わなくても良さそうな・・・?
俺は>>965と同じ解釈してた
967:デフォルトの名無しさん
07/12/27 00:28:03
taro.Insert(hanako);
上のコードでメモリリークしている様なのですが‥‥
968:デフォルトの名無しさん
07/12/27 00:36:20
サイズが合わないんじゃないの?
969:デフォルトの名無しさん
07/12/27 00:37:58
taroにガベージコレクタを被せてください。
970:デフォルトの名無しさん
07/12/27 00:39:49
>>967
下剤使いすぎたんじゃないの?
971:デフォルトの名無しさん
07/12/27 01:34:56
>>963
まったくもって、そのとおり
もしかすると、いくつか似たようなメソッドが出てくるのかもしれないけど、視点は違ってくる。
世の中に万能なプログラムなど存在しなくて、
目的に合わせて作っていかなきゃいけないという現実が何よりの証拠。
>>964
目的がうんこするだけなら、国王なんていらんのです
ここでは、オブジェクト間の関係を示すため、
うんこの国をふと思いついたので、そういう設定にしただけです
仮にあなた自身の「うんこをするという行為」について分析した場合、
トイレやトイレットペーパー、あなたといったオブジェクトが関係として表れて来るのです。
水を流す、尻をふく、うんこする、というように
はい、うんこは素晴らしいのです
>>965
そんなことはないです
基本的に、それぞれが持っている動作は異なる
例えば、国王が国会での審議を下すという動作を持っているとしても、国民は持たない。
これはそれぞれの「役割」が異なるから。
国王が国民に直接給料をやる、ってことはしないので、
雇い主というクラスに、国民に給料あげるという責務を負わせる。
ここでも、視点が変わったから、これまでのクラスは考え直さなきゃいけない。雇い主だって国民の一部なわけだし。
972:デフォルトの名無しさん
07/12/27 01:37:34
使わない引数の警告を除く
gcc #pragma unused
VC7 or 8 で
unusedインライン関数にあたる関数(可変長引数でOK)を探してます
973:デフォルトの名無しさん
07/12/27 01:48:42
#pragma warning(disable:警告番号)
ではダメ?
974:デフォルトの名無しさん
07/12/27 01:51:07
後戻りを防ぐためにも、設計は上流からね。アジャイルっぽくガシガシ作るのはそれを覚えてからでも遅くない。
975:デフォルトの名無しさん
07/12/27 01:55:47
>>971
つまり、クラスを作るとなると必ずどこかで1:nが成立するということでしょうか?
今回の場合複数用意されるであろうPersonクラスがあり、それを管理・操作するKingクラスがある、というような
976:デフォルトの名無しさん
07/12/27 09:46:29
ダウンキャストってもの凄い勢いで嫌われてるけどダウンキャスト無しで何とかなる物?
基底クラスのインターフェイス設計が悪いと言われればそれまでだが
派生したオブジェクトを基底クラスのポインタで受けないといけないときとかキャストしないといけないシーンが多すぐるorz
977:デフォルトの名無しさん
07/12/27 09:58:07
dynamic_cast使ってキャスト失敗時の処理きちんとやっておけば問題ないんじゃね?
978:デフォルトの名無しさん
07/12/27 10:07:54
>>277
Effective C++なんか読んでみるとダウンキャストするよりは
派生クラスのポインタで示すか、
それが出来なければ基底クラスにデフォルトでは何もしない仮想関数を追加しろっていってるけど
機能を追加するたびそんなことやってたらインターフェイス部分が肥大化して
高い位置にあるクラスに対するインターフェイスとしては使いにくくなるわけで・・・
やはり設計は計画的にということなのかorz
979:デフォルトの名無しさん
07/12/27 10:13:33
ヘルパ関数にすればいい
980:デフォルトの名無しさん
07/12/27 10:26:22
ヘルパ関数とはなんでしょうか?
ぐぐってみたけどいまいち納得のいく説明がないです・・・
981:デフォルトの名無しさん
07/12/27 12:47:14
>>868
亀杉だがあらかじめ引数が変化することが分かってるなら動的引数なんて方法もあるな
982:デフォルトの名無しさん
07/12/27 14:31:36
取得したデータをfile.txtというテキストファイルを自動生成してそこに出力したくて
//取得データのfile.txtファイルの自動生成
FILE *fp;
fp = fopen("file.txt","w");
と書きました。
コンパイルしたら
error C2065: 'fp' : 定義されていない識別子です。
と表示されました。fpというのはどのような宣言をすればいいのでしょうか。
環境はWindows XP Pro SP2、メモリ2G、VC++2005(Express)です。
アドバイスお願いします。
983:デフォルトの名無しさん
07/12/27 14:39:16
>>982
そのコードを見る限りでは、それで問題なさそうだよ。
・#include <stdio.h> があるか
・C++ではなくCなら変数宣言はブロックの先頭じゃなきゃいけない
・直前のコメントを消してみる
などをチェキ
984:デフォルトの名無しさん
07/12/27 14:57:35
>>983
#include<stdio.h>がありませんでした。
追加してみたけど変わりませんでした。
Cとかかれていたサンプルプログラムをいじっているのですが拡張子が*.cppなのでC++なのでしょうか。
int main(){
直後に
FILE *fp;
を置いたらエラーが消えました!
ありがとうございました!
もうひとつ質問で申し訳ないのですが
*.cはC言語でしょうけど*.cppというのはCでもC++でもあるのでしょうか。
判別方法というのはあるのでしょうか。
985:デフォルトの名無しさん
07/12/27 15:11:53
>>984
大概のコンパイラは*.cをC、.cppをC++と見なしてコンパイルする。
C99以外のCなら大抵の場合C++としても通るから、普通は.cppで問題ない。
(ただしDLLのソースとかでエクスポート関数がある場合は注意)
986:デフォルトの名無しさん
07/12/27 15:12:00
>>984
一般的なコンパイラならファイル名が*.cppならC++とみなして
コンパイルすると思うけど、
それをCとしてコンパイルする手段はあるだろうし、
あなたがどうやってコンパイルしているかわからないので、
何とも言えず。
気になるようだったら、main()の最初に
#ifdef __cplusplus
printf("C++なの\n");
#else
printf("Cなの\n");
#endif
とでも入れてどっちが表示されるか試してみるといいかもね。
987:デフォルトの名無しさん
07/12/27 15:14:04
>>985-986
なるほど〜。
ありがとうございます。
コンパイルの方法は
VC++のソリューションエクスプローラーのソースファイルを右クリックする
といった方法でやっています。
988:デフォルトの名無しさん
07/12/27 16:07:49
へぇ、VC++では右クリックでコンパイルされるのか。珍しいI/Fだな。
989:デフォルトの名無しさん
07/12/27 16:18:43
コンテキストメニューからソースファイル単位のコンパイルってことだろ
990:デフォルトの名無しさん
07/12/27 17:31:22
template<bool>
struct CompileTimeChecker
{
CompileTimeChecker(...);
};
template<> struct CompileTimeChecker<false> {};
#define STATIC_CHECK(expr, msg)\
{\
class ERROR_##msg {}; \
(void)sizeof(CompileTimeChecker<(expr) != 0>(ERROR_##msg()));\
}
int main()
{
STATIC_CHECK(true, HOGEHOGE)
}
Modern C++のCompileTimeCheckerというコンパイル時にエラーチェック
をするマクロなのですが、コンパイルが通るはずの条件で呼び出して
も、VC++ 2008では以下のエラーが出てコンパイルできません。
関数型へのキャストが正しくありません。
'CompileTimeChecker<__formal> (main::ERROR_HOGEHOGE (__cdecl *)(void))':
sizeof オペランドが正しくありません。
g++ v4でも
関数へのsizeof?が不正だといわれます。何か間違ってるところはありますか?
本のソースそのままなのですが。
991:990
07/12/27 17:39:24
ちなみにBCCでは通りました。
992:990
07/12/27 18:00:30
どうやらsizeofに一時オブジェクトを渡すのは不正みたいですね。
以下でうまくいくようです。著者はどうやってコンパイルできたか
疑問です。コンパイラの違いでしょうか?ソースも間違っている
みたいです。
template<bool>
struct CompileTimeChecker
{
CompileTimeChecker(...){} //定義が必要だった
};
#define STATIC_CHECK(expr, msg) \
{\
class ERROR_##msg {};\
CompileTimeChecker<(expr) != 0> c = CompileTimeChecker<(expr) != 0>((ERROR_##msg())); \
(void)sizeof(c); \
}
993:デフォルトの名無しさん
07/12/27 18:10:10
>>992
BCCしか使ってないんじゃね?
994:990
07/12/27 18:16:35
>>993
いくつかのコンパイラで試したと書いてありましたが
それらでは問題なかったんでしょうね。
もはや (void)sizeof(c); \ の行は不要ですね。
どうやらエラーが出ていたのは一時オブジェクトではなく
sizeof(Widget())という形が関数に対してsizeofが行われて
いると判断されてたみたいです。これはもちろん不正ですが。
995:デフォルトの名無しさん
07/12/27 20:27:19
995
996:デフォルトの名無しさん
07/12/27 20:33:48
スレリンク(tech板)
はい新スレ
>>1の名前は気にしないでくれ。間違えた。
997:デフォルトの名無しさん
07/12/27 20:36:50
擦れた手乙埋め
998:998
07/12/27 20:41:39
99−
999:999
07/12/27 20:42:00
999666999666
1000!
1000:デフォルトの名無しさん
07/12/27 20:42:22
1000は俺が取るよ。
1001:1001
Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5007日前に更新/246 KB
担当:undef