Я реализовал проект наследования с использованием базового классаметод Factory шаблон для встраиваемых систем
// 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
для того, чтобы избежать необходимости переключатель, я бы обычно размещал экземпляры от GoodMorningMsg и GoodEveningMsg классы в объекте std :: map и каждый раз выполняли r для создания моего сообщения.
Поскольку я пишу код для встроенной системы, мне не разрешено использовать динамическое размещение (другими словами, библиотеки STL).
Предполагая, что я заранее знаю размер экземпляра, который мне нужно создать, как я могу реализовать общий код и избегать использования переключателей в моем коде?
UPDATE Я решаю один вопрос, который у меня был, но вторая часть все еще открыта. Вот мой 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 :: карты, но не может бросить исключение, так как я программирую для встроенного системного приложения.
, если вам нужно решить во время выполнения, я не вижу способа избежать виртуальных вызовов/динамического распределения, но я могу ошибаться (поскольку я научился никогда не говорить никогда на C++:)) Если вы решите во время компиляции, то вы можете использовать различные методы, возможно, использование тегов будет лучшим. – vsoftco