ich wurde durch den Singleton-Thread () darauf aufmerksam gemacht, dass mein aktueller Code nicht sonderlich schön aufgeteilt ist. Außerdem ist es mit einem Wunsch zusammengefallen, meine Applikation wirklich Multiuserfähig zu machen...
Ich zeig euch einfach Code, das kann ich besser als Deutsch..
ACHTUNG, ALLES PSEUDOCODE ZUM VERDEUTLICHEN
So war es bisher:
Code:
class Inventory : public Singleton<Inventory> { public: void SetItemData(ItemData&); void GetItemData(ItemData&); }; class Network : public Singleton<Network> { public: void MainLoop() { if( (recvd = recv(&buf)) > 0) { PacketHandler::Instance()->OnRecvPackets(&buf, recvd); } }; class PacketHandler : public Singleton<PacketHandler> { public: void OnRecvPacket(uint8_t* data, size_t len) { buf_queue.insert(buf_queue.end(), data, data + len); MainPacketHandler(); } void MainPacketHandler() { uint8_t packet_id = ((uint8_t*)&buf_queue[0])[0]; switch(packet_id) { case ITEM_ADD: Inventory::Instance()->SetItemData(...); buf_queue.erase(buf_queue.begin(), sizeof(ItemAddPacket)); }; } private: std::vector<uint8_t> buf_queue; };
Darum dachte ich, ich könnte eine einzige Klasse machen, die so aussieht:
Code:
class Main { private: Inventory m_inventory; Network m_network; PacketHandler m_handler; };
Hier kommt meine Frage:
Soll ich lieber jeder einzelnen Klassen Referenzen auf die benötigten geben, so:
(Am Beispiel der Netzwerk-Klasse)
Code:
class Network : public Singleton<Network> { public: Network(Main* inst, PacketHandler* handler) { m_client_instance = inst; m_packet_handler = handler; } void MainLoop() { if( (recvd = recv(&buf)) > 0) { m_packet_handler->OnRecvPackets(&buf, recvd); } private: Main* m_client_instance; PacketHandler* m_packet_handler; };
Code:
class Network : public Singleton<Network> { public: Network(Main* inst) { m_client_instance = inst; } void MainLoop() { if( (recvd = recv(&buf)) > 0) { m_client_instance->OnRecvPackets(&buf, recvd); } private: Main* m_client_instance; }; class Main { public: void OnRecvPacket(uint8_t* data, size_t len) { m_handler.OnRecvPackets(data, len); } private: Inventory m_inventory; Network m_network; PacketHandler m_handler; };
Oder aber ist alles Bullshit und die wahre Lösung ist ganz anders?
Wäre nett, wenn jemand das versteht und helfen kann
Fehler/Ungereimtheiten im Code könnten sein, ich hab das grade nur aus'm Kopf auf das wesentliche reduziert geschrieben.. Einfach nachfragen und/oder drauf aufmerksam machen.
epvp, do your thing!
€: Ich probier grade rum und muss sagen: das mit Vererbung wirkt gar nicht SOO doof. Meinungen?
Padmak