VC++でプログラミングをしています。
A(基本クラス)
A1, A2, A3, ...(派生クラス)
を作成しました。A1,A2,A3, ...は、Aの派生クラスです。
このとき、基本クラスAのポインタから、特定の派生クラスにのみ存在するメンバ変数m_dataのみ変更したいのですが、存在するかどうかをどのように判定して、値を変更すれば良いでしょうか?
できれば、下記のような構造でループできるとありがたいです。
A* a[100]
(その後、a[100]に、派生クラスA1,A2,A3,..を割り当て、
それらが、混在しているとします。)
for(i=0 ; i<100 ; i++){
if(a[i]->m_dataが存在する場合){ (2)
a[i]->Set_m_data("m_dataの新しい値") (1)
}
}
(1)は、a[i]->m_data = "m_dataの新しい値"
でも良いです。
現状では、m_dataがメンバでない派生クラスがあるので、
(2)のif文の判定自体ができず困っています。
よろしく御願いします。
No.3ベストアンサー
- 回答日時:
言語仕様的はメンバ変数の存在を確認する方法は無いです。
(処理系依存でも良いならば全く無いわけではありませんが…)
よって別のアプローチで
(1)仮装関数を利用して別個に処理させる
class A{
public:
virtual Set_m_data(M_DATA &Adata){
//何も入れない。空の処理
}
};
class A1{ //メンバ無し
public:
//何も作らない
};
class A2{ //メンバ有り
private:
M_DATA m_data;
public:
virtual Set_m_data(M_DATA &Adata){
m_data = Adata;
}
};
//代入処理
for(i=0 ; i<100 ; i++){
a[i]->Set_m_data(m_dataの新しい値);//チェックする必要もない
}
(2)基底クラスAにm_data型のポインタを用意してそれで判別
class A{
public:
M_DATA *pm_data:
A(){//コンストラクタ
pm_data = NULL; //NULLならばデータ無し
}
};
class A1{ //メンバ無し
public:
//何も作らない
};
class A2{ //メンバ有り
private:
M_DATA m_data;
public:
A2(){//コンストラクタ
pm_data = &m_data; //NULLでない場合はデータ有り
}
};
//代入処理
for(i=0 ; i<100 ; i++){
if(a[i]->pm_data){//ここがNULLならばメンバ無しと判定できる
*(a[i]->pm_data) = m_dataの新しい値; //そのまま代入も可能
}
}
ご教示ありがとうございました。
今回は、条件分岐が不要な(1)の方法を採用してみました。
実装しましたところ、うまく行きました!!
m_dataのない派生クラスには新しい変数やデータを付加する必要なく、
ループでも条件分岐が必要なくなったので、高速に処理できました。
本当にご教示どうもありがとうございました。
今後ともよろしく御願いします。
No.2
- 回答日時:
派生クラスにオーバーライドさせてはどう?
Set_m_data() は共通の呼び出しみたいだし・・・
class A
{
public:
virtual void Set_m_data( m_dataの型 ){}
};
class A1 : public A
{
};
class A2 : public A
{
private:
m_dataの型 m_data;
public:
void Set_m_data( m_dataの型 a )
{
m_data = a;
}
};
A1 は m_data を持ってない。
A2 は m_data を持っている。
呼び出すときは、
for(int i=0 ; i<100; i++)
{
a[i]->Set_m_data("m_dataの新しい値");
}
ちなみに
virtual void Set_m_data( m_dataの型 ){}
↓こっちでもOK
virtual void Set_m_data( m_dataの型 )=0;
違いは
virtual void Set_m_data( m_dataの型 ){}
派生クラスは Set_m_data() を実装しなくてもよい
virtual void Set_m_data( m_dataの型 )=0;
派生クラスは Set_m_data() を実装しなければならない
この回答への補足
ご教示ありがとうございます。基本クラスに仮想関数を作成する方法が非常に良く分かりました。この方法ですと、派生クラスに当該メンバがあるかどうかを判定する必要がないですし、m_dataを持っていないクラスにメンバを追加する必要もないので、非常にコンパクトですばらしい方法だと思いました。明日、早速、実装してみます。今後ともご教示よろしくお願いします。
補足日時:2008/10/30 01:31実装しましたところ、うまく行きました!!
m_dataのない派生クラスには新しい変数やデータを付加する必要なく、
ループでも条件分岐が必要なくなったので、高速に処理できました。
本当にご教示どうもありがとうございました。
今後ともよろしく御願いします。
No.1
- 回答日時:
クラスAに仮想関数がひとつでも含まれるのであれば、dynamic_castを使えば、ポインタの参照先が特定の派生クラスのものかどうかを判定できます。
m_dataが存在するかどうかを直接判定するには、それを調べるためのメンバを追加せざるを得ないでしょう。
ご教示ありがとうございます。今のところ仮想関数はないのですが、作成を検討してみます。m_dataが存在するかどうかを直接判定するには、それを調べるためのメンバを追加せざるを得ないのですね。クラスをできるだけコンパクトにしたかったので、不要なメンバはできるだけ作成したくなかったのですが、他に方法がないようであれば、クラスA及びその派生クラスに判定のためのメンバを追加することを検討してみます。どうもありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- その他(プログラミング・Web制作) ColabでのPytorchのエラー 1 2022/11/19 20:51
- Visual Basic(VBA) 複数シート一括作成後に、特定範囲の数式は値で貼り付けしたい 3 2022/10/07 11:18
- その他(プログラミング・Web制作) pythonでDBのカラム名で取得したオブジェクトの値を表示したい 1 2022/05/13 03:41
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/17 18:41
- その他(プログラミング・Web制作) Python - Excel で Webからデータを連続取得したいのですが エラーが出ます 1 2023/07/06 20:08
- JavaScript EasyUIのSubGrid(jquery)におけるObjectに入れた連想配列について 1 2022/05/02 11:21
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ポインター引数の関数でコンパ...
-
stable diffusionのエラー
-
printfの%eで指数部分の桁数を...
-
matlabでのRRI検出
-
Perlで2つのテキストファイルの...
-
Excel VBA グラフ作成のとき...
-
C言語 構造体の名前欄?を小文...
-
関数マクロの書き方
-
テキストファイルの結合について
-
H8/36064を使ったシリアル通信...
-
'dataType' 引数を Null にする...
-
C言語 リスト構造
-
pythonでDBのカラム名で取得し...
-
txtファイルを読み込んで表示関...
-
linuxのシェルでファイル名に先...
-
エクセルVBA:日付データの変換...
-
ハッシュで重複キーを認める方...
-
基本クラスのポインタから、特...
-
【Excel VBA】10進数を2進数に...
-
C言語 2分木探索について質問です
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ポインター引数の関数でコンパ...
-
stable diffusionのエラー
-
printfの%eで指数部分の桁数を...
-
エクセルVBA:日付データの変換...
-
int型(2バイト)データの分割
-
c言語の多次元配列で1から100ま...
-
C#でのswitch文
-
【Excel VBA】10進数を2進数に...
-
途中経過も表示するプログラム
-
CreateProcessでの環境変数の設...
-
pythonでDBのカラム名で取得し...
-
C言語についてです! 同じ年の...
-
linuxのシェルでファイル名に先...
-
c言語 配列から数字だけをint型...
-
c言語での wavファイルの編集(...
-
matlabのソースコードをpython...
-
ビットデータのチェック方法
-
10個の実数に対する降順ソート...
-
python 気象データの取得
-
PINVOKEで構造体配列をマーシャ...
おすすめ情報