我使用基类
实现了继承设计// Msg.hpp
#ifndef __MSG_H_
#define __MSG_H_
#include <iostream>
#include <string>
class Msg {
public:
virtual void buildMsg(std::string &msg) = 0;
};
#endif
在我的例子中,有两个派生类:
// GoodMorningMsg.hpp
#ifndef __GOOD_MORNING_MSG_H_
#define __GOOD_MORNING_MSG_H_
#include "Msg.hpp"
class GoodMorningMsg : public Msg {
public:
void buildMsg(std::string &msg) {
msg.append("Good Morning");
};
};
#endif
// GoodEveningMsg.hpp
#ifndef __GOOD_EVENING_MSG_H_
#define __GOOD_EVENING_MSG_H_
#include "Msg.hpp"
class GoodEveningMsg : public Msg {
public:
void buildMsg(std::string &msg) {
msg.append("Good Evning");
};
};
#endif
为了避免需要 switch ,我通常会将来自 GoodMorningMsg 和 GoodEveningMsg 类的实例放在std :: map对象中并且每次都执行相关对象来构建我的消息。
由于我正在为嵌入式系统编写代码,因此不允许使用动态分配(换句话说,STL库)。
假设我事先知道我需要创建的实例的大小,我如何实现通用代码并避免在我的代码中使用开关?
更新 我解决了一个问题,但第二部分仍然是开放的。 这是我的main.cpp:
#include <iostream>
#include <map>
#include "Const.hpp"
#include "Msg.hpp"
#include "GoodMorningMsg.hpp"
#include "GoodEveningMsg.hpp"
void printMsg( std::map<std::string, Msg*> msgMapObject , std::string msg , const std::string & strToFind ) {
std::map<std::string, Msg*>::iterator it = msgMapObject.find( strToFind );
if(it != msgMapObject.end()) {
it->second->buildMsg( msg );
std::cout << "Message: " << msg << std::endl;
}
}
int main() {
GoodMorningMsg goodMorningMsg = GoodMorningMsg();
GoodEveningMsg goodEveningMsg = GoodEveningMsg();
std::map<std::string, Msg*> msgMap;
msgMap.insert(std::make_pair( std::string("GoodMorning") , &goodMorningMsg ) );
msgMap.insert(std::make_pair( std::string("GoodEvening") , &goodEveningMsg ) ) ;
std::string msg("I wish you ");
printMsg( msgMap , msg , std::string("GoodMorning") );
printMsg( msgMap , msg , std::string("GoodEvening") );
return 0;
}
我不想每次创建一个GoodMorningMsg或GoodEveningMsg类的实例,而是想放置一些等同于std :: map的东西,但是它不能抛出异常,因为我正在为嵌入式系统应用程序编程
答案 0 :(得分:0)
可能实现一个抽象的Msg类。导出所有三个类Msg,GoodMorningMsg,GoodEveningMsg。 Templatise Msg类,并在实例化时传递GoodMorningMsg类或GoodEveningMsg类,并设计Msg类抽象方法来调用传入类型的buildMsg方法。这就是说我不知道如何解决你的问题,然后我不能确定我完全理解你的问题