Hi
I'd like to implement a queue for messages:
- I have a base Message class, which is inherited by subclasses which contains further data for a particular purpose (e.g. a TimeMessage object)
- The queue should be able to store a Message object or any subclass (and any combination thereof).
- The queue can have a fixed size (e.g. 5 Messages or Message subclasses)
I think this could be done via dynamic allocation and the passing of pointers. At a high level, it would work like this (and I appreciate that the below has all sorts of issues - I have just typed out quickly to show what I am trying to do):
#include <iostream>
using namespace std;
class Message
{
protected:
int mMsgCode;
public:
Message(int msgCode) : mMsgCode(msgCode) {}
int getMsgCode()
{
return mMsgCode;
}
virtual void serialiseMe()
{
cout << "msgCode: " << mMsgCode << endl;
}
};
class TimeMessage : public Message // just an example, there might be many other subclasses
{
private:
unsigned int mTm;
public:
TimeMessage(int msgCode, unsigned int tm) : Message(msgCode)
{
mTm = tm;
}
unsigned int getTime()
{
return mTm;
}
virtual void serialiseMe() override
{
Message::serialiseMe();
cout << "Time: " << mTm <<endl;
}
};
class MessageQueue
{
private:
static const int QUEUE_SZ = 2;
Message *pMessages[QUEUE_SZ];
public:
void addMessage(Message msg)
{
pMessages[0] = new Message(msg.getMsgCode());
}
void addTimeMessage(TimeMessage tMsg)
{
pMessages[1] = new TimeMessage(tMsg.getMsgCode(), tMsg.getTime());
}
Message* getMessage(size_t messageN)
{
return pMessages[messageN];
}
};
int main()
{
MessageQueue queue;
queue.addMessage( Message(33) );
queue.addTimeMessage(TimeMessage (44, 595949239));
queue.getMessage(0)->serialiseMe(); // msgCode: 33
queue.getMessage(1)->serialiseMe(); // msgCode: 44 // call serialiseMe() of TimeMessage by polymorphism
//Time: 595949239
return 0;
}
The key issue with the above which I am trying to solve is to avoid dynamic allocation (which is generally discouraged on embedded platforms). Is there any way in which I can have this type of functionality without dynamic allocation (i.e. adding Messages or subclass Messages to the queue and relying on polymorphism)?
Thanks