Say for example you have:
class Plant {
public:
...public accessors, etc ...
}
Then you have a specific plant class:
class Broccoli : public Plant
{
public:
Broccoli(int i);
virtual ~Broccoli();
inline BroccoliSprite* getPlantSprite() { return _plantSprite; };
private:
BroccoliSprite* _plantSprite;
};
at some point the Broccoli
object is stored in a vector: std::vector<Plant> vPlants;
accessing the vector and its elements I use: inline std::vector<Plant>& getPlants() { return vPlants; };
to access:
for (int f=0; f < _f.getPlants().size(); f++)
{
Plant _p1 = _f.getPlants().at(f);
cocos2d::CCSprite* s = _p1.getPlantSprite();
....
}
I want to be able to use getPlantSprite()
to display it to the user but the compiler tells me: No member named 'getPlantSprite' in 'Plant'
This is true, but the object in the vector is of type Plant
and contains a member variable that Is the sprite I need, the getter returns it.
What I dont understand is how get access to getPlantSprite()
I guess one thing is I could change class Plant
to be class Plant : <some generic object class> and store that object in the vector instead of
Plants`
or I could cast to a Broccoli
.
UPDATE: So to use shared_ptr<>
I am currently doing:
Broccoli b(tempField->getFieldNumber());
tempField->getPlants().push_back(b);
This means I would be doing something like:
std::shared_ptr<Plant> object1(new Broccoli(tempField->getFieldNumber()));
tempField->getPlants().push_back(std::move(object1));
How do I now access the Broccoli
object inside the shared pointer to do things to it?
Before I used to do something like:
Broccoli b(tempField->getFieldNumber());
tempField->getFieldSprite()->addChild(b.getPlantSprite(), 2);
b.getPlantSprite()->setRotation(BROCCOLI::plantRotation);
tempField->getPlants().push_back(b);
Now:
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);
Compiler says b.
is an undeclared identifier which obviously makes sense, but I need to do more to the object after putting it inside the shared_ptr
so this might be:
std::shared_ptr<Plant> object1(new Broccoli(tempField->getFieldNumber()));
tempField->getPlants().push_back(std::move(object1));
object1->getPlantSprite()->setRotation(BROCCOLI::plantRotation);
but the compiler still says: `No member named 'getPlantSprite' in 'Plant'
UPDATE 2: to avoid object slicing, it looks like making functions in base class pure virtual might help solve this, still using shared_ptr
or unique_ptr
UPDATE 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`
}
in this vector there will be things like Broccoli, Asparagus, etc. I will have to use dynamic_pointer_cast, but what does this line look like:
std::shared_ptr<Plant> sbas = _f.getPlants().at(f);
std::shared_ptr<Plant?????> sder2 = std::dynamic_pointer_cast<Broccoli>(sbas);
I do store an internal ID
as part of Plant that I could do a switch
on to decide what type to statically cast to.....though.