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

C++ accessing elements of an object stored in a vector

本文关键字:对象 元素 向量 访问 存储 C++      更新时间:2023-10-16

举个例子:

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类型,并且包含一个成员变量,它是我需要的sprite,getter会返回它

我不明白的是如何访问getPlantSprite()

我想有一件事是我可以把class Plant改成class Plant : <some generic object class> and store that object in the vector instead of植物`

或者我可以选CCD_ 10。

更新:所以要使用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以决定静态强制转换为什么类型……不过。

您应该将shared_ptr<Plant>存储在向量中,而不仅仅是Plant。根据您目前正在做的操作,您正在进行切片,这意味着您实际上并没有存储Broccoli,只存储其中的Plant部分(正如您在文章末尾所建议的,转换为Broccoli将不起作用)。