2015-04-04 4 views
2

Я реализовал проект наследования с использованием базового классаметод 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 :: карты, но не может бросить исключение, так как я программирую для встроенного системного приложения.

+0

, если вам нужно решить во время выполнения, я не вижу способа избежать виртуальных вызовов/динамического распределения, но я могу ошибаться (поскольку я научился никогда не говорить никогда на C++:)) Если вы решите во время компиляции, то вы можете использовать различные методы, возможно, использование тегов будет лучшим. – vsoftco

ответ

0

Возможно реализовать абстрактный класс Msg. Выведите все три класса Msg, GoodMorningMsg, GoodEveningMsg. Templatise класс Msg и при создании экземпляра класса GoodMorningMsg или класса GoodEveningMsg и разработки абстрактного метода mets класса Msg для вызова метода buildMsg типа, который был передан. Тем не менее, я не уверен, как это решит вашу проблему, а затем снова im конечно, я полностью понимаю вашу проблему

+0

Благодарим вас за ответ. Класс Msg - мой базовый класс, а GoodMorningMsg и GoodEveningMsg - мои производные классы. – Eagle

Смежные вопросы