在c++的if语句上初始化构造函数后删除字符串
String removed after constructor initialize on if statement on C++
我在c++ (MVS 2010)上初始化一个名为ManageRenderListenerCommand的类时遇到了一个奇怪的行为。这是作为命令设计模式实现的,其中ManageRenderListenerCommand命令是具体命令之一。
调用ManageRenderListenerCommand的地方
void Mediator::change(Negotiator* negotiator, NegotiatorEvent& negotiatorEvent){
ICommand* command = NULL;
if(negotiatorEvent.matchEvent("addToViewport")){
command = static_cast<ICommand*> (&AddToViewportCommand(mCameraManager, mSceneCreator, mEngine));
}else if (negotiatorEvent.matchEvent("manageRenderListener")){
command = static_cast<ICommand*> (&ManageRenderListenerCommand(mObserverRegistry, mEngine, negotiatorEvent.getMessage()));
}
//Execute the created command
if (command) command->execute();
}
正如您在代码中看到的,ManageRenderListener接收一个字符串,在这种情况下,这个字符串包含了包含在NegotiatorEvent类(negotiatorEvent.getMessage()
)上的单词add。
问题是,在构造函数上,我在私有成员上取字符串,但调试时我可以看到,在赋值和强制转换之后,它被删除并重新初始化为"。我试过static_cast, dynamic_cast。给点提示,我认为这是一个可见性问题,但我不知道如何处理。
}else if (negotiatorEvent.matchEvent("manageRenderListener")){
//Here mMessage = ""
command = static_cast<ICommand*> (&ManageRenderListenerCommand(mObserverRegistry, mEngine, negotiatorEvent.getMessage()));
//Here mMessage is again "" instead of add
}
ManageRenderListener.cpp
#include "ManageRenderListenerCommand.h"
ManageRenderListenerCommand::ManageRenderListenerCommand(
OgreRenderObserverRegistry* observerRegistry,
OgreEngine* engine,
string message):
mObserverRegistry(observerRegistry),
mEngine(engine),
mMessage(message){
}
void ManageRenderListenerCommand::execute(){
if (mMessage.compare("add") == 0){
mEngine->addRenderListener(mObserverRegistry->getCachedObserver());
}else if (mMessage.compare("detach") == 0){
mEngine->detachRenderListener(mObserverRegistry->getCachedObserver());
}
}
如果你需要更多的细节,请告诉我。谢谢你的帮助。
你在使用一个悬空指针。您正在使用的对象构造创建一个临时对象,当完整表达式(static_cast
)结束时,该对象将被销毁。你仍然有一个指向它所在位置的指针(在command
中),但是对象本身已经被销毁了。
您需要以一种方式创建命令,使其持续存在,直到调用execute()
。如果代码如您所示,您可以简单地这样做:
if(negotiatorEvent.matchEvent("addToViewport")){
AddToViewportCommand(mCameraManager, mSceneCreator, mEngine).execute();
}else if (negotiatorEvent.matchEvent("manageRenderListener")){
ManageRenderListenerCommand(mObserverRegistry, mEngine, negotiatorEvent.getMessage()).execute();
}
如果在创建和调用execute()
之间有更多的步骤,您可能必须动态地创建命令:
void Mediator::change(Negotiator* negotiator, NegotiatorEvent& negotiatorEvent){
ICommand* command = NULL;
if(negotiatorEvent.matchEvent("addToViewport")){
command = new AddToViewportCommand(mCameraManager, mSceneCreator, mEngine);
}else if (negotiatorEvent.matchEvent("manageRenderListener")){
command = new ManageRenderListenerCommand(mObserverRegistry, mEngine, negotiatorEvent.getMessage());
}
//Execute the created command
if (command) command->execute();
delete command;
}
如果您可以访问c++ 11,请使用std::unique_ptr<ICommand>
代替command
,而不是原始指针。
我认为你要做的是初始化一个命令,它在c'tor中接受一个字符串;你实际做的是强制命令是字符串本身的地址。您需要使用'new'操作符创建一个新对象,如果您已经匹配了命令的类型,您应该能够启动特定的命令并在c'tor中为其提供字符串,如:
command = new SomeICommand(ManageRenderListenerCommand(mObserverRegistry, mEngine, negotiatorEvent.getMessage());
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- std::vector::p ush_back() 不会在 MSVC 上编译具有已删除移动构造函数的对象
- std::ofstream 作为类成员删除复制构造函数?
- 如果我真的真的想从 STL 容器继承,并且我继承构造函数并删除新运算符,会发生什么?
- C++ 尝试在不存在的构造函数中引用已删除的函数(使用 rapidJson)
- 具有已删除移动和复制构造函数的类的就地构造
- 聚合初始化和删除的复制构造函数,也称为不可复制的 obejcts 作为字段
- 在引用初始化中使用已删除的复制构造函数进行复制初始化
- 在运行时有条件地删除类成员或跳过调用该成员对象的构造函数
- 我的类中几乎所有的构造函数和解构函数都被隐式定义为已删除?
- 为什么在删除"移动构造函数"时使用"复制构造函数"?
- 调用类模板中隐式删除的复制构造函数
- 当类型适当的构造函数可用时,为什么一个编译器尝试使用已删除的副本构造函数
- 编译器在C++中调用另一个函数时,在参数中查找已删除的构造函数
- 在构造函数中删除后继续执行
- 删除了在初始值设定项中调用的构造函数
- 删除使数据处于"错误状态"的默认构造函数的模式?
- C ++(为什么)确实移动构造函数删除运算符=
- 仅仅以避免隐式复制构造函数删除,使用shared_ptr而不是unique_ptr作为类成员明智