クラスを配列とした場合のメンバの参照方法 – プログラミング – Home

クラスを配列とした場合のメンバの参照方...
 
通知
すべてクリア

[解決済] クラスを配列とした場合のメンバの参照方法


suiren
 suiren
(@suiren)
ゲスト
結合: 17年前
投稿: 2
Topic starter  

始めまして。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などでも構いませんので、知恵をお貸しください。
よろしくお願いいたします。


引用未解決
トピックタグ
wclrp ( 'o')
 wclrp ( 'o')
(@wclrp ( 'o'))
ゲスト
結合: 18年前
投稿: 287
 

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だとは思ってくれない。

それとどんなコンパイルエラーなのか書いてほしい。
俺はわざわざプログラムを作って回答しないので。


返信引用
wclrp ( 'o')
 wclrp ( 'o')
(@wclrp ( 'o'))
ゲスト
結合: 18年前
投稿: 287
 

間違えた。
よく見たら
> b.hoge = R;
だ。

b.hogeの型は
A[X][Y];
だぞ。

b.hoge[i][j] = A::R;
としたいのか?


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

> b.hoge[i][j] = A::R;
> としたいのか?

b.hoge[i][j]の型はAなので、
b.hoge[i][j].pos = A::R;
のような事ではないかと。


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

> for(i=0;i>X;i++){
> for(j=0;j>Y;j++){

ついでに不等号が逆です。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

純粋な疑問。

class Bがclass Aの派生クラスでclass Bがclass Aの配列を保持しているって
言う状態がどういう状況を想定してそういう構造にしているのかが良く分からない。
特に「class Bがclass Aの派生クラス」と言う部分の意味が。
enumを使いたいから派生したと言うので無いなら良いのだけれど。

そういうものだと言われてしまうとそうですかとしか言えないんだけどね。
筋違いの突込みだったら無視してもらって良いです。


返信引用
SIVA
 SIVA
(@SIVA)
ゲスト
結合: 17年前
投稿: 11
 

enumを複数のクラスで使用したいのなら、グローバルで定義してもよいのでは?


返信引用
suiren
 suiren
(@suiren)
ゲスト
結合: 17年前
投稿: 2
Topic starter  

アドバイスを下さった皆様

返信が遅くなり、誠に申し訳ございません。

実際に書いたソースを提示いたします。
【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;
とすることでコンパイルも通るようになり
思った処理を実現させることができました。

アドバイスを下さり感謝しております。
また返信が遅くなったことは大変申し訳ございません。
また当初提示物に情報が足りず皆様にはご迷惑をお掛けいたしました。

意図のつかみにくい質問であったにも関わらず
情報をありがとうございました。

解決とさせていただきます。


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

解決しているのなら、解決済みのコードを示してくれるほうが良かったかな。

それとコンパイル通っているのならばコピペのミスだと思うけど、
(panelとattrにアクセスできるようになっているとして)

× field[i][j].attr =GLAY;
○ field.panel[i][j].attr =GLAY;

ついでに、WHITEと対比させているので多分、

× GLAY
○ GRAY(puyoGRAYなのかもしれない)


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました