比如说你有:
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
类型,并且包含一个成员变量,它是我需要的精灵,getter返回它。
我不明白如何访问getPlantSprite()
我想有一件事是我可以将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`
}
在这个载体中会有像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);
我做存储internal ID
作为Plant的一部分,我可以switch
来决定静态转换为什么类型..... / p>
答案 0 :(得分:5)
您应该在您的向量中存储shared_ptr<Plant>
,而不仅仅是Plant
。根据您目前正在执行的操作,您将获得slicing,这意味着您实际上并未存储Broccoli
s,只存储Plant
部分(以及转换为{{ 1}},正如您在帖子末尾所建议的那样,将无效。)