vmware | SMTS (C/C++, networking) | Bangalore | 22 Jun 2023 | Rejected 😀😀

Please upvote to reach Max Audience

😲😲😲 I was able to implement the same, But code was not compilable and Interviewer was in Hurry. :) Never MIND 😲😲😲

Question: Client Server Query Parser

  • You are given base and 2 derived classes.
  • Create a queue, which enqueues both derived class objects.
  • Queue has function named Dequeue() which provides custom output based on type of object dequeued.
/*
    Use OO principles to achieve same?
*/
#include<iostream>
#include<string>
using namespace std;

class Message {
    string messageId;
};
class ServerResponse : public Message {
    string serverId;
    string serverResponse;

};
class ClientRequest : public Message {
    string clientId;
    int requestTime;
};

class CustomQueue {
    queue q<>;
public:
    // Input ServerResponse, ClientRequest
    void Enqueue() {
    }
    void Pop() {
        q.pop();
    }
    /*
        if front=ServerResponse [messageId serverId serverResponse]
        if front=ClientRequest [messageId clientId requestTime]
    */
    string getFront() {
    }
};

int main() {
}

Solution

/*
    Use OO principles to achieve same?
*/
#include<iostream>
#include<string>
#include<queue>
#include<sstream>
using namespace std;

class Message {
public:
    string messageId;
    virtual ~Message() {};
    virtual std::string getType() const = 0;
};
class ServerResponse : public Message {
public:
    string serverId;
    string serverResponse;
    std::string getType() const override { return "ServerResponse"; }
};
class ClientRequest : public Message {
public:
    string clientId;
    int requestTime;
    std::string getType() const override { return "ClientRequest"; }
};

class CustomQueue {
    queue<Message*> q;
public:
    // Input ServerResponse, ClientRequest
    void Enqueue(Message* m) {
        q.push(m);
    }
    void Pop() {
        q.pop();
    }
    /*
        if front=ServerResponse [messageId serverId serverResponse]
        if front=ClientRequest [messageId clientId requestTime]
    */
    string getFront() {
        stringstream ss;
        Message* m = q.front();
        if (m->getType() == "ServerResponse") {
            ServerResponse* sr = dynamic_cast<ServerResponse*>(m);
            ss << "Server:" << " " << sr->messageId << " " << sr->serverId << " " << sr->serverResponse << "\n";
        } else if (m->getType() == "ClientRequest") {
            ClientRequest* cr = dynamic_cast<ClientRequest*>(m);
            ss << "Client:" << " " << cr->messageId << " " << cr->clientId << " " << cr->requestTime << "\n";
        }
        return ss.str();
    }
};

int main() {
    ClientRequest cr;
    cr.messageId = "cm1";
    cr.clientId = "cc1";
    cr.requestTime = 123;

    ServerResponse sr;
    sr.messageId = "sm1";
    sr.serverId = "ss1";
    sr.serverResponse = "sr1";

    // Create an instance of CustomQueue
    CustomQueue customQueue;

    // Enqueue the objects
    customQueue.Enqueue(&cr);
    customQueue.Enqueue(&sr);

    cout << customQueue.getFront() << "\n";
    customQueue.Pop();
    cout << customQueue.getFront() << "\n";

    return 0;
}
Comments (1)