サブクラスとしてオブジェクトを渡すとメンバ変数の数値がおかしくなります

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
はんなり
記事: 48
登録日時: 14年前

サブクラスとしてオブジェクトを渡すとメンバ変数の数値がおかしくなります

#1

投稿記事 by はんなり » 9年前

スーパークラス「soldier」のメソッドへ、同じくスーパークラスの「captain」を共通のサブクラスである「man」として渡したのですが、メンバ変数の数値が明らかにおかしくなります。
x 2.758594528255e-312#DEN double
y 4.031792009257e-313#DEN double
など。他にも、一見正常に見えた変数も他の変数と数値が入れ替わってたり、bool型の変数もfalseにしてたものがtrueだったりと色々おかしかったです。

メンバ変数を直接渡す形に変えると、正常な数値を渡せることがわかっているのですが、原因がよくわかりません。
どういう問題が考えられるでしょうか?

コード:

//soldierクラス内のメソッドです。

//これだと異常
void move(soldier fri[],//←こっちは正常
                 man cfri[],//←このオブジェクト
                 soldier ene[],int KEY[])
{
}

//これだと正常
void move(soldier fri[],//←正常
                 double cfri_x,double cfri_y,//←これで正常
                 soldier ene[],int KEY[])
{
}
よろしくお願いします。

Yv

Re: サブクラスとしてオブジェクトを渡すとメンバ変数の数値がおかしくなります

#2

投稿記事 by Yv » 9年前

このコードの問題点はお分かりになるでしょうか
http://ideone.com/ZtG8me

配列は型の大きさ×型の数の領域を確保するものでしかありません
また添え字は先頭から指定バイトずらした位置の領域を指定の型として扱うものです
ポリモーフィズムが有効なのはポインタに限られており、実体の変換はできません
(ダメな例) man a = (man)(captain());

captainへのポインタ(captain*)はman型のポインタ(man*)に代入できるのでプログラムは動きますが
添え字でアクセスしたときにman[1]はcaptain[1]を指しません。

複数のcaptainをまとめてmanとしてあるクラスへ渡したい場合は
各captainを指すポインタをすべてman型のポインタに変換しておく必要があります
newを使うことも検討してみてください

アバター
はんなり
記事: 48
登録日時: 14年前

Re: サブクラスとしてオブジェクトを渡すとメンバ変数の数値がおかしくなります

#3

投稿記事 by はんなり » 9年前

回答ありがとうございます。とても良くわかりました。
これからnewの方を試してみようと思います。

ありがとうございました!

閉鎖

“C言語何でも質問掲示板” へ戻る