1

たとえば、次のようにします。

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_ptrunique_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

4

1 に答える 1

5

shared_ptr<Plant>だけでなく、ベクターに格納する必要がありますPlant。つまり、実際には s を保存するのではなく、その部分のみを保存します(投稿の最後で提案したように、 へのキャストは機能しません)。BroccoliPlantBroccoli

于 2013-09-02T23:24:13.177 に答える