C++访问存储在向量中的对象的元素
C++ accessing elements of an object stored in a vector
举个例子:
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_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`
}
在这个载体中,会有像西兰花、芦笋等。我必须使用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
将不起作用)。
- 复制包含C++所有元素的对象!(构造函数和赋值,最佳实践?
- 为什么平均打印数组元素比打印单个对象慢C++?
- push_back通过自行创建的对象获取最后一个元素的向量
- 从自定义类获取对象向量中的 max 元素
- 选择一个元素而不是一个对象的数组的原因
- 数组对象的生存期是否在重用其元素存储时结束?
- 如何替换双端对象中的元素?
- 打印出对象向量中的每个元素C++
- C++ - 打印派生类对象的矢量<base*> 元素
- 从C++中的非基元对象的向量中移除所有匹配元素
- 如何将某个元素从shared_ptr擦除到对象向量?
- 从对象数组中删除元素
- 访问指向对象指针向量的指针的第一个元素?
- 在指向对象的指针的动态数组上插入新元素
- 打印/修改类对象的特定成员变量,其类定义列表 (STL) 包含的元素类型
- 如何通过引用对用户定义对象的类型集 (STL) 的数组元素进行增强迭代?
- 如何从对象指针的向量中正确清理元素
- ptrdiff_t可以表示指向同一数组对象元素的指针的所有减法吗?
- 从私有数组类C++访问类对象元素
- 在RapidJson中循环数组并获取对象元素