クラスA内の配列をfriendクラスB内で書き換えを行いたいのですが、どうもうまくいき
ません。
ソースは
class classA{
friend classB;
private:
int play[110][6];
public:
void set_data();
int read(int, int);
};
int stage::read(int x,int y){
return play[x][y];
}
class classB{
public:
void shoot(int, int, int);
};
void classB::shoot(int x,int y,int z){
stage::play[x][y]=z;
}
classA内のvoid set_dataで配列playの初期値を入力し、int readでmain文から配列play
の数値を呼び出しを行う。
classB内のvoid shootで配列の番号を指定し、zの値に書き直す。
という風にしたいのですが、「静的でないメンバへの参照が正しくありません」とエラ
ーが出てしまします。
shoot内のplayの指定方法が悪いのは分かるのですが、具体的にどういう風に直せばいい
のかわからないので、どなたかご教授お願いします。
環境:.NET2003 XP(SP2)
classB::shoot()内で classA のインスタンスにアクセスできない限り無理。
もしくは classA::play[][] をstaticにすべし。
# 教本を読みましょう。
多分、stageというのがclassAなんだろうとして、
クラスって言うのは型枠にすぎないのでそれだけあっても
実体はないと言う事になります。
επιστημηさんが言われている「staticにすべし。」
にしてもstaticにする意味がきちんとわかっていないなら
安易にするべきではありません。
この辺はクラス設計に関わるのでちゃんとC++言語の文法と
オブジェクト指向の基本的な知識くらいは無いと理解できないと思います。
できれば、入門書で体系付けて勉強した方が良いです。
見切り発車で先に進んでしまうと後で苦労すると思います。
あと、
今書かれている範囲では出てこないけど、classAのインスタンスって何処にあるの?
っていう話になるんですが、この質問に答えられますか?
この辺の概念的な部分がわかっていないとC++は理解しにくいと思いますよ。
C++って言うか、Cの構造体も理解し辛いように思えますが。
>もしくは classA::play[][] をstaticにすべし。
staticにすると、今度は
「外部シンボル public: static int (* classA::play)[6] は未解決です。」
と出てきてしまいます。
>classB::shoot()内で classA のインスタンスにアクセスできない限り無理。
教本見て頑張ってみます。
>多分、stageというのがclassAなんだろうとして
すみません、名前を変えるのを忘れてました。
stage→classAです。
>staticにする意味がきちんとわかっていないなら
あまり理解してなく、静的にするという程度にしか分かっていません。
>classAのインスタンスって何処にあるの?
mainの中です。
クラスの仕組みを理解できてないのが原因のようなので、
教本を見つつ頑張ってみようと思います。
返答して下さって、ありがとうございました。