构造函数初始化C++上的if语句后删除字符串

dro*_*dpl 4 c++ string constructor scope initialization

当我在构造函数上初始化一个名为ManageRenderListenerCommand的类时,我在C++(MVS 2010)上遇到了一个额外的行为.这是作为Command设计模式实现的,其中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();
}
Run Code Online (Sandbox Code Playgroud)

正如您在代码中看到的那样,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
}
Run Code Online (Sandbox Code Playgroud)

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您需要更多细节请求.谢谢你的帮助.

Rei*_*ica 6

你正在使用一个悬垂的指针.您正在使用的对象构造会创建一个临时对象,当完整表达式(the static_cast)结束时会被销毁.你仍然有一个指向它所在位置的指针command,但是对象本身已经被销毁了.

您需要创建命令,以便在调用之前保持该命令execute().如果代码如您所示,您可以简单地执行此操作:

if(negotiatorEvent.matchEvent("addToViewport")){
    AddToViewportCommand(mCameraManager, mSceneCreator, mEngine).execute();
}else if (negotiatorEvent.matchEvent("manageRenderListener")){
    ManageRenderListenerCommand(mObserverRegistry, mEngine, negotiatorEvent.getMessage()).execute();
}
Run Code Online (Sandbox Code Playgroud)

如果创建和调用之间有更多步骤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;
}
Run Code Online (Sandbox Code Playgroud)

如果您有权访问C++ 11,请使用std::unique_ptr<ICommand>for command而不是原始指针.