始めまして。suirenと申します。
VC++の学習を始めて2ヶ月足らずのものです。
クラスの配列について不明点があるのですが、調べ方が悪いのか
回答を見つけることができませんでした。
よろしければご教示ください。
開発環境:OS Windows XP SP2
VC Vusial C++ 6.0 SDK
【本題】
enumをメンバにもつclass Aが存在しており、それを継承したclass Bがあります。
class Bではclass Aの二次元配列をメンバとして持ちます。
そのクラスを使用した関数で、hogeの配列に対してenum値を割り当てていきたいので
す。
#コードは開発途中のものではございません。
#情報が足りなければ申し訳ございません。
擬似コード
[XXX.h]
class A{
enum color{R,B,G};
int pos;
}
class B :public class A{
A hoge[X][Y]; (X,Yは定数です。)
};
[XXX.cpp]
B b;
void Init(void)
{
int i,j;
for(i=0;i>X;i++){
for(j=0;j>Y;j++){
if(i==0){
b.hoge = R; ← コンパイルエラーです。
}
else
{
b.hoge = G; ← コンパイルエラーです。
}
}
}
}
そもそもクラスの配列をしていることが間違いなのでしょうか?
参考HPなどでも構いませんので、知恵をお貸しください。
よろしくお願いいたします。
class A
{
public:
enum color{R,B,G};
以下略
class B : public class A
{
public:
A hoge[X][Y];
以下略
publicの指定がないとそのクラスの外部から見られないよ。
それとA::Rだな。
RだとクラスAのメンバの所でしか使えない。
Init()の所でRだとコンパイラはクラスAのRだとは思ってくれない。
それとどんなコンパイルエラーなのか書いてほしい。
俺はわざわざプログラムを作って回答しないので。
間違えた。
よく見たら
> b.hoge = R;
だ。
b.hogeの型は
A[X][Y];
だぞ。
b.hoge[i][j] = A::R;
としたいのか?
> b.hoge[i][j] = A::R;
> としたいのか?
b.hoge[i][j]の型はAなので、
b.hoge[i][j].pos = A::R;
のような事ではないかと。
> for(i=0;i>X;i++){
> for(j=0;j>Y;j++){
ついでに不等号が逆です。
純粋な疑問。
class Bがclass Aの派生クラスでclass Bがclass Aの配列を保持しているって
言う状態がどういう状況を想定してそういう構造にしているのかが良く分からない。
特に「class Bがclass Aの派生クラス」と言う部分の意味が。
enumを使いたいから派生したと言うので無いなら良いのだけれど。
そういうものだと言われてしまうとそうですかとしか言えないんだけどね。
筋違いの突込みだったら無視してもらって良いです。
enumを複数のクラスで使用したいのなら、グローバルで定義してもよいのでは?
アドバイスを下さった皆様
返信が遅くなり、誠に申し訳ございません。
実際に書いたソースを提示いたします。
【hoge.h】
typedef enum{
puyoNONE = 0,
puyoBLUE, puyoRED, puyoMAGENTA, puyoGREEN, puyoYELLOW
} puyoAttr
class Panel{
puyoAttr attr;
puyoPanel *root;
int count;
};
class Field {
#define FIELD_WIDTH 6
#define FIELD_DEPTH 12
Panel panel[FIELD_WIDTH][FIELD_DEPTH+1];
};
【hoge.cpp】
Field field;
void InitializeField()
{
int i,j;
for(i=0;i<FW;i++)
{
for(j=0;j<FH;j++)
{
if(i==0 || i==(FW-1) || j==(FH-1))
{
field[i][j]=GLAY;☆
}
else
{
field[i][j]=WHITE;☆
}
}
}
}
☆の箇所においてエラーが出ており、質問させていただいておりました。
その後文献を調べ、試行錯誤し、
旧)field[i][j]=GLAY;
新)field[i][j].attr =GLAY;
とすることでコンパイルも通るようになり
思った処理を実現させることができました。
アドバイスを下さり感謝しております。
また返信が遅くなったことは大変申し訳ございません。
また当初提示物に情報が足りず皆様にはご迷惑をお掛けいたしました。
意図のつかみにくい質問であったにも関わらず
情報をありがとうございました。
解決とさせていただきます。
解決しているのなら、解決済みのコードを示してくれるほうが良かったかな。
それとコンパイル通っているのならばコピペのミスだと思うけど、
(panelとattrにアクセスできるようになっているとして)
× field[i][j].attr =GLAY;
○ field.panel[i][j].attr =GLAY;
ついでに、WHITEと対比させているので多分、
× GLAY
○ GRAY(puyoGRAYなのかもしれない)