static Objekt Pointer speichern?



  • Hi,
    ich versuche einen static Objekt Pointer zu speicher aber ich bekomme ich es nicht hin 😞
    mein bisheriger Versuch:

    class PackageHandler
    {
    public:
    	static void StartPackageHandler();
    	static Server* mServer;
    };
    
    void PackageHandler::StartPackageHandler()
    {
    	mServer  = new Server(1000,PackageHandler::HandlePackage); // hier ist der Fehler
    }
    

    Fehler:

    error LNK2001: unresolved external symbol "public: static class Server * PackageHandler::mServer" (?mServer@PackageHandler@@2PAVServer@@A) PackageHandler.obj

    was mache ich falsch?

    mfg
    gandime



  • Du musst die statische Variable noch definieren. So ist sie nur deklariert.

    class PackageHandler
    {
    public:
        static void StartPackageHandler();
        static Server* mServer;
    };
    
    Server* PackageHandler::mServer = 0;
    


  • das hat super geklappt^^
    nun hab ich noch eine andere static variable die nicht so recht will^^

    class PackageHandler
    {
    public:
        static void StartPackageHandler();
        static map<UID,Client> mClients;
    };
    
    void PackageHandler::StartPackageHandler()
    {
        mClients[pID].ID = pID; // hier ist der Fehler
    }
    

    Fehler:

    error LNK2001: unresolved external symbol "public: static class std::map<unsigned int,struct PackageHandler::Client,struct std::less<unsigned int>,class std::allocator<struct std::pair<unsigned int const ,struct PackageHandler::Client> > > PackageHandler::mClients" (?mClients@PackageHandler@@2V?map@IUClient@PackageHandler@@U?map@IUClient@PackageHandler@@U?less@I@std@@V?allocator@U?allocator@U?pair@$$CBIUClient@PackageHandler@@@std@@@4@@std@@A) PackageHandler.obj

    Es ist bestimmt das selbe wie bei dem anderen... aber wie Definiere ich die denn eine map?



  • gandime schrieb:

    Es ist bestimmt das selbe wie bei dem anderen... aber wie Definiere ich die denn eine map?

    // Header
    class Foo {
      static std::Map<int, int> MyGreatMap; // Deklaration
    };
    
    // Source
    
    std::Map<int, int> Foo::MyGreatMap; // Definition
    


  • Ganz analog.

    PackageHandler::map<UID,Client> mClients;
    

    Der Unterschied ist halt, dass ein Zeiger in dem Sinne keinen Default-ctor hat und du daher den Konstruktor (getarnt als Zuweisung) aufrufen musst. Bei einem Standardcontainer sieht das anderst aus. Da hast du einen Default-ctor und brauchst daher auch keine Parameter zu übergeben.



  • hat alles gut geklappt thx


Anmelden zum Antworten