やっぱり立ちはだかるクラスの壁

きょーちゃん
記事: 11
登録日時: 15年前

やっぱり立ちはだかるクラスの壁

投稿記事 by きょーちゃん » 14年前

こんばんは。

今日はマップにキャラを重ねてみました。

画像

コードはゲームプログラミングの館のサンプルをそのまんまくっつけました。
画像だけ差し替えて。

で、メインがごちゃごちゃするのは嫌なので分割しようとすると、静的メンバがどうのこうのとエラーだらけです。
ヘッダファイルで構造体を定義するとクラス扱いになるのか???
よくわからんけど、知らない間にクラスを作っている・・・のか・・・・・・・?
あぁもう何が問題なのかも分からん~お手上げ!

やっぱクラス勉強しないと駄目だぁ・・・
いや、駄目ってことないけど、やっぱ使えるようになりたいな><

アバター
MoNoQLoREATOR
記事: 284
登録日時: 14年前

Re: やっぱり立ちはだかるクラスの壁

投稿記事 by MoNoQLoREATOR » 14年前

静的メンバだからといってクラス扱いになっているというわけではないのでは?

とりあえず分割時のルールとか確認してみて、一週間くらい粘ってみては?
自分の力だけで解決した問題は一生忘れませんから。

ちなみに私は最初の頃3ヶ月粘って解決しましたw
さすがに感動で涙が出ました^^;


あ、ちなみに
class
をつけなくても、構造体の中に関数を書くとそれはクラスとみなされますよ。

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 15年前

Re: やっぱり立ちはだかるクラスの壁

投稿記事 by Dixq (管理人) » 14年前

新しい事を学ぶのって難しいですよね~(´▽`;)
特にプログラムの考え方って普段の生活に無い考え方が多いし。

ところでC++の前にCってもう学ばれました?
Cを学んでからC++を勉強しないとなかなか理解が追い付かない事も多いかと思います。。。
C++って演算子のオーバーロードで、普通ありえない代入も出来たりすることが多いので、
基礎を理解せずに使ってしまうと思わぬ間違いをしてしまうことも。
例えばstring型では許されているようなことは大抵Cではできなかったり。

char *str;
str = "aaa";
str[0] = 'b';

これを実行するとどうなるか・・。
boostなんか使うとCの原型とどめていないような使い方が出来るのでわけがわからなくなるかもしれません・・。

基礎を学ぶってダルくて気が進まないですが、基礎から着実にやることって案外近道だったりします。
本であれば柴田さんの本がお勧めです。


ググっても勉強できますけどね。
http://www.google.co.jp/search?hl=ja&so ... 0&aql=&oq=

まぁわからないことがあれば質問すればみんな教えてくれますよ!ファイトです^^
最後に編集したユーザー Dixq (管理人) on 2011年2月14日(月) 23:24 [ 編集 1 回目 ]

アバター
SAI
記事: 115
登録日時: 14年前

Re: やっぱり立ちはだかるクラスの壁

投稿記事 by SAI » 14年前

ファイル分割は悩みに悩みましたね~w
あれが今思えばコンパイルエラーの最後の壁だった気がします。
泣きそうになったので放っておいたら後々やらざるをえない状況になって泣きました。

ISLe
記事: 2650
登録日時: 15年前

Re: やっぱり立ちはだかるクラスの壁

投稿記事 by ISLe » 14年前

Dixq (管理人) さんが書きました:char *str;
str = "aaa";
str[0] = 'b';

これを実行するとどうなるか・・。
Windowsだと期待どおりに動いてしまいませんか?
Linuxあたりだと即落ちますけど。

(追記)
わたしはC言語を始めて間もなく外部変数(関数やクラスの定義より外で宣言する変数)は必ずstaticを付けるべしと強制的に慣れさせられたので、ファイル分割にはほとんど抵抗ありませんでした。
extern指定子は本の中でしか見たことがないと言って良いくらい使ったことがありません。
最後に編集したユーザー ISLe on 2011年2月15日(火) 00:43 [ 編集 1 回目 ]

きょーちゃん
記事: 11
登録日時: 15年前

Re: やっぱり立ちはだかるクラスの壁

投稿記事 by きょーちゃん » 14年前

>MoNoQLoREATOR さん

実は静的メンバが何なのかもよく分かってないんですよね^^;
ググったらクラスについて解説してあるページが出てくるから勝手にクラスの何かだと思ってたり・・・
今まで見よう見まねでテキトーに分割してたツケがまわってきてる気がします・・・
構造体の中に関数は書いてないです・・・う~ん・・・???

>Dixqさん
「Cの絵本」って本は読みました。
勉強らしい勉強といったらそれぐらいかも^^;あとはとりあえずやってみて、行き詰ったらググるの繰り返しです・・・
もっといろんな本読んでちゃんと勉強したほうが良さそうですね・・・
柴田さんの本なんか良さそうだから買ってみようかな・・・ありがとうございます^^

char *str;
str = "aaa";
str[0] = 'b';

これ・・・実行できません><
やり方が間違ってるのかな・・・ちなみにVC++2010使ってます・・・

>SAIさん
最後の壁ですか~いきなり手を出してはいけなかったのかも・・・
でもコード長いと自分でも訳わからないから分割はしたいし・・・
泣きたいです;;

>ISLeさん
externばっか使ってます^^;
人のコード見てstaticだらけでなんじゃこりゃって思ってました。
明日からstatic使ってみます。
最後に編集したユーザー きょーちゃん on 2011年2月15日(火) 01:16 [ 編集 1 回目 ]

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 15年前

Re: やっぱり立ちはだかるクラスの壁

投稿記事 by Dixq (管理人) » 14年前

> ISLeさん

へろりさん曰く環境依存のようですが、
ほとんどの処理系では定数領域に確保されるので、書き換えができないと思います。
具体的にどの処理系ができてどの処理系ができないかは調べていませんが。

> きょーちゃんさん

書き換え可能な領域とそうでない領域があるんですよ。

・・あぁもう会社行かないといけない時間だからあまり詳しく書けない^^;
後、externよりstatic使って隠蔽した方がいいって話は確か質問掲示板で回答した通りだと思うので、よければ参考にどうぞ。
ただ、最初からあまり隠蔽だの効率だのは意識しなくても良いと思いますので、
とにかく沢山コードを書くことが良いと思いますよ。
良くないコードを書かないと何が良いコードなのかもわからないと思いますしね。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前

Re: やっぱり立ちはだかるクラスの壁

投稿記事 by softya(ソフト屋) » 14年前

私も本は買ったほうが良いと思うのですが、サイトを紹介します。

「ロベールのC++教室」 ← ここを改定した「ロベールのC++入門講座」もお勧めです。
http://www7b.biglobe.ne.jp/~robe/cpphtml/index.html
「C++入門」
http://wisdom.sakura.ne.jp/programming/cpp/index.html
「C++入門」
http://www5c.biglobe.ne.jp/~ecb/cpp/cpp00.html
「C++入門」
http://www.asahi-net.or.jp/~yf8k-kbys/newcpp0.html

ISLe
記事: 2650
登録日時: 15年前

Re: やっぱり立ちはだかるクラスの壁

投稿記事 by ISLe » 14年前

Dixq (管理人) さんが書きました:ほとんどの処理系では定数領域に確保されるので、書き換えができないと思います。
具体的にどの処理系ができてどの処理系ができないかは調べていませんが。
MS-DOS以前からのお行儀の良くないプログラムを動かすための互換性だと思いますがWindowsでは書き換えができます。
組込み系を除けばWindowsしかないと思うんですけど書き換えできないのが常識と言っていいのやら。

(追記)
個人的には自由にやって後から矯正するよりも、最低限のルールを守って作って、力が付いて後から理由を理解するほうが効率が良い気がします。
例えばゲームのメインループはひとつにして、DXライブラリならループの最後に一つだけあるScreenFlipで画面を更新するように、というような。
ウチではこんなふうに

CODE:

while (ProcessMessage() != 0 && ClearDrawScreen() != 0) {
	Update();
	Render();
	ScreenFlip();
}
Update関数にゲーム処理を書いて、Render関数に描画処理をまとめるルールにしてます。

(さらに追記)
わたしがC言語始めたときに言われたのは「外部変数にstatic付けろ」だけで、「あとは壊して覚えろ」でした。
当時はバッファオーバーフローとかすると簡単にOSレベルで暴走してハードディスクのデータが吹っ飛びましたから。
最後に編集したユーザー ISLe on 2011年2月15日(火) 18:18 [ 編集 2 回目 ]

アバター
MoNoQLoREATOR
記事: 284
登録日時: 14年前

Re: やっぱり立ちはだかるクラスの壁

投稿記事 by MoNoQLoREATOR » 14年前

ちなみに・・・数日前、友人にファイル分割時のテクニック(?)を教えてもらいました。非常に便利なのでつかってみては?

ヘッダファイル

CODE:

#ifdef GLOBAL_INSTANCE
#define GLOBAL
#else
#define GLOBAL extern
#endif


GLOBAL 変数の型 変数名;//値を代入してもOK
WinMainがあるファイル

CODE:

#define GLOBAL_INSTANCE//何よりもまず先に書くこと

//変数宣言は書かないこと

int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC){
	return(0);
}
これなら、いちいちグローバル変数をコピーしてexternを書き加える必要がありません。

ISLe
記事: 2650
登録日時: 15年前

Re: やっぱり立ちはだかるクラスの壁

投稿記事 by ISLe » 14年前

MoNoQLoREATOR さんが書きました:ちなみに・・・数日前、友人にファイル分割時のテクニック(?)を教えてもらいました。非常に便利なのでつかってみては?
これはまさにこのサイト『C言語何でも質問サイト』のプログラミングの館で紹介されているやり方ですね。
初期値があるとリンクで二重定義エラーになりますよ。