2017-11-29 4 views
-5

こんにちは私はこの問題に論理的に問題があり、いくつかの助けが必要です。私が設定したのは、 'objects'という名前の基本クラスと 'robot'という名前の派生クラスです。私は別のクラスの 'ゲーム'に 'ロボット'のインスタンスを作成しました。これには 'ロボット'(ポインタを使用)が含まれています。だから私はそれを持っているコードの行は、位置がクラスのロボットの属性であるどのように基本クラスは、派生クラスの属性を知っています

robot* rob = new robot(int x, int y) 

です。私の 'オブジェクト'クラスでは、私はxとy座標がプライベートとして設定されているので、xとy座標のGetとSet関数を持っています。

は今、私はそのクラスのロボットが 'にアクセスし、それが自分のx、y座標です更新することができます理解しています。 'objects'クラスにxとyを含めたり、変更したりすることは可能ですか?私がこれを行うことを考えていた方法は、「オブジェクト」に「ゲーム」のメンバーを作成し、「オブジェクト」に「ロボット」の位置を変更することでした。しかし 'rob'は 'objects'への参照として渡されるので、それでもx座標とy座標は変更できますか?その後も、「ゲーム」は「ロブ」の新しい地位をどのように知っていますか?

+0

あなたの投稿を編集して、 'objects'クラスと' robot'クラスの内容を含めてください。 –

+2

'ロボット'が 'オブジェクト'から派生し、 'オブジェクト'のみが 'x'と' y'を持つ場合、 'ロボット'は 'x'と' y'のインスタンスを一度しか持ちません。タイトル質問に答えるには - それは – Fureeish

+0

ベースはそれから派生するものについては何も知らない。必要とされる非因果的な行動について考えてみてください。 – user4581301

答えて

1

基底クラスは、以下より、より専門的なクラスの抽象化です。その結果、基盤はそれを派生するものについて何も知らず、知る必要もない。すべてのクラスの知識はそれ自体であり、それが利用できるクラスに基づいています。また

、C++ビルドプロセスは、それが不可能な将来の子クラスのすべての可能な順列を知ることができます。まだ書かれていないかもしれないコードについて知っていなければならないでしょう。また、後で、または実行時にリンクされているかもしれないし、そうでないかもしれない他のモジュールにあるかもしれません。あなたは何もする必要はありませんほとんどの時間サブクラスを通じて、基本クラスのメンバを操作するため

publicprotectedの場合、サブクラスで基本クラスの内容にアクセスできます。 privateデータは通常どおりオフになります(ただし、friend船を参照してください)。

基底クラスがint x

x = 24; 

を持っている場合は、ほとんどの場合のために仕事を行います。ベースとサブクラスの両方が同じ名前の変数がある場合

これが唯一の問題になります。

いくつかのコードのための時間:

#include <iostream> 
struct object // using struct because it defaults to public access. 
       // This makes for a simpler example 
{ 
    int x; 
    int y; 
}; 

struct robot:public object 
{ 
    int x; // variable hides the x in object 
    int y; 

    void print() 
    { 
     std::cout << "robot: " << x << ',' << object::x << '\n'; 
     // to access object's x we must ask for it explicitly 
    } 
}; 

struct betterrobot:public object 
{ 
    void print() 
    { 
     std::cout << "better robot: " << x << ',' << object::x << '\n'; 
    } 
}; 
int main() { 

    robot rob; 
    rob.x = 24; // set robot's x 
    rob.object::x = 42; // set object's x 
    rob.print(); 

    betterrobot rob2; 
    rob2.x = 24; 
    rob2.print(); 

    return 0; 
} 

出力:

ロボット:24,42

優れたロボット:24,24

Objectrobot自分を持っていますown xおよびyobjectxは、明示的にxobject::x異なる答えを与えたを印刷し、出力で

rob.object::x = 42; 

それを要求することによりrobotを介して到達することができます。あなただけ

rob.x = 24; 

スマートコンパイラは、すぐにそれがrobot::print方法を見ているようobject::xを初期化しないためにあなたに悲鳴を上げるれます。そうでなければ、幸せなデバッグ!

これは脳に大混乱を引き起こすため、めったにやりたくないことです。あなたは2つのxを持っており、polymprphicオブジェクト(注:事実を単純にするために例ではポリモーフィックオブジェクトはありません)で作業しているときは、本当にうまくいき、間違って設定するのは簡単ですx。それを避ける方法がない限り、これをしないでください。

混乱を避けるために、基本クラスの変数を継承して使用するほうが、ほとんど常に良いです。これはbetterrobotの機能です。 betterrobotobjectxyしか持っていません。混乱の可能性はありません。

rob2.x = 24; 

です。出力では、xobject::xの印刷で同じ回答が得られました。

objectと同様にbetterrobotを移動することができます。 objectmoveなどの機能を使用して、betterrobotを地図上で移動することができます。特別な魔法は必要ありません。

+0

非常に便利です!ありがとうございました – ZWang

関連する問題