C++访问存储在向量中的对象的元素

Jas*_*son 0 c++ class vector c++11

比如说你有:

class Plant {
    public:
    ...public accessors, etc ...

}
Run Code Online (Sandbox Code Playgroud)

然后你有一个特定的植物类:

class Broccoli : public Plant
{
    public:
        Broccoli(int i);
        virtual ~Broccoli();

        inline BroccoliSprite* getPlantSprite() { return _plantSprite; };

    private:
         BroccoliSprite* _plantSprite;

};
Run Code Online (Sandbox Code Playgroud)

在某些时候,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();
    ....


 }
Run Code Online (Sandbox Code Playgroud)

我希望能够用getPlantSprite()它来显示给用户,但编译器告诉我:No member named 'getPlantSprite' in 'Plant'

这是真的,但是向量中的对象是类型Plant并且包含一个成员变量,它是我需要的精灵,getter返回它.

我不明白的是如何获得访问权限 getPlantSprite()

我想有一点是我可以改变class Plantclass Plant : <some generic object class> and store that object in the vector instead ofPlants`

或者我可以演员Broccoli.

更新:所以使用 shared_ptr<>

我目前在做:

 Broccoli b(tempField->getFieldNumber()); 
 tempField->getPlants().push_back(b);
Run Code Online (Sandbox Code Playgroud)

这意味着我会做的事情如下:

std::shared_ptr<Plant> object1(new Broccoli(tempField->getFieldNumber()));
tempField->getPlants().push_back(std::move(object1));
Run Code Online (Sandbox Code Playgroud)

我现在如何访问Broccoli共享指针内的对象来执行操作?

在我以前做以下事情之前:

Broccoli b(tempField->getFieldNumber());

tempField->getFieldSprite()->addChild(b.getPlantSprite(), 2);

b.getPlantSprite()->setRotation(BROCCOLI::plantRotation);

tempField->getPlants().push_back(b);
Run Code Online (Sandbox Code Playgroud)

现在:

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);
Run Code Online (Sandbox Code Playgroud)

编译器说b.是一个明确有意义的未声明的标识符,但是我需要在将对象放入其中之后对该对象做更多的操作shared_ptr

所以这可能是:

std::shared_ptr<Plant> object1(new Broccoli(tempField->getFieldNumber()));

tempField->getPlants().push_back(std::move(object1));

object1->getPlantSprite()->setRotation(BROCCOLI::plantRotation);
Run Code Online (Sandbox Code Playgroud)

但编译器仍然说: `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`
}
Run Code Online (Sandbox Code Playgroud)

在这个载体中会有像Broccoli,Asparagus等的东西.我将不得不使用dynamic_pointer_cast,但这个行看起来像什么:

std::shared_ptr<Plant> sbas = _f.getPlants().at(f);

std::shared_ptr<Plant?????> sder2 = std::dynamic_pointer_cast<Broccoli>(sbas);
Run Code Online (Sandbox Code Playgroud)

确实存储了一个internal ID作为植物的一部分,我可以做switch以确定静态施放到什么类型.....

Chr*_*ung 5

你应该存储shared_ptr<Plant>在你的矢量中,而不仅仅是Plant.对于你目前正在做的事情,你正在进行切片,这意味着你实际上并没有存储Broccolis,只有它的Plant部分(并且Broccoli如你在帖子末尾所建议的那样,转换为不起作用).

  • what about using a `unique_ptr` over a `shared_ptr` (3认同)