Nicht aufgelöstes externes Symbol...



  • Hallo!

    Ich komm gleich zu meinem Problem.

    Hier z.B.: die Klasse Device.h :

    class Device
    	{
    	private :
    
    	public : 
    		virtual void Draw() = 0;
    		static Device* Create();
    	};
    

    (Die Funktionen sind Leer.)
    Ich weiß nicht ob der Fehler auch was damit zutun hat(ich denke eher nicht)
    Trotzdem mal hier
    Nun hab ich z.B.: die Klasse Data.h :

    class Data : public Device
    	{
    	private :
    
    	public :
    		void Draw();
    	};
    

    (Funktion Draw ist hier auch leer)
    So.Jetzt in main.cpp hab ich das ganze dann z.B. so

    ...
    int main()
    {
    	Device* dev = Device::Create();
    	dev->Draw();
    }
    

    Der Fehler :

    mainConAPI.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: static class device::Device * __cdecl device::Device::Create(void)" (?Create@Device@device@@SAPAV12@XZ)".
    
    1>D:\ConsoleAPI\Debug\ConsoleAPI.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise.
    

    Ich hab das Gefühl das es einfach irgendweine Kleinigkeit ist, die mein Gehirn aber nicht mehr registrieren will, da sie 100% von diesem Code überzeugt ist... 🙄

    Naja, vielen Dank schonmal 😉



  • Die Implementation von Device::Create() fehlt. Du hast in der Klassendefinition lediglich eine Deklaration stehen.



  • Der Compiler findet die Definition von Device::Create nicht. Ich auch nicht...



  • OH JESUS....

    Device* Device::Create(){}
    

    War so klar... naja danke ^^



  • Nur mal so nebenbei: Warum packst du das nicht in den Konstruktor?



  • Was meinst du damit ?



  • Wozu soll deine Create() Funktion da sein, und warum lässt sich das nicht in den Konstruktor verlagern?



  • und warum gibst du da einen Pointer zurück? du rufst doch hoffentlich irgendwo auch delete auf? Oder hast du irgendwo ein statisches/globales Objekt?

    Wie sieht denn deine Create-Methode aus?



  • @cooky Ja gute idee kann ich eig. machen

    daddy_felix schrieb:

    und warum gibst du da einen Pointer zurück? du rufst doch hoffentlich irgendwo auch delete auf? Oder hast du irgendwo ein statisches/globales Objekt?
    Wie sieht denn deine Create-Methode aus?

    Pointer deswegen http://en.wikipedia.org/wiki/Abstract_factory_pattern
    Create-Methode ist leer wie du meinem ersten post entnehmen kannst



  • die Methode kann nicht leer sein, weil sie einen Rückgabetyp hat. Bitte poste die Methode so, wie du sie in deinem Code stehen hast.

    Ich bin mir auch nciht sicher, ob du das Pattern so richtig verstanden hast. So, wie du es momentan hast, wird es nicht funktionieren. Du brauchst mindestens noch ein Argument für die Create-Methode - oder alternativ unterschiedliche Create-Methoden (so mache ich es meistens). Und dann würde ich auch keinen raw Pointer zur+ckgeben, sondern einen shared_ptr.

    Aber das ist ein anderes Thema...



  • Ich hab noch nicht richtig angefangen mit dem was ich da machen will, ich frag jetzt gleich am Anfang um später nicht alles neu/korregieren zu müssen.

    Die Create Funktion könnte so aussehen ?!

    Device* Device::Create(string sClass) {
        if ( sClass == "Gui" ) return new Gui();
        return NULL;
    }
    


  • was heißt "könnte"? Gibt es irgendwo eine solche Funktion oder nicht?



  • Ja die gibt es aber nur mit dem return NULL; drinnen



  • poste doch bitte mal den *vollständigen* Code, also mit allen beteiligten Dateien. Das dürfte bei deienm Mini-Beispiel ja recht übersichtlich sein.

    Das "nichtaufgelöste externe Symbol" bedeutet, dass er die Definition der Methode nicht findet. Da ist es schon wichtig, wie und wo du diese Methode definiert hast.



  • Was soll das überhaupt werden? Was willst du erreichen? Und wozu bitte brauchst du hier das Factory Pattern? oO



  • ehm es läuft doch schon längst?Ich glaube das ist ein Missverständnis.
    @cooky Lesen,ausprobieren und lernen



  • oh sorry... ich dachte irgendwie, da wären noch mehr Fehler. Dann bin ich jetzt ruhig 😉



  • 7xCore schrieb:

    Lesen,ausprobieren und lernen

    Du willst also einfach nur das Pattern implementieren ohne irgendeinen Zusammenhang?



  • cooky451 schrieb:

    7xCore schrieb:

    Lesen,ausprobieren und lernen

    Du willst also einfach nur das Pattern implementieren ohne irgendeinen Zusammenhang?

    Ehm schon?Ist doch normal, das man erstmal was neues lernt und danach einsetzt?Oder machst du das anders ?



  • 7xCore schrieb:

    Ehm schon?Ist doch normal, das man erstmal was neues lernt und danach einsetzt?Oder machst du das anders ?

    Ja, total. Ich lerne nur das was ich brauche. Wenn ich ein neues Pattern sehe, nehme ich es war, merke mir dass es so ein Konzept gibt, und wenn ich mal ein Problem habe das ich damit lösen könnte, lese ich mir alle Artikel dazu durch die ich finden kann und versuche den für die Lösung optimalen Weg zu gehen.

    Bei neuen Sprachfeatures mag das etwas anders sein, aber die meisten Muster sind ja doch recht einfach, sodass das Implementieren ohne Kontext eigentlich einem Abschreiben gleichkommt, das einem keinerlei neue Erkenntnisse bringt.


Anmelden zum Antworten