2016-08-13 9 views
2

親要素と子要素のベクトルを作りたいと思います。私はただ1人の子供と私のコードをテストし、それはうまく動作します。しかし、もう1人の子供(Child2)を追加すると、問題が発生します。
私がpxの値を取得しようとすると、予想される出力は5 7 11ですが、値はtype(2)です。親と子のベクトルC++

MAIN.CPP

#include <SFML/Graphics.hpp> 
#include "Helper.h" 
#include <vector> 
#include <iostream> 
using namespace sf; 

int main() { 
    std::vector<Parent*> arr1; 
    arr1.push_back(new Child(3, 4, 5, 6)); 
    arr1.push_back(new Parent(7, 8)); 
    arr1.push_back(new Child2(9, 10, 11, 12)); 

    std::cout << static_cast<Universal*>(arr1.at(0))->dx << std::endl; 
    std::cout << static_cast<Universal*>(arr1.at(1))->x << std::endl; 
    std::cout << static_cast<Universal*>(arr1.at(2))->px << std::endl; 
    return 0; 
} 

Helper.cpp

#include "Helper.h" 

Parent::Parent(int x, int y) { 
    this->x = x; 
    this->y = y; 
} 

Child::Child(int x, int y, int dx, int dy) : Parent(x, y) { 
    this->dx = dx; 
    this->dy = dy; 
} 

Child2::Child2(int x, int y, int px, int py) : Parent(x, y) { 
    this->px = px; 
    this->py = py; 
} 

Universal::Universal(int x, int y) : Parent(x, y) {} 

Helper.h

class Parent { 
public: 
    int x, y; 
    int type = 0; 

    Parent(int x, int y); 
}; 

class Child : public Parent { 
public: 
    int dx, dy; 
    int type = 1; 

    Child(int x, int y, int dx, int dy); 
}; 

class Child2 : public Parent { 
public: 
    int px, py; 
    int type = 2; 

    Child2(int x, int y, int px, int py); 
}; 

class Universal : public Parent { 
public: 
    int dx, dy, px, py; 

    Universal(int x, int y); 
}; 
+3

あなたの 'static_cast 'にはUBがあります。 – Jarod42

+1

'std :: vector'(またはその問題のSTLコンテナ)に生ポインタを格納することは、ほとんど常に悪い考えです。代わりに 'std :: vector >'を使用してください。 – ArchbishopOfBanterbury

+0

@ Jarod42、UBとは何ですか? –

答えて

2

UniversalChild2の親子ではありません。したがって、static_castは機能しません。

CHILD2は、以下のクラスのメンバーがあります。

int int int 
px  py type 

ユニバーサルは、他の一方で、次のクラスのメンバーが含まれます。

int int int int 
dx  dy px  py 

とコードがpxを読み取るときに、それが終わる理由ですtypeの値を取得しています。コンパイラは、クラスメンバーの名前にかかわらず、各クラスメンバーをそのクラスの一部として連続して配置します。一方のクラスのtypeは、同じ相対位置、つまりクラスの先頭からのオフセットを、メモリ内で他のものにpxとして出現させます。クラスにはintのクラスメンバーが含まれています。 typeは、いずれかのクラスの3番目のintであり、typeは、もう1つの3番目のintです。

2つのクラスが同じ名前のクラスメンバーを持っているからといって、クラスメンバーがそのクラスのメンバーと同じ内部的な位置をメモリに持つわけではありません。

実際、C++標準では実際に多くの保証はありません。とにかく、クラスメンバが特定の順序で、メモリ内に配置されるという保証はありません。実際にはいくつかのルールがありますが、この質問の目的には関係ありません。

両方のクラスにフィールドがリストされていても、クラス宣言では、ある特定の順序で、非常に失礼なstatic_castが同じクラスのフィールドで終わるという事実に頼るべきではありません他のクラスと同じ値を持つ名前。

あなたがしようとしているのは、virtualのクラスメソッドを使用することです。

+0

ありがとう!私は仮想メソッドgetDX、DY、PX、PY、getTypeを作成し、それが私の問題を解決しました。 –

関連する問題