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


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

C++相談室 part32
251 名前:デフォルトの名無しさん :04/06/28 23:29
Tucker!って結城氏だったの?

252 名前:デフォルトの名無しさん :04/06/29 00:15
>>435
日経ソフトウェアの「ゼロから学ぶソフトウエア設計」を読んでみるのもいいんではないでしょうか?

253 名前:デフォルトの名無しさん :04/06/29 01:26
>>235
ほんとうに基礎的なことだけど
フローチャート書いて
考えまとめてから取り掛かれば、いいんじゃない?

254 名前:デフォルトの名無しさん :04/06/29 01:38
釣りはご遠慮ください。

255 名前:デフォルトの名無しさん :04/06/29 02:43
複数のクラス群、
( A1, B1, C1 ), ( A2, B2, C2 ), ( A3, B3, C3 ), ... をポリシーっぽく使って、
template< typename A, typename B, typpename C >
class SomeFunc {
private:
A a;
B b;
C c;
};
にインスタンスを作ってファンクタとして使っています。
今、新しく、( Anew, Bnew, Cnew ) を作成する必要が出たのですが、
Cnew は、Anew のメンバ関数を使用することになってしまいました。
CnewのコンストラクタにAnewのポインタか参照を渡せば済むことなのですが、今までの
クラスを互換性がなくなってしまいます。この場合、どのようにしたらいいのでしょうか?
古い、クラス群にダミー引数を渡せば済むのでしょうが美しくないと思ったので質問しました。

256 名前:デフォルトの名無しさん :04/06/29 03:00
class ChasA:SomeFunc<A,B,C>{
 ChasA::ChasA():c(a){}
}
思いつきだけどこんな感じじゃだめ?かき方間違ってるかも知らんけど

257 名前:デフォルトの名無しさん :04/06/29 03:50
仮にchar *choice = new char[10];
というchar型配列へのポインター choice があったとして、
コンマ ',' をデリミネーションとして複数の数値をインプット
したいんだけど(例:1, 3, 4 で1と3と4がインプットされる)
文字列としてインプットさせて、strtokでコンマごとに区切り、
atoiで数値化するという方法でならできたけど、こうやらないと
できないの?
get()とかgetline()の使い方が今一よく分からないからかも。。。
もしそういうの使った簡単な方法知ってたら教えてくだされ誰か。

258 名前:デフォルトの名無しさん :04/06/29 05:31
boost::tokenizer とか。

259 名前:デフォルトの名無しさん :04/06/29 09:45
boost::spirit とか。

260 名前:デフォルトの名無しさん :04/06/29 14:35
std::istringstream とか

261 名前:デフォルトの名無しさん :04/06/30 10:41
動的配列で初期化を与える場合、書式は
new 型名 [配列サイズ] (初期値);
でいいの?

262 名前:デフォルトの名無しさん :04/06/30 10:48
>>261 だめです。

263 名前:デフォルトの名無しさん :04/06/30 13:27
外部クラスを利用するところでつまづいて困っています。
KNekoクラスを外部に用意しておきメインのcppファイルで利用したいのですがコンパイルに成功しません。
よろしければアドバイスお願いします。

コードです。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/lounge/file/1074774948_18/class.txt

264 名前:デフォルトの名無しさん :04/06/30 13:36
#include <string>
class KNeko{
private:
-string name;
+std::string name;
public:
-void SetName(string n);
+void SetName(std::string n);
void Naku();
};


265 名前:デフォルトの名無しさん :04/06/30 13:47
>263
using namespace std
の位置を考えろ。意味を考えろ

266 名前:デフォルトの名無しさん :04/06/30 13:53
>>264-265
どうもありがとうございます。
using namespace std;はcoutをstd::なしで使うために書くのではないのでしょうか?
そうとしか入門書にはなかったので。
入門書には乗ってなかったですが#include <string>をつかえば文字列を記憶できる変数型stringを作れるとしか理解してないです。

267 名前:デフォルトの名無しさん :04/06/30 13:56
STLの本を読むことをすすめる
stringもstlだ

268 名前:デフォルトの名無しさん :04/06/30 14:06
歴史的にはstringはSTLじゃないし、std名前空間に属するのは"全てのC++標準ライブラリ"だ。

あとまぁSetName()はvoid SetName(const std::string& n);にすべきだな。

269 名前:デフォルトの名無しさん :04/06/30 14:20
>>267-268
標準ライブラリについてもう少し勉強したほうがよさそうなんで本でも買って勉強したいと思います。
constって普段から使う癖をつけたほうがいいんでしょうか?
まだDOSプロンプトでしか動かない小さなプログラムしかやったことがないのであまり意識をしたことがないのですが。

270 名前:デフォルトの名無しさん :04/06/30 20:13
文字列の内容によって場合わけをする場合って、switch文でやりたいのが
人情かと思うのですが、言語仕様で無理ですよね?
とすると、普通の配列だったらstrcmpかなんかを使って、stringだったら
=="???"とかで比較をしてひたすらif ... else if ... else if ... else
ってやってくしか方法はないのですよね?

271 名前:デフォルトの名無しさん :04/06/30 20:17
>>270
ハッシュ法というのを使うと、ましな比較ができることもありますよ

272 名前:デフォルトの名無しさん :04/06/30 21:21
ああハッシュというのがありましたね。
ただシノニムが発生すると一意な場合わけってできないのかな?

273 名前:デフォルトの名無しさん :04/06/30 21:26
>>272
gperfというツールもありますよ

274 名前:デフォルトの名無しさん :04/06/30 21:34
>>270
比較コストの問題なら、文字列を(読み込む等して)構築した段階で文字列テーブルに登録して、
あらかじめ一意のIDをつけておくというやり方もあります。登録単位を atom とか呼ぶことが多いです。
こんな感じ。

string_id register_string(const string& str); // テーブルに登録してIDを返す。既にある場合には既存のIDを返す。

static string_id apple_id = register_string("apple");
static string_id orange_id = register_string("orange");

void some_eater(string_id str)
{
 if (str == apple_id || str == orange_id) cout << "eat!";
}


275 名前:デフォルトの名無しさん :04/06/30 21:38
>>270
字面の好き嫌いのレベルの話ならif else連ねるしかないよ。
いちいちデータ構造作ってやるのは無駄。

276 名前:デフォルトの名無しさん :04/06/30 21:45
>>270
switch(str[0])
{
 case: 'a':
  switch(str[1])
  {
   case 'p':
    switch(str[2])
     ・
     ・
     ・
   case 'm':
  }
 case: 'o':
  ・
  ・
  ・
}


277 名前:デフォルトの名無しさん :04/06/30 21:49
>>276
途方もないな

278 名前:デフォルトの名無しさん :04/06/30 21:54
map<string, 関数ポインタ>で処理させればいいやん。

279 名前:デフォルトの名無しさん :04/06/30 22:01
60秒毎にメッセージを表示することはできますか?
FAQにあったのですがclockは精度が悪いらしいので・・・

280 名前:デフォルトの名無しさん :04/06/30 22:02
boost::timer

281 名前:デフォルトの名無しさん :04/06/30 22:03
>>279
環境依存なので OS や GUI/CUI 別を明記しないと何とも言えないかと。
そして Win32 なら Win32 APIスレ、UNIX なら UNIX プログラミングスレに
行った方が良いと思う。

282 名前:デフォルトの名無しさん :04/06/30 22:04
>>278
boost::function使えよ

283 名前:デフォルトの名無しさん :04/06/30 22:06
MS-DOSみたいな感じなんですよね・・・ユーザにコマンド打たせて
それに応じた処理をする。ああいうのはやっぱりテーブル用意してるのかな?

284 名前:デフォルトの名無しさん :04/06/30 22:06
>>281
よくわからないんで諦めます・・・

285 名前:デフォルトの名無しさん :04/06/30 22:07
60秒も待つならtimeで十分だろ。
精度1秒

286 名前:デフォルトの名無しさん :04/06/30 22:11
timeより精度が低いclockってあるのか?

287 名前:デフォルトの名無しさん :04/06/30 22:14
>>283
#define DISPATCH(command) else if(line == #command) exec_##command();

288 名前:デフォルトの名無しさん :04/06/30 22:55
おお、Cチックにやるやり方ですね。

289 名前:デフォルトの名無しさん :04/06/30 23:11
>>288
何がCチック?

290 名前:デフォルトの名無しさん :04/06/30 23:14
>>288的に考えるとboost::preprocessorはCチックだ。

291 名前:test :04/07/01 14:22
test

292 名前:デフォルトの名無しさん :04/07/01 14:28
ちょっと教えてほしいのですが。

ネットワークプログラミングをしております。(そんな対したものじゃないんですが)
そしてtelnetクライアントからコマンドを入力したら。そのコマンドに対応する
関数を呼び出したいのですが…

if(strcmp(cmd,"Hello")==0){
ReturnHello();
}else if(strcmp(cmd, "ls")==0{
ReturnFileList();
}else if(strcmp(cmd, "cd")==0{
ChangeDir();
}(以下続く)

今現在、こんな風になっています。これでは効率が悪いとおもうのですが。
どなたかよい解決方法をご存知ないでしょうか…。

この長いif文はクラス内に記述されています。

293 名前:292 :04/07/01 14:31
やばっ。
ちょうどいい具合に上にヒントらしきものが…申し訳ありません…

294 名前:デフォルトの名無しさん :04/07/01 14:46
c言語なんですが課題で出て、まじ分かんなくて助けてほしいです!
このままじゃ赤点になってまう!!
二問あるけど、神な人教えて〜

1.各月の日数を格納した整数型の配列を定義してください。これを利用して、年、月、日を読み込んで、それが年の最初から何日目であるかを表示するプログラムを作成しましょう。
ただし、閏年の規則は、以下の規則で規定されるものとします。

@西暦の年号が4で割り切れる年は閏年。
A@には当てはまるが、西暦が100で割り切れる年は閏年ではない。
B@にもAにも当てはまるが、西暦が400で割り切れる年は閏年。

2.1に以下の機能を追加してください。
1のデータを表示したあとに、その年のその月のカレンダーを表示する機能。カレンダーはfor文の入れ子を使用してみましょう。(使わなくてもできますが。)

その月の1日の曜日が分かれば、カレンダーを作成できます。曜日を調べるのには、以下の文をどこかに挿入してください。曜日を調べる部分は、関数にしてもかまいません。
曜日は、変数retに代入された値で分かります。次の通りです。

日曜日月曜日火曜日水曜日木曜日金曜日土曜日
0123456

  int ret;

if (m == 1 || m == 2) {
y--;
m += 12;
}
ret = (y + y/4 - y/100 + y/400 + (13*m+8)/5 + d) % 7;
yは入力された年、mは入力された月,dは曜日を調べたい日です。1日の曜日を調べたいわけですから、このdには…


295 名前:デフォルトの名無しさん :04/07/01 14:53
スレちがいすまそ…

296 名前:デフォルトの名無しさん :04/07/01 15:59
引数で参照をつかうのとポインタを使うのに違いはあるの?

297 名前:デフォルトの名無しさん :04/07/01 16:00
nullが突っ込めるかどうかだけ

298 名前:デフォルトの名無しさん :04/07/01 16:00
>>296
ポインタだと NULL (0) を渡せる。

299 名前:デフォルトの名無しさん :04/07/01 16:24
>>297-298
ありがd

NULLね〜。
今のところ記にする必要なしだな〜


300 名前:デフォルトの名無しさん :04/07/01 16:46
山椒でも*static_cast<T*>(0)で渡せるけどな

301 名前:デフォルトの名無しさん :04/07/01 17:00
STL って、インターネットで公開されてるコードや、Microsoft とかのコードを見ても
ほとんど見かけないんですが、何か理由があるのでしょうか?

知名度が低くて使われていないだけ?

302 名前:デフォルトの名無しさん :04/07/01 17:03
>ほとんど見かけないんですが

そうか?
APIの解説ページとかならあまり使われはしないだろうが

303 名前:デフォルトの名無しさん :04/07/01 17:03
>>301がネタなのか釣りなのか天然なのかで答えが変わってくるけど
どれ?

304 名前:デフォルトの名無しさん :04/07/01 17:20
わしの周りでもあんまりプロダクトに使ってる人居ない(Cから来た古い人に多い、でもjavaは早う1.5出ろいうのはどういうこと?)
わしは便利なんでガシュガシュ使うんだけど。



305 名前:デフォルトの名無しさん :04/07/01 17:27
STLは構文が汚いからね
vecter<int> <>になじみが無い。

306 名前:デフォルトの名無しさん :04/07/01 17:44
STLって、exeの容量が増えるってほんと?

307 名前:デフォルトの名無しさん :04/07/01 17:45
>>306
あと700レス待ってくれ

308 名前:デフォルトの名無しさん :04/07/01 17:46
>>305
そこで typedef ですよ。

309 名前:デフォルトの名無しさん :04/07/01 18:01
>>305
stack<hoge, dequeue<hoge> >

310 名前:デフォルトの名無しさん :04/07/01 18:02
templateの構文で嫌なのは

stack<hoge, dequeue<hoge> >
                  ^

これだけだな

311 名前:デフォルトの名無しさん :04/07/01 18:06
>>310
dequeueも嫌だ。

312 名前:デフォルトの名無しさん :04/07/01 18:09
>>301
Microsoft の VC では、ちょっと前のバージョンまであまりマトモに stl が動かなかったから、
Windows 用のコードで初出が古いものではあんまり使ってないと思う。
あと C プログラマ上がりの「C++プログラマ」は、stl 使わないというか使えない奴が多い。

313 名前:デフォルトの名無しさん :04/07/01 18:10
いまだにtemplateを素で書けないw


314 名前:デフォルトの名無しさん :04/07/01 18:17
テンプレートのないC++なんて...

315 名前:デフォルトの名無しさん :04/07/01 18:26
>>312
vector<string> hoge;
程度で「デバッグシンボル永杉」とかワーニング吐くしなー。
機能には関係ないとはいえ、あれで気分的に萎えた奴もいると思われ。

ちなみに俺は、iostreamは使わないけどSTLは使う派。

316 名前:デフォルトの名無しさん :04/07/01 18:27
iostreamはprintfより何倍も遅いしな

317 名前:デフォルトの名無しさん :04/07/01 18:34
>>310
hoge が2回は?

318 名前:デフォルトの名無しさん :04/07/01 18:36
C++は正しいコードでもコンパイルが通らなかったりするのがヤダ。

319 名前:デフォルトの名無しさん :04/07/01 18:57
クラスの敬称関係で躓いているのですが「'Income' : 'const class SMan' から 'class SMan &' へ 'this' ポインタを変換できません。
変換で修飾子が失われます。」
となりどうも上手くいきません。
ポインタもアドレスも使用していないのでどうしてこんなエラーが出るのかわからず困っています。
よろしければご指導お願いします。

http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/lounge/file/1074774948_19/q.txt

320 名前:デフォルトの名無しさん :04/07/01 19:00
>>319
これ、コバケンの本だろ?

321 名前:デフォルトの名無しさん :04/07/01 19:02
>>319
×int Income() {return salary * 12;}
○int Income() const {return salary * 12;}

322 名前:デフォルトの名無しさん :04/07/01 19:03
>>319
SMan::ShowData は const メンバ関数なので、非 constなメンバ関数 Income は呼べません。
Income を const メンバ関数にすべきでしょう。

あと、const がらみでは、SetName のパラメータは const string& n とするのが通例です。

323 名前:デフォルトの名無しさん :04/07/01 19:16
>>321-322
ありがとうございます、早速試してみます。

>>320
そのとおりです。

324 名前:デフォルトの名無しさん :04/07/01 19:26
ショボイコンパイラ使ってるな。
行番号位出ないのかよ。
こんくらい情報が出るコンパイラ使えよ(g++)。

a.cpp:38: error: passing `const SMan' as `this' argument of `int
SMan::Income()' discards qualifiers


325 名前:デフォルトの名無しさん :04/07/01 19:51
>>324
非標準拡張の最右翼だろw

326 名前:デフォルトの名無しさん :04/07/01 19:53
-ansi -pedantic

327 名前:デフォルトの名無しさん :04/07/01 21:16
>>325
g++は右翼っていうより左翼じゃない?

328 名前:デフォルトの名無しさん :04/07/01 21:21
>>327
さいうよく [3] 【最右翼】
〔士官学校などで成績順に右から並んだことから〕競い合っているものの中で、最も有力なもの。
「今年度賞金王の―」
三省堂提供「大辞林第二版」より


329 名前:デフォルトの名無しさん :04/07/01 21:42
>>325
>「'Income' : 'const class SMan' から 'class SMan &' へ 'this' ポインタを変換できません。
>変換で修飾子が失われます。」
こっちが最右翼(VC++)だと言ってるんだろ。

330 名前:デフォルトの名無しさん :04/07/01 21:45
本当に行番号が出ないと思ってるっぽいのが笑える

331 名前:デフォルトの名無しさん :04/07/01 21:47
>>329
本当?


332 名前:デフォルトの名無しさん :04/07/01 22:17
行番号なんて出ないでいいしな

333 名前:デフォルトの名無しさん :04/07/01 22:18
ミスッタ

334 名前:デフォルトの名無しさん :04/07/01 22:22
>>300 それ未定義

335 名前:デフォルトの名無しさん :04/07/01 23:19
>>300
それは未定義動作だが。いきなりプログラムが吹っ飛んでも文句言えんぞ。

336 名前:デフォルトの名無しさん :04/07/02 00:04
鼻から悪魔が出てきても(ry

337 名前:デフォルトの名無しさん :04/07/02 00:06
>>300
それは未定義動作だが。いきなりブッシュが核ボタン押しても文句言えんぞ。

338 名前:デフォルトの名無しさん :04/07/02 00:07
>>300
ポインタ理解しててもそれは吐血するほど未定義だぞ

339 名前:デフォルトの名無しさん :04/07/02 02:34
define ABC
と値を指定しないでデファインするとABCの値は何になってるのでしょうか?。


340 名前:デフォルトの名無しさん :04/07/02 02:39
>>339
そのABCを使ってみれば分かると思うが、なし。

341 名前:デフォルトの名無しさん :04/07/02 13:26
お世話になります。

数値をstring型変数に代入するにはどうしたらよいでしょうか?
いまはsprintfで変換してから代入しています。
int i = 100;
string s;
s = "abc = ";
s += i;
という使い方はどうすればよいですか?


342 名前:デフォルトの名無しさん :04/07/02 13:30
s += i;

s += boost::lexical_cast <string> (i);


343 名前:デフォルトの名無しさん :04/07/02 13:42
>>341
class stringex : public string
以下がんばる。

344 名前:デフォルトの名無しさん :04/07/02 13:49
>>341
#!/usr/local/bin/pike

345 名前:デフォルトの名無しさん :04/07/02 14:56
教えていただきたいのですが、
memsetっていうのはどういう働きをするのでしょうか?
できれば、サルでもわかるような説明をお願いします。

346 名前:デフォルトの名無しさん :04/07/02 14:59
メモリそのままのコピー

347 名前:デフォルトの名無しさん :04/07/02 15:00
memcpyかw スマソ

348 名前:デフォルトの名無しさん :04/07/02 15:03
サンプル見たほうが速いかな
ttp://www9.plala.or.jp/sgwr-t/lib/memset.html

349 名前:デフォルトの名無しさん :04/07/02 15:16
教えていただきたいのですが、自分自身のクラス名を取得する方法ってあるのでしょうか?
クラスの型名や、メンバ関数名の取得方法は理解できたのですが。。。

350 名前:デフォルトの名無しさん :04/07/02 15:18
ありがとうございました☆
これを見て勉強します!!

351 名前:デフォルトの名無しさん :04/07/02 15:26
「クラス名」と「クラスの型名」の違いは何ですか?

typeid (hoge).name ();
とかではなくて?


352 名前:デフォルトの名無しさん :04/07/02 15:37
>>351
class hoge
{
public:
hoge(void);
virtual ~hoge(void);
};

hoge hogehoge;

だとすると 型名 hoge、変数名 hogehoge かと、
シロウトですみません。

353 名前:デフォルトの名無しさん :04/07/02 15:45
インスタンス名

354 名前:351 :04/07/02 15:56
>>349
インチキですが,こんなのはどうでしょうか?
#include <iostream>
using namespace std;
class A {};
#define INSTANCE_NAME(arg) #arg
int main () {
A a;
cout << INSTANCE_NAME (a) << endl;
return 0;
}


355 名前:!= 349 :04/07/02 16:04
そんな裏技があったのかw

356 名前:351 :04/07/02 16:11
>>355
こういう反応は一番嬉しいですね.
わたしはこんな風に使ってます.
#include <iostream>
#define DOUT(arg) {std::cout << #arg << ": " << arg << "\n";}
using namespace std;
class A
{
int value_;
public:
A (int p): value_ (p) {}
friend ostream &operator << (ostream &p_os, const A &p_a) {return p_os << p_a.value_;}
};
int main () {
A a (10);
DOUT (a);
return 0;
}


357 名前:デフォルトの名無しさん :04/07/02 16:12
それはインスタンス名では?

358 名前:355 :04/07/02 16:15
ホントだ、変数名では無理か。
てっきりプリプロセッサが影でconstしてるのかと思った。

359 名前:デフォルトの名無しさん :04/07/02 16:19
ところで>>349の「クラス名」と「クラスの型名」のちがいが
はっきりしてないんだが...

360 名前:351 :04/07/02 16:20
>>357,358
なになに?
352のhogehogeを取得したいのではないの?


361 名前:デフォルトの名無しさん :04/07/02 16:22
実は例外処理で、同じクラス型からインスタンスを複数作り、
どのインスタンスでエラーが起きたか調べられるようにしたかったのですが。。。
typeid(*this).name;
を使っても分かるのはクラス型名でインスタンス名じゃなさそう。


362 名前:357 :04/07/02 16:24
>>352読んでなかった。失礼。


363 名前:デフォルトの名無しさん :04/07/02 16:26
>>361
>>354

364 名前:デフォルトの名無しさん :04/07/02 16:30
>>354, 356
ありがとうございます、ユニークな方法ですね。w
でも例外処理で使うには、実行時にインスタンス名を知る必要があるみたいです。

#define INSTANCE_NAME(arg) #arg

を使うと、特定のインスタンスにしか対応できない。。。
__func__とか__FILE__みたいな組み込みマクロのように使える何かがあれば便利なんだけどな〜。


365 名前:351 :04/07/02 16:36
>>364
何だか状況が良く掴めませんが,
「手動でインスタンスのidを振れば解決するんだけど,
インスタンスのidくらい自動で振ってくれないかな?」ってことなんでしょうか?


366 名前:デフォルトの名無しさん :04/07/02 16:43
class hoge
{
public:
hoge(void);
virtual ~hoge(void);

void output(void);
};

void hoge::output(void)
{
printf(インスタンス名 + '\n');
}

hoge hoge_A;
hoge hoge_B;

main
{
hoge_A.output();
hoge_B.output();

return 0;
}

を実行した時に、
hoge_A
hoge_B
と出力される事を目指しています。

367 名前:デフォルトの名無しさん :04/07/02 16:45
あ、いけね
main
じゃなくて
main()
ね。


368 名前:デフォルトの名無しさん :04/07/02 16:47
>>366
それはフライパンに自分で料理作ってくれというようなもんだ。

369 名前:デフォルトの名無しさん :04/07/02 16:49
インスタンスが 1 個だけなら上記の方法でもOKなんですが。。。
たくさんある場合は対応できない。


370 名前:デフォルトの名無しさん :04/07/02 16:49
そういうプロパティを持たせればいい

371 名前:デフォルトの名無しさん :04/07/02 16:50
デバッガ使えよ。
要はデバッグ用途だろ。

372 名前:デフォルトの名無しさん :04/07/02 16:50
>>368
やっぱ無理?(TT)
そう都合よくいかないか。。。


373 名前:デフォルトの名無しさん :04/07/02 16:52
デバッグって言うかトレースしたいんだろ

374 名前:デフォルトの名無しさん :04/07/02 16:52
Hoge hogehoge;
setInstanceNmae("hogehoge");


375 名前:351 :04/07/02 16:55
>>366
これじゃだめ?
#include <iostream>
#include <string>
using namespace std;
class hoge
{
string name;
public:
hoge(const string &p_name): name (p_name) {};
void output(void) {cout << name << endl;}
};
#define CREATE_HOGE(name) hoge name (#name)
CREATE_HOGE (hoge_A);
CREATE_HOGE (hoge_B);
int main () {
hoge_A.output();
hoge_B.output();
return 0;
}


376 名前:デフォルトの名無しさん :04/07/02 16:58
>>372
無理。.NETならできそうな気がしないでもないような。

377 名前:デフォルトの名無しさん :04/07/02 17:07
>>375
おお、お?
コンパイルしてみたらうまくいきました。
ソースの内容は難しくて理解できてませんが。。。
これを元に勉強させてもらいます。
ありがとうございました。
ス、スゲェ〜。


378 名前:デフォルトの名無しさん :04/07/02 17:14
やってることは
hoge hoge_A; hoge_A.name = "hoge_A";
でしかないわけだが。

379 名前:デフォルトの名無しさん :04/07/02 17:22
配列の時はどうするつもりだろうか

380 名前:デフォルトの名無しさん :04/07/02 17:33
むむ、コンストラクタの引数に "hoge_A" を渡して、
それが name に代入されている、のかな?

hoge(const string &p_name): name (p_name) {};

こういう書式は初めて見た、コロンの後は何だろ?

配列ね。。この書式が理解できれば改造して何とか。
まだ理解できないが。(笑


381 名前:デフォルトの名無しさん :04/07/02 17:35
>>380
逃げろ!


382 名前:351 :04/07/02 17:43
>>380
> hoge(const string &p_name): name (p_name) {};
> こういう書式は初めて見た、コロンの後は何だろ?
コロンの後はメンバー変数の初期化です.
nameに対して,p_nameを引数にコピーコンストラクタが呼ばれます.


383 名前:デフォルトの名無しさん :04/07/02 17:58
>>382
google してみました、コンストラクタ初期化子 っていうんだ、ふ〜ん。。。


384 名前:デフォルトの名無しさん :04/07/02 18:05
よくまぁ、のうのうと初期化子を初めてみたなんて言えるな。
最低限、C++をひととおりマスターしてから質問しようとは思わないのかね。
ここは入門スレかよ。

385 名前:デフォルトの名無しさん :04/07/02 18:10
完全な独学の場合、"自分が何を知らないか"を知らないんだよ。。。
正式にプログラミングの教育を受けた人には、その点で到底かなわないな。


386 名前:デフォルトの名無しさん :04/07/02 18:10
プッ
こんなところで玄人気取りかよ。みっともない

387 名前:デフォルトの名無しさん :04/07/02 18:15
???、自分がシロウトであることを告白してる訳だが。
妙につっかかってくるね、荒らしかな?、なら無視だが。


388 名前:デフォルトの名無しさん :04/07/02 18:20
>>385
逆じゃないの?

あ、日本での話ね。
米国の大学でコンピュータ工学の単位取ったとかなら、ありえるかも。

389 名前:デフォルトの名無しさん :04/07/02 18:22
仕様書を読むか読まないかの違いでしょ


390 名前:デフォルトの名無しさん :04/07/02 18:33
入手した参考書に全て書いてあるとは限らないし、
その書籍が不完全かどうか入手前に予測なんかできない。
正式に教育された人は、まずどんな知識があるのか、
先達から"知識の地図"をもらってから系統立てて学ぶでしょ。


391 名前:デフォルトの名無しさん :04/07/02 18:42
最初に変な本手に入れるからいけない。
C++Primerを読み切るまでは我慢する。これ。

392 名前:デフォルトの名無しさん :04/07/02 19:02
>>390
そんな教育受けたかったなあ。うちなんて・・・いやなんでもない。
次の方どうぞ。

393 名前:デフォルトの名無しさん :04/07/02 19:40
>>390
例えばM社の製品についてならM社純正のセミナーと試験・資格があったりするが、
C++ の場合の「正式な教育」とは何のことを言ってるんだ?

394 名前:デフォルトの名無しさん :04/07/02 19:44
勝手に勉強しろっていわれたんじゃなくて
授業やレクチャーを受けた奴のことを言うんじゃない

395 名前:デフォルトの名無しさん :04/07/02 19:49
正式な教育と言うか、「筋のいい」or「センスのいい」教育を受けたい。

396 名前:デフォルトの名無しさん :04/07/02 20:12
>>395
自分が受けた教育は「筋が悪い」or「センスのわるい」教育だったと言いたいわけか

397 名前:デフォルトの名無しさん :04/07/02 20:29
基礎プログラム課程1年
各分野での応用プログラム課程1年(全分野必須)
様ざまな分野で実際に活動している複数の講師が開く少人数セミナー課程1年(複数選択)
実践的な専門課程で1年(単数or少数選択)+卒業研究

…と、これくらいやれば「正式な教育」といえるかな?
自分で書いてて受けたくなってきた。
逆にこういう学校作ったら、受けるかもね?
(日本では無理?)

勤続年数の長い専属講師だけから受ける画一的な教育ってのが現状じゃないかな。


398 名前:デフォルトの名無しさん :04/07/02 20:30
ここは入門スレかよ。

399 名前:デフォルトの名無しさん :04/07/02 20:31
大作を志し10本挫折すれば、やっとどういうふうにいきあたりばったりなコードを書けば破綻するかわかってくる。

400 名前:デフォルトの名無しさん :04/07/02 20:43
>>397
受けりゃいいじゃん
第一線で活躍してる技術者を拘束できりゃいいんなら
そいつが働いてる会社(?)へ行ってビジネスとして交渉すればいい

俺もやったよ
あるハードの開発担当者本人を1時間2万5千円で半日くらい
1年は予算的に無理だったがなw

401 名前:デフォルトの名無しさん :04/07/02 21:07
横レス失礼します。
テンプレートクラスを使用するプログラムなんですけどコンパイルまでは問題ないんですが実行することができません。
よろしければご指導のほどお願いします。

http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/lounge/file/1074774948_20/help.txt

402 名前:デフォルトの名無しさん :04/07/02 21:12
おまえら、この大学を受験したらどうだ?
http://www.cs.tamu.edu/news/items?id=771

禿が直接教えてくれるぞ

403 名前:デフォルトの名無しさん :04/07/02 21:25
禿にはセンスがない

404 名前:デフォルトの名無しさん :04/07/02 21:26
C++界に於いて、これ以上「正式な」講座があるか?

405 名前:デフォルトの名無しさん :04/07/02 21:28
>>401
export 宣言するか(コンパイラが対応してないとダメ) Game.cpp の定義を Game.h に直接書く。

406 名前:デフォルトの名無しさん :04/07/02 21:30
>>405
アドバイスありがとうございます。
export宣言ってのはどのようにやればよいのでしょうか?
よろしければ教えていただけないでしょうか・・・


407 名前:デフォルトの名無しさん :04/07/02 21:40
export template<class T> class Game 〜
んな感じ。でも殆どの処理系でサポートされてないからたぶん直接ヘッダに書く事になると思う。


408 名前:デフォルトの名無しさん :04/07/02 22:07
Mao.cppの #include "Mao.h" を消して
Mao.hで #include "Mao.cpp"

409 名前:デフォルトの名無しさん :04/07/02 22:08
export template<class T>
class Game{
private:
T m;
Hero h;
public:
Game();
void Play();
};

このようなエラーが出てしまいました。
Game.hをこのようにしたんですけど使い方が間違っているんでしょうかね・・・?
f:\c++\挫折しないプログラミング\game.h(1) : error C2143: 構文エラー : ';' が ''template<'' の前に必要です。
f:\c++\挫折しないプログラミング\game.h(1) : error C2501: 'export' : 識別名を宣言するのに、型が指定されていません。



410 名前:デフォルトの名無しさん :04/07/02 22:12
>処理系でサポートされてないから
と思われ

411 名前:デフォルトの名無しさん :04/07/02 22:40
>>410
どもです。
>>405
Game.cpp の定義を Game.h に直接書く場合はヘッダファイルは基のヘッダの定義の下にcppの内容をこぴーして貼り付ければよいでしょうか?
あとGame.cppの中はどうすればよいのでしょう。ヘッダファイルで定義してありますが同じ定義をしておけばよいのでしょうか?それとも何も書かないcppにするのでしょうか?

412 名前:デフォルトの名無しさん :04/07/02 22:41
>>411
>>408でいいじゃん

413 名前:デフォルトの名無しさん :04/07/02 22:47
Game.cpp
の最後に
template class Game<Mao>;
を追加でも可.


414 名前:デフォルトの名無しさん :04/07/02 22:48
>>411
http://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=export+template+c%2B%2B+%E5%87%A6%E7%90%86%E7ウ%BB&num=50

>>408でもいいけどね。

415 名前:413 :04/07/02 22:49
413は401のオリジナルソースに対して.


416 名前:デフォルトの名無しさん :04/07/02 22:58
>>408の方法を試したらエラーが102個検出されました。。。


417 名前:デフォルトの名無しさん :04/07/02 23:01
全部のメソッドにinline指定入れろ

418 名前:デフォルトの名無しさん :04/07/02 23:04
>>396 いや、今までは完全に独学。
だから、自分のいる位置に自信がもてない。
苦労も必要だと思うけど、やっぱり学習効率を考えたら
センスのいいレッスンを受けたいと今だから思える。

419 名前:デフォルトの名無しさん :04/07/02 23:05
>>418
そこでオープンソースですよ。


420 名前:デフォルトの名無しさん :04/07/02 23:06
>>416
Mao.hの

****最後****

に #include "Mao.cpp"を追加。

421 名前:デフォルトの名無しさん :04/07/02 23:08
>>413のやりかたで動作しました。
ありがとうございます。
外部にあるテンプレートを使用したクラスを利用するときにはその内容を記述したcppの最後にtemplate class クラス名<ここの部分はなんていうんでしょう。。?>をつけてテンプレートを明示的にインスタンス化すればいいんですかね。

422 名前:デフォルトの名無しさん :04/07/02 23:27
>>421
<ここの部分はなんていうんでしょう。。?>
テンプレート引数

423 名前:デフォルトの名無しさん :04/07/03 00:05
STL は知ってたほうがいいというくらいのものでしょうか?
それとも知らないと話にならないというくらいのレベルのものでしょうか?

424 名前:デフォルトの名無しさん :04/07/03 00:06
真ん中くらい

425 名前:デフォルトの名無しさん :04/07/03 00:06
自分だけで完結してるなら知らなくても何とかなるやつもいるが、
普通は知らないと話にならない

426 名前:デフォルトの名無しさん :04/07/03 00:19
>423
STL,テンプレートなれるとすげぇ便利

427 名前:デフォルトの名無しさん :04/07/03 00:50
>>423
仕事で C++ プログラミングやるなら、さすがに知らないと辛い。

428 名前:デフォルトの名無しさん :04/07/03 01:01
>>423
listはよく使うかな。

429 名前:デフォルトの名無しさん :04/07/03 01:37
いまさらSTLコンテナを使わないってのはありえないぐらいには便利。
STLアルゴリズム方面のほうが面白いが。

430 名前:デフォルトの名無しさん :04/07/03 01:44
>>427
仕事でC++やってますが、STLなぞまったく使いませんが?

431 名前:デフォルトの名無しさん :04/07/03 02:00
>430
ある意味尊敬する。ないならC++使う意味ない。C#のほうがまし

432 名前:デフォルトの名無しさん :04/07/03 02:03
組み込みC++とかだとそもそもSTLが付いてなかったりする

433 名前:デフォルトの名無しさん :04/07/03 02:04
>>430
あえて使わないのか
使っちゃダメなのか
もともと使えないのか

434 名前:デフォルトの名無しさん :04/07/03 02:04
動的メモリ確保禁止の場合には使えんな

435 名前:デフォルトの名無しさん :04/07/03 02:05
スタック使うカスタムアロケータ書けばいいんじゃないの?

436 名前:デフォルトの名無しさん :04/07/03 02:06
もともと使えないのはただの馬鹿
あえて使わないのは大馬鹿

437 名前:デフォルトの名無しさん :04/07/03 02:23
Boostを使うのはどうなの?

438 名前:デフォルトの名無しさん :04/07/03 02:31
>437
つかっとけ。STLよりはマイナかも知らんが

439 名前:デフォルトの名無しさん :04/07/03 10:37
>>432
それ C++ じゃなくて EC++ だったりしないか?

440 名前:デフォルトの名無しさん :04/07/03 11:09
ここで言われたから無理やり使うのはすごい馬鹿

クラスも関数も使うかどうかは目的次第
どんなのがあるのかを知っておくことが
そーゆーこと聞く人が今やるべきこと

441 名前:デフォルトの名無しさん :04/07/03 11:21
javaで言うClassクラスを実現するにはどうしたらよいですか?

442 名前:デフォルトの名無しさん :04/07/03 11:26
RTTI

443 名前:デフォルトの名無しさん :04/07/03 11:39
Unko* unko = dramatic_cast<Unko*>(apple);

444 名前:デフォルトの名無しさん :04/07/03 11:49
>>443
>Unko*
ワラタ

445 名前:413 :04/07/03 11:58
>>421
これでも良いって話で,明示的実体化はそんなには使わないんじゃないでしょうか.
普通exportがサポートされてないコンパイラでは,
(405,417)あるいは(408,417,420)のようにして,main関数のコンパイル時に
template<class T>Game<T>::Game()とtemplate<class T>void Game<T>::Play()の定義が
見えるようにして,(暗示的に)実体化するのが一般的だと思います.


446 名前:デフォルトの名無しさん :04/07/03 11:59
string関連の質問なんですけどコンパイルも実行もできるのですがnameの表示が上手く行われません。
「俺様の名前はキャッツだ」と本来なら表示したいのですが。。。

http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/lounge/file/1074774948_21/cat.txt

447 名前:デフォルトの名無しさん :04/07/03 12:04
- FNeko(){cout << "キャッツが現れた!\n"; Neko("キャッツ"), power = 10;}
+FNeko(): Neko("キャッツ"), power (10) {cout << "キャッツが現れた!\n";}


448 名前:デフォルトの名無しさん :04/07/03 12:09
>>405>>408>>420のやり方だとエラーが出てしまいどうにも上手くいかんです。
全部インラインすると時間がかかりそうですし。。
>>413の方法ならできるんですがあらかじめ使用する型を書いておかないといけないんですよね。
exportが使えれば楽なんですが、これ以上の解決策はないですかね。。。?

449 名前:デフォルトの名無しさん :04/07/03 12:13
>>446
ついでに言うと

>Neko(string n){name = n;}
>void SetName(string n){name = n;}



Neko(const string& n){name = n;}
void SetName(const string& n){name = n;}

としたほうがいいと思うよ。

450 名前:デフォルトの名無しさん :04/07/03 12:13
>>447
ありがとうございます。
- FNeko(){cout << "キャッツが現れた!\n"; Neko("キャッツ"), power = 10;}
+FNeko(): Neko("キャッツ"), power (10) {cout << "キャッツが現れた!\n";}
うえの違いってどこにあるんでしょう?
下のやり方は本でいきなり出てきたのでよくわからなかったので、今までどおり{}の中に必要な処理は全部まとめて書いても同じだと思ったんです。


451 名前:413 :04/07/03 12:15
>>448
実装省きましたが,こんな感じじゃないでしょうか.
################# Game.h ######################
template<class T>
class Game{
private:
T m;
Hero h;
public:
Game();
void Play();
};
#include "Game.cpp"
################# Game.h ######################
################# Game.cpp ######################
template<class T> inline Game<T>::Game() {}
template<class T> inline void Game<T>::Play() {}
################# Game.cpp ######################


452 名前:デフォルトの名無しさん :04/07/03 12:21
>>448
エラーが102個出てしまいました。
Game.cppはこんなんです。
#include <iostream>
#include "Mao.h"
#include "Hero.h"
#include "Neko.h"
#include "FNeko.h"
#include "Game.h"
using namespace std;
template<class T> inline Game<T>::Game()
{
cout << "戦闘が始まります!がんばって!\n";
cout << "敵の残りエネルギー:" << m.GetEnergy() << '\n';
}
template<class T> inline void Game<T>::Play()
{
while(h.GetEnergy()>0){
if(m.GetEnergy()<=0){
break;
}
m.Attacked(h.Attack());
}

if(m.GetEnergy()>0){
cout << "敵は逃げました。終了します。\n";
}

}
これはもしかすると私の環境に問題があるんでしょうか?
VC++6.0proで下のパッチを当ててあります。
http://www.microsoft.com/downloads/details.aspx?FamilyID=a8494edb-2e89-4676-a16a-5c5477cb9713&displaylang=ja

453 名前:447 :04/07/03 12:25
>>450
> FNeko(){cout << "キャッツが現れた!\n"; Neko("キャッツ"), power = 10;}
これのNeko("キャッツ"), power = 10;では基底クラスの初期化は行なわれません.
Nekoクラスの名無しインスタンスが"キャッツ"を引数として作られ,
powerに10が代入され,
両者の間でoperator,が呼ばれることになります.


454 名前:413 :04/07/03 12:28
>>452
> #include "Mao.h"
> #include "Hero.h"
> #include "Neko.h"
> #include "FNeko.h"
> #include "Game.h"
> using namespace std;
これいらないです.
あと,coutはstd::coutに.


455 名前:デフォルトの名無しさん :04/07/03 12:29
>>450
まともな入門書を通読するか、初心者スレに逝ってくれ

456 名前:447 :04/07/03 12:30
>>453
-両者の間でoperator,が呼ばれることになります.
+両者の返値間でoperator,が呼ばれることになります.


457 名前:デフォルトの名無しさん :04/07/03 12:42
標準入力からの取り込みを以下の用にやっています。

#include<stdio.h>
#define MAXLEN 256
char buff[MAXLEN];

intmain(){
 int n;
 printf("Input Number >");
 fscanf(buff, sizeof(buff), stdin);
 sscanf(buff, "%d", &n);
以下省略

ここで、標準入力の入力数がsizeof(buff)を超えていた場合のエラー処理
はどうすれば良いのでしょうか?よろしくお願いします。

458 名前:デフォルトの名無しさん :04/07/03 12:47
>>457
スレ違い


459 名前:457 :04/07/03 12:47
あぁぁ、入力ミスしてました。fscanf → fgets

#include<stdio.h>
#define MAXLEN 256
char buff[MAXLEN];

intmain(){
 int n;
 printf("Input Number >");
 fgets(buff, sizeof(buff), stdin);
 sscanf(buff, "%d", &n);
以下省略

です。

460 名前:457 :04/07/03 12:48
>>458
スレ違いなのですか?C++のことなのですが…。

461 名前:デフォルトの名無しさん :04/07/03 12:49
>>460
Cスレに移動されたし。

462 名前:デフォルトの名無しさん :04/07/03 12:49
>>460
吊られないぞ


463 名前:デフォルトの名無しさん :04/07/03 12:50
>>454
Game.cppの内容
template<class T> inline Game<T>::Game()
{
std::cout << "戦闘が始まります!がんばって!\n";
std::cout << "敵の残りエネルギー:" << m.GetEnergy() << '\n';
}
template<class T> inline void Game<T>::Play()
{
while(h.GetEnergy()>0){
if(m.GetEnergy()<=0){
break;
}
m.Attacked(h.Attack());
}
if(m.GetEnergy()>0){
std::cout << "敵は逃げました。終了します。\n";
}
}
Game.cpp
F:\C++\挫折しないプログラミング\Game.cpp(8) : error C2143: 構文エラー : ';' が '<' の前に必要です。
F:\C++\挫折しないプログラミング\Game.cpp(8) : error C2433: 'Game' : 'inline' はデータ宣言をするのに使用できません。
F:\C++\挫折しないプログラミング\Game.cpp(8) : error C2501: 'Game' : 識別名を宣言するのに、型が指定されていません。
F:\C++\挫折しないプログラミング\Game.cpp(8) : error C2059: 構文エラー : ';'
F:\C++\挫折しないプログラミング\Game.cpp(8) : error C2143: 構文エラー : ';' が '<' の前に必要です。
F:\C++\挫折しないプログラミング\Game.cpp(13) : error C2039: 'Play' : '`global namespace'' のメンバではありません。
F:\C++\挫折しないプログラミング\Game.cpp(14) : error C2143: 構文エラー : ';' が '{' の前に必要です。
F:\C++\挫折しないプログラミング\Game.cpp(14) : error C2447: '<L_PROPERTY>' : 関数ヘッダがありません (旧形式の仮引数リスト?)
こうなりました。
やはり環境がいけないんでしょうか?
テンプレートを明示的にインスタンスかするしかないですかね。。


464 名前:デフォルトの名無しさん :04/07/03 12:50
>>440
> ここで言われたから無理やり使うのはすごい馬鹿

心配しなくてもそんなやつはいない。

465 名前:デフォルトの名無しさん :04/07/03 12:51
>>456,>>453
ありがとうございます。


466 名前:413 :04/07/03 12:53
>>463
Game.cppはコンパイルしないでください.


467 名前:413 :04/07/03 12:56
>>463
もし,.cppだと自動的にコンパイルされるようだったら,
Game.cppをGame_impl.hなどに変更して下さい.
内容的には初心者スレです.


468 名前:デフォルトの名無しさん :04/07/03 12:57
>>466
メインでつかうcppをコンパイル、実行する際にどうしてもGame.cppもコンパイルしようとマシンがするんですが。。

469 名前:デフォルトの名無しさん :04/07/03 13:00
>>467
ありがとうございます。
今まで読んできた入門書にはこのような方法は載っていなかったので。。
迷惑おかけしてスイマセン

470 名前:デフォルトの名無しさん :04/07/03 13:17
上野にあるアドというブルセラショップはなくなってしまったのでしょうか?
いま上野にいます。


471 名前:デフォルトの名無しさん :04/07/03 13:26
>>470
上野にまだあるよ。というかショップ自体が膨張して上野になりました。

472 名前:デフォルトの名無しさん :04/07/03 17:00
メモリリークを検出してくれるツールにはどういうのがありますか?
できればプラットフォーム非依存で。
それが無理ならWindows限定で。
それからできればフリーで。

473 名前:デフォルトの名無しさん :04/07/03 17:02
newとdeleteオーバーロードすればいいやん

474 名前:デフォルトの名無しさん :04/07/03 17:21
>472
Windows限定なんでスレ違いなんだが、
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
がお手軽。

475 名前:デフォルトの名無しさん :04/07/04 20:01
DBからselectした結果をカラム名と値の組で
map<string, string> cols;
に格納しようと思っています。
ここで疑問ですが
string で NULLを扱うにはどうしたらよいでしょうか?

476 名前:デフォルトの名無しさん :04/07/04 20:33
ちょっと質問です。
C++プログラムはどの辺りまでマスターすれば、”C++をマスターした”と言えるのでしょうか?
まぁ、”全部マスターしたら”と言われたらそれまでですが・・・。
それと、C++の次に覚えたら良いプログラムは何でしょうか?
変な質問ですが、どうかよろしくお願いします。

477 名前:デフォルトの名無しさん :04/07/04 20:35
金になるモノを作れたらマスターしたと言っていいんじゃなイカ?

478 名前:デフォルトの名無しさん :04/07/04 20:50
詐欺じゃなくてな

479 名前:デフォルトの名無しさん :04/07/04 20:54
>>475
> string で NULLを扱うにはどうしたらよいでしょうか?
ありません。

そもそも map に格納しないか、あるいは map<string, std::pair<bool, string> > とかに
して NULL, 非 NULL のフラグを別に持って下さい。

480 名前:デフォルトの名無しさん :04/07/04 21:00
__NULL__とか多分dbに無さそうなの入れとけば?

481 名前:デフォルトの名無しさん :04/07/04 21:03
そういうときこそboost:optional

482 名前:デフォルトの名無しさん :04/07/04 22:31
>>475
仕様に関わるがNULL文字と空文字を同扱いにするという方法もある。

>>480のようにNULL定数を定義する方法もある。
この場合安全性を期すならNULL定数と一致する値が入力された場合にはエスケープすればよい。
後のことを考えるとcols自体をクライアントに露出しないほうがよいのは当然。

483 名前:デフォルトの名無しさん :04/07/04 22:36
>>482
>NULL文字

スペル誤りのあたりから、ただならぬ腐臭が立ち込めている

484 名前:デフォルトの名無しさん :04/07/04 22:37
>>483
NULL文字列と書きたかったのねん

485 名前:デフォルトの名無しさん :04/07/04 22:41
>>484
おまえもすごい
血塗相か肪乱相クラスだ
かんべんしてくれ

486 名前:デフォルトの名無しさん :04/07/04 22:45
>>485
これか
http://www.medianetjapan.com/2/drama_art/yusuke45/9deaths.html
勉強になるなあ

487 名前:デフォルトの名無しさん :04/07/05 00:22
>>401で質問したものですが初歩的過ぎる質問に付き合ってくださった方々に感謝いたします。

488 名前:487 :04/07/05 00:57
たびたび申し訳ないんですがif文やswitch文の中でテンプレートクラスの宣言はできないのでしょうか?
ユーザーに数字を入力させてそれに応じた処理をしようと思ったのですがエラーに悩まされています。

元のコードのエラーは修正してあるので単純に
Game<FNeko, Hero> g;
g.Play();
とすれば実行はできます。

問題のコードです。
できればよろしくおねがいします。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/lounge/file/1074774948_22/kudasitu.txt

489 名前:デフォルトの名無しさん :04/07/05 00:59
>>488
たぶんC++(テンプレート)やる前にC言語をもういちど勉強しなおしたほうがいいと思う。

490 名前:デフォルトの名無しさん :04/07/05 01:02
>>488 インスタンスの生存範囲を熟考して分かった事を述べよ。(30点)

491 名前:デフォルトの名無しさん :04/07/05 01:17
ポリモーフィズムについて述べよ。またそれとテンプレートとの関係について動的、静的という言葉を用いて説明せよ(40点)

492 名前:デフォルトの名無しさん :04/07/05 01:33
>>488
>>455を声に出して100回読みなさい。


493 名前:デフォルトの名無しさん :04/07/05 01:37
>まともな入門書
とりあえずダイテルかPrimerのどっちかを読み終わるまでは出入禁止。

494 名前:デフォルトの名無しさん :04/07/05 06:40
>>488
>if文やswitch文の中でテンプレートクラスの宣言はできないのでしょうか?
これはできます.が,488でコンパイルできないのは490の指摘の通りです.

まず,if文の方がコンパイルできないのはコンパイラの指摘通りです.
> 魔王と戦う.cpp(44) : error C2065: 'g' : 定義されていない識別子です。
以下のコードで(b)のコメントを外してコンパイルを通そうとしていることになります.
class A {public: void func () {}};
int main () {
{
A a;
a.func (); // <-(a)
}
// a.func (); <-(b)
return 0;
}


495 名前:494 :04/07/05 06:40
switch文の方は,gの生存範囲がcaseごとではなくswitch全体であるからです.
つまり,以下のコードで(b)のコメントを外してコンパイルを通そうとしていることになります.
int main () {
A a; // <-(a)
// A a; // <-(b)
return 0;
}
もしswitchを使うのであれば,{}を使って以下のようにスコープを切ってやるといいです.
case 1: {
Game<Mao, Hero> g;
break;
}


496 名前:494 :04/07/05 07:00
>>488
初心者すれに移動したのね.


497 名前:デフォルトの名無しさん :04/07/05 09:05
>>494-495
わかりやすくご丁寧にご指導いただきありがとうございます。
コンパイル実行することができました。

498 名前:デフォルトの名無しさん :04/07/05 09:57
ダイテルって何?

499 名前:デフォルトの名無しさん :04/07/05 10:00
>>498
ググれば出るよ。


500 名前:デフォルトの名無しさん :04/07/05 13:22
最近C++の勉強しているんですが、参考にしている本のコードが汚く感じるんです。

class CCalc {
  int r;
 public:
  void Set(int x) {r = x;}
}
クラス定義ではこんな感じで、{ }が1行に収まっているのも違和感あるし、

cout << "加数は?"; cin >> x;
見たいな感じで1行に2つ以上の文を入れていることが結構あります。

ネットで何人かのコードを見させてもらった感じでは、{ }は結構あるのかなぁという
感じですが、cout << ; cin >> ;の方はやりすぎかなぁという印象を受けました。
C++では良くあることなんですか?


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