たとえば、次のようにします。
class Plant {
public:
...public accessors, etc ...
}
次に、特定の植物クラスがあります。
class Broccoli : public Plant
{
public:
Broccoli(int i);
virtual ~Broccoli();
inline BroccoliSprite* getPlantSprite() { return _plantSprite; };
private:
BroccoliSprite* _plantSprite;
};
ある時点で、Broccoli
オブジェクトはベクトルに格納されます。std::vector<Plant> vPlants;
私が使用するベクトルとその要素へのアクセス:inline std::vector<Plant>& getPlants() { return vPlants; };
アクセスするために:
for (int f=0; f < _f.getPlants().size(); f++)
{
Plant _p1 = _f.getPlants().at(f);
cocos2d::CCSprite* s = _p1.getPlantSprite();
....
}
ユーザーに表示するために使用できるようにしたいのですgetPlantSprite()
が、コンパイラーから次のように通知されます。No member named 'getPlantSprite' in 'Plant'
これは本当ですが、ベクター内のオブジェクトはタイプPlant
であり、必要なスプライトであるメンバー変数を含みます。ゲッターはそれを返します。
私が理解していないのは、アクセスする方法ですgetPlantSprite()
1つ言えることは、私はPlantsに変わるclass Plant
ことができるということclass Plant : <some generic object class> and store that object in the vector instead of
です`
または、にキャストできBroccoli
ます。
更新:だから使うshared_ptr<>
私は現在やっています:
Broccoli b(tempField->getFieldNumber());
tempField->getPlants().push_back(b);
これは、次のようなことをすることを意味します。
std::shared_ptr<Plant> object1(new Broccoli(tempField->getFieldNumber()));
tempField->getPlants().push_back(std::move(object1));
Broccoli
共有ポインタ内のオブジェクトにアクセスして何かを行うにはどうすればよいですか?
以前は次のようなことをしていました。
Broccoli b(tempField->getFieldNumber());
tempField->getFieldSprite()->addChild(b.getPlantSprite(), 2);
b.getPlantSprite()->setRotation(BROCCOLI::plantRotation);
tempField->getPlants().push_back(b);
今:
std::shared_ptr<Plant> object1(new Broccoli(tempField->getFieldNumber()));
tempField->getPlants().push_back(std::move(object1));
b.getPlantSprite()->setRotation(BROCCOLI::plantRotation);
tempField->getPlants().push_back(b);
コンパイラb.
は、明らかに意味のある宣言されていない識別子であると言いますが、オブジェクトをshared_ptr
したがって、これは次のようになります。
std::shared_ptr<Plant> object1(new Broccoli(tempField->getFieldNumber()));
tempField->getPlants().push_back(std::move(object1));
object1->getPlantSprite()->setRotation(BROCCOLI::plantRotation);
しかし、コンパイラはまだ言います:`No member named 'getPlantSprite' in 'Plant'
更新 2: オブジェクトのスライスを回避するために、基本クラスの純粋仮想で関数を作成すると、これを解決するのに役立つように見えますshared_ptr
。unique_ptr
更新 3:
for (int f=0; f < _f.getPlants().size(); f++)
{
std::shared_ptr<Plant> sbas = _f.getPlants().at(f);
std::shared_ptr<Broccoli> sder2 = std::static_pointer_cast<Broccoli>(sbas);
.. do stuff with `sder2`
}
このベクトルには、ブロッコリー、アスパラガスなどがあります。dynamic_pointer_cast を使用する必要がありますが、この行は次のようになります。
std::shared_ptr<Plant> sbas = _f.getPlants().at(f);
std::shared_ptr<Plant?????> sder2 = std::dynamic_pointer_cast<Broccoli>(sbas);
私は静的にキャストするタイプを決定するためにinternal ID
実行できる Plant の一部として保存します.....しかし.switch