gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:30:01 24 4
gpt4 key购买 nike

在构造函数上初始化名为 ManageRenderListenerCommand 的类时,我在 C++ (MVS 2010) 上遇到异常行为。这是作为命令设计模式实现的,其中 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。

问题是,在构造函数上,我将字符串放在私有(private)成员上,但调试后我可以看到在分配和强制转换后它被删除并重新初始化为“”。我试过 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++ - 在 C++ 上的 if 语句中构造函数初始化后删除字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15610565/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com