ManageRenderListenerCommandというクラスをコンストラクターで初期化すると、C ++(MVS 2010)で異常な動作が発生します。これは、コマンド設計パターンとして実装されます。ここで、ManageRenderListenerCommandコマンドは具体的なコマンドの1つです。
私が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());
}
}
詳細が必要な場合は、それを求めてください。ご協力いただきありがとうございます。