2016-04-12 15 views
1

私はプロジェクトのためのテキストベースのビデオゲームを作らなければなりません。私は「タイル」と呼ばれるクラスを作成し、次に「壁」というサブクラスを作成しました。私は次に、以下に示すタイルの配列を作った。センタータイル、B2は壁です。私がtypeid(B2)==typeid(wall)を比較すると、タイルB2がタイプwallであってもfalseを返します。クラス「戦闘機」にはxとyの成分があります。なぜtypeidは常にfalseを返すのですか?

//Initiate map 
    const int rows = 3; 
    const int cols = 3; 
    tile A1, A2, A3, B1, B3, C1, C2, C3; 
    fighter wizard(1, 2, 6, ft::mage, 100); 
    C3 = tile(wizard, "There's all this magic stuff everywhere."); 
    wall B2= wall("A wall blocks your path."); 
    tile map[rows][cols] = {{A1, A2, A3}, 
          {B1, B2, B3}, 
          {C1, C2, C3}}; 
... 

fighter player1(0, 0, 0, ft::warrior); 

... 

string input = ""; 
while(input!="quit") 
{ 
    cin >> input; 
    if (input == "left") { 
     if (typeid(map[player1.y][player1.x - 1]) == typeid(wall)) 
      cout << map[player1.y][player1.x - 1].scene; 
+2

だから、なぜあなたは' [player1.y] [1 player1.x]マップと思いますか?私はそれが純粋なタイルだと言うでしょう(オブジェクトコピー=>スライス**のため、B2が壁であっても) – deviantfan

+0

http://stackoverflow.com/questions/274626/what-is-object-slicing – deviantfan

+1

@deviantfan正しい軌道上にあります。 'tile'オブジェクトの2D配列を作成していて、' wall'を配列にコピーしようとすると問題が起こります。 'Tile *'は基本クラスなので 'Tile *'型や 'Wall *'型を指し示す 'Tile *'型の配列を持つつもりであると思います。 –

答えて

1
tile map[rows][cols] 

店舗タイルオブジェクト。これらのオブジェクトを検査する場合は、それらがクラスtileであることがわかります。元のB2オブジェクトのタイプではなく、wallです。したがって

if (typeid(map[player1.y][player1.x - 1]) == typeid(wall)) 

は常にtile == wallを比較します。

ダイナミックタイプを保持するには、(スマート)ポインタまたは元のオブジェクトを参照する方法を使用する必要があります。これらのオブジェクトには、動的なタイプ/仮想機能が必要です。 `壁である -

も参照What is dynamic type of object