【发布时间】:2016-03-02 06:24:29
【问题描述】:
我将 C++ 包装在 C dll 中。该 dll 在我的 C# 项目中被调用。
在我的包装函数中,我调用了很多单例,它们的设置如下:
ComponentManager &ComponentManager::_cmpManager()
{
static ComponentManager ONLY_ONE;
return ONLY_ONE;
}
上述函数是我的 ComponentManager 类中的静态函数。 具体问题如下:
bool createNewEntity(char *c)
{
if (ComponentManager::_cmpManager().nameAvailable(c))
{
Entity e(c);
Transform t;
ComponentManager::_cmpManager().addComponent(c, t);
SceneNode sc(CMP_MANAGER2.getComponent<Transform>(c));
SCENE_MANAGER.addSceneNode(sc, e.entityName);
return true;
}
return false;
}
本质上它的作用是单例有一个带有键类型字符串的哈希映射,这个函数检查这个键是否已经存在。行为总是返回 true。当我使用 componentManager 类型的全局对象而不是单例时,它的行为正确,所以有些事情告诉我单例不断离开范围并删除自己。此外,如果我在应用程序 exe 而不是 dll 中使用单例,它的行为正确。所以我有两个问题,
- 有没有办法防止我的单身人士超出范围?如果 不是。
- 是否有另一种设置单例不被删除的方法 离开范围后?
【问题讨论】:
-
你认为对象为什么会被破坏?如果函数始终返回 true,则表示该名称可用(如果 ComponentManager 是新构建的,则不太可能)。此外,您的 createNewEntity 函数实际上并没有创建任何东西。要么您的代码相当奇怪(恕我直言),要么您遗漏了对理解您的问题至关重要的部分。
-
您是否禁用了复制构造函数?是否可以将返回的单例分配给变量而不是引用?
-
我将编辑我的问题以获取更多信息。函数 createNewEntity 被简化。当我使用 componentManager 类型的对象时,这个函数在取名时返回 false。