sf::类的字符串成员恢复为空
sf::String member of class reverts to blank
运行以下代码行:
Enemy* enemy = new Enemy(m_pSceneManager,"enemy"+ss.str());
std::cout << "Enemy name = " << std::string(enemy->name) << std::endl;
Add(enemy->name,enemy);
在EnemyManager.cpp中。EnemyMManager继承自GameObjectManager:
void GameObjectManager::Add(sf::String name,VisibleGameObject* obj){
std::cout << "GameObjectManager obj name = " << std::string(obj->name) << std::endl;
gameObjects.insert(std::pair<sf::String,VisibleGameObject*>(name,obj));
}
Enemy继承自VisibleGameObject,这两个对象都有一个公共的sf::String'name'变量,但只有Enemy在任何时候(在其构造函数中)初始化它。控制台窗口中的输出如下:
Enemy name = enemy0
GameObjectManager obj name =
为什么name
恢复为零?我假设这与论点是VisibleGameObject*而不是Enemy*这一事实有关——如果是,我该如何解决这一问题?如果我在其他地方犯了错误,请告诉我是否需要我遗漏的任何细节。
感谢
如果我正确理解您的描述,您的代码如下所示:
struct VisibleGameObject {
sf::String name;
};
struct Enemy : VisibleGameObject {
Enemy(SceneManager*, sf::String newName) : VisibleGameObject(), name(newName)
sf::String name;
};
struct GameObjectManager {
void GameObjectManager::Add(sf::String name,VisibleGameObject* obj){
std::cout << "GameObjectManager obj name = " << std::string(obj->name) << std::endl;
gameObjects.insert(std::pair<sf::String,VisibleGameObject*>(name,obj));
}
private:
std::map<sf::String, VisibleGameObject*> gameObjects;
};
struct EnemyManager : GameObjectManager {
void foo() {
//This code probably leads to a memory leak, but you might have solved it in some
//way that you are not showing.
Enemy* enemy = new Enemy(m_pSceneManager,"enemy"+ss.str());
std::cout << "Enemy name = " << std::string(enemy->name) << std::endl;
Add(enemy->name,enemy);
}
};
这意味着,当构造Enemy
对象时,Enemy::name
变量被初始化为保持"enemy"+ss.str()
。然而,VisibleGameObject::name
变量(位于Enemy
的VisibleGameObject部分)被初始化为保持其默认值(其中不包含文本)。
在EnemyManager::foo
中,引用的名称变量是Enemy
中的名称变量。在GameObjectManager::Add
中,引用的name
变量是Enemy
的VisibleGameObject
基成员中的变量。VisibleGameObject::name
仍然有其默认值,因此不会打印任何内容。
因为,正如您所说,都有一个公共的sf::String'name'变量,但只有Enemy在任何时候(在其构造函数中)初始化它,有两个子对象name
:一个是Enemy
的成员,另一个子对象是VisibleGameObject
的子对象。在函数Add
中,您明确地引用了后一个,所以这就是您得到的,并且它没有初始化。
您可能想要使name
成为一个返回字符串的虚拟函数;这将使函数Add
采用运行时多态性并从派生类(即从Enemy
)调用name()
。
更简单(但不一定更好)的设计是使name
受保护或成为VisibleGameObject
的公共成员,并让Enemy
设置它;这也意味着您很可能希望从Enemy
中删除name
,否则从VisibleGameObject
继承的name
将被隐藏。
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 助记符和指向成员语法的指针
- 用于访问容器<T>数据成员的正确 API
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 嵌套在类中时无法设置成员数据
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 将函数类成员映射到类本身内部
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 将Ref对象作为类成员
- 将包含C样式数组的对象初始化为成员变量(C++)
- 无法从映射中恢复指向成员函数的指针
- sf::类的字符串成员恢复为空
- 静态成员回收内存并从异常中恢复
- 从指针到成员恢复父节点