【发布时间】:2021-11-22 10:36:08
【问题描述】:
我在将子类对象存储到向量时遇到问题。我有父类
class IngameObject
{
protected:
bool clickable = false;
};
我有二等课
class Character : public IngameObject
{
protected:
bool clickable = true;
};
现在,我正在尝试创建 Character 的新实例并将其添加到向量中。我将向量定义为
std::vector<IngameObject*> objVector;
创建字符和存储字符的代码是
for(int i = 0; i < 1; i++)
{
int a = i*32;
Character *c = new Character(this->holderTextures["texture"], sf::IntRect(a, a, 32, 32), sf::Vector2f(2*a, 10.f));
std::cout << instanceof<Character>(c) << " TEST" <<std::endl;
this->objVector.emplace_back( c );
std::cout << instanceof<Character>(this->objVector.back()) << " TEST" <<std::endl;
}
在第一种情况下,实例是字符。在 emplace_back 到 objVector 之后是实例 IngameObject 的类型,并且 bool clickable 设置为 false。我做错了什么?
编辑 Instanceof 定义为
template<typename Base, typename T>
inline bool instanceof(const T*) {
return std::is_base_of<Base, T>::value;
}
【问题讨论】:
-
什么是
instanceof? -
已添加到帖子中。 :)
-
另请注意,
Character有 两个 变量,名为clickable、Character::clickable和IngameObject::clickable。默认构造函数会将前者设置为true,将后者设置为false。如果您尝试访问foo->clickable,其中foo是IngameObject*指针,它只会查看IngameObject::clickable。与其声明一个新的成员变量,不如编写一个Character构造函数来正确设置继承变量的值。 -
instanceof<Character>(this->objVector.back())将始终为false,无论objVector.back()是否恰好指向Character。objVector.back()是IngameObject*,这意味着您正在检查std::is_base_of<Character, IngameObject>::value,即false。如果你想runtime检查实际指向的对象是否是Character的实例,你需要做一个dynamic_cast。 -
您的
ingameObject缺少虚拟析构函数,因此以多态方式使用是不安全的。
标签: c++ object inheritance vector