Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Forentreff 2012     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: C++ (auch C++0x und C++11) ::  Nicht aufgelöstes externes Symbol...     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
7xCore
Mitglied

Benutzerprofil
Anmeldungsdatum: 30.07.2011
Beiträge: 386
Beitrag 7xCore Mitglied 17:49:07 02.02.2012   Titel:   Nicht aufgelöstes externes Symbol...            Zitieren

Hallo!

Ich komm gleich zu meinem Problem.

Hier z.B.: die Klasse Device.h :
C/C++ Code:
1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8
    class Device
    {
    private :

    public :
        virtual void Draw() = 0;
        static Device* Create();
    };
C/C++ Code:
1
2
3
4
5
6
7
8
class Device
{
private :

public :
virtual void Draw() = 0;
static Device* Create();
};
C/C++ Code:
1
2
3
4
5
6
7
8
    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 :
C/C++ Code:
    class Data : public Device
    {
    private :
   
    public :
        void Draw();
    };
C/C++ Code:
class Data : public Device
{
private :

public :
void Draw();
};
C/C++ Code:
    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
C/C++ Code:
...
int main()
{
    Device* dev = Device::Create();
    dev->Draw();
}
C/C++ Code:
...
int main()
{
Device* dev = Device::Create();
dev->Draw();
}
C/C++ Code:
...
int main()
{
    Device* dev = Device::Create();
    dev->Draw();
}

Der Fehler :
Code:
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.
Code:
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.
Code:
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... :rolleyes:

Naja, vielen Dank schonmal ;)

_________________
Mehr Spaß mit der Windows Konsole? -> http://www.coreengine.de.vu
_matze
Mitglied

Benutzerprofil
Anmeldungsdatum: 31.07.2007
Beiträge: 9602
Beitrag _matze Mitglied 17:52:12 02.02.2012   Titel:              Zitieren

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

_________________
Wie viele atheistische Babys hat man schon aus Versehen - oder gar mit Absicht! - getauft?
drakon
Mitglied

Benutzerprofil
Anmeldungsdatum: 28.01.2008
Beiträge: 6824
Beitrag drakon Mitglied 17:52:26 02.02.2012   Titel:              Zitieren

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

_________________
Blog: www.drakon.ch
7xCore
Mitglied

Benutzerprofil
Anmeldungsdatum: 30.07.2011
Beiträge: 386
Beitrag 7xCore Mitglied 17:53:45 02.02.2012   Titel:              Zitieren

OH JESUS....
C/C++ Code:
Device* Device::Create(){}
C/C++ Code:
Device* Device::Create(){}
C/C++ Code:
Device* Device::Create(){}

War so klar... naja danke ^^

_________________
Mehr Spaß mit der Windows Konsole? -> http://www.coreengine.de.vu
cooky451
Mitglied

Benutzerprofil
Anmeldungsdatum: 16.10.2010
Beiträge: 4840
Beitrag cooky451 Mitglied 17:55:54 02.02.2012   Titel:              Zitieren

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

_________________
Sie sind nicht berechtigt unrechtmäßige Kopien dieses Datenträgers zu erstellen.™
7xCore
Mitglied

Benutzerprofil
Anmeldungsdatum: 30.07.2011
Beiträge: 386
Beitrag 7xCore Mitglied 18:10:37 02.02.2012   Titel:              Zitieren

Was meinst du damit ?

_________________
Mehr Spaß mit der Windows Konsole? -> http://www.coreengine.de.vu
cooky451
Mitglied

Benutzerprofil
Anmeldungsdatum: 16.10.2010
Beiträge: 4840
Beitrag cooky451 Mitglied 18:28:19 02.02.2012   Titel:              Zitieren

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

_________________
Sie sind nicht berechtigt unrechtmäßige Kopien dieses Datenträgers zu erstellen.™
daddy_felix
Mitglied

Benutzerprofil
Anmeldungsdatum: 11.01.2012
Beiträge: 70
Beitrag daddy_felix Mitglied 18:31:07 02.02.2012   Titel:              Zitieren

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?
7xCore
Mitglied

Benutzerprofil
Anmeldungsdatum: 30.07.2011
Beiträge: 386
Beitrag 7xCore Mitglied 20:01:51 02.02.2012   Titel:              Zitieren

@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

_________________
Mehr Spaß mit der Windows Konsole? -> http://www.coreengine.de.vu
daddy_felix
Mitglied

Benutzerprofil
Anmeldungsdatum: 11.01.2012
Beiträge: 70
Beitrag daddy_felix Mitglied 10:32:13 03.02.2012   Titel:              Zitieren

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...
7xCore
Mitglied

Benutzerprofil
Anmeldungsdatum: 30.07.2011
Beiträge: 386
Beitrag 7xCore Mitglied 11:52:38 03.02.2012   Titel:              Zitieren

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 ?!

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

_________________
Mehr Spaß mit der Windows Konsole? -> http://www.coreengine.de.vu
daddy_felix
Mitglied

Benutzerprofil
Anmeldungsdatum: 11.01.2012
Beiträge: 70
Beitrag daddy_felix Mitglied 12:58:42 03.02.2012   Titel:              Zitieren

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

Benutzerprofil
Anmeldungsdatum: 30.07.2011
Beiträge: 386
Beitrag 7xCore Mitglied 13:16:23 03.02.2012   Titel:              Zitieren

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

_________________
Mehr Spaß mit der Windows Konsole? -> http://www.coreengine.de.vu
daddy_felix
Mitglied

Benutzerprofil
Anmeldungsdatum: 11.01.2012
Beiträge: 70
Beitrag daddy_felix Mitglied 14:57:23 03.02.2012   Titel:              Zitieren

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.
cooky451
Mitglied

Benutzerprofil
Anmeldungsdatum: 16.10.2010
Beiträge: 4840
Beitrag cooky451 Mitglied 15:07:01 03.02.2012   Titel:              Zitieren

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

_________________
Sie sind nicht berechtigt unrechtmäßige Kopien dieses Datenträgers zu erstellen.™
7xCore
Mitglied

Benutzerprofil
Anmeldungsdatum: 30.07.2011
Beiträge: 386
Beitrag 7xCore Mitglied 15:37:27 03.02.2012   Titel:              Zitieren

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

_________________
Mehr Spaß mit der Windows Konsole? -> http://www.coreengine.de.vu
daddy_felix
Mitglied

Benutzerprofil
Anmeldungsdatum: 11.01.2012
Beiträge: 70
Beitrag daddy_felix Mitglied 15:38:53 03.02.2012   Titel:              Zitieren

oh sorry... ich dachte irgendwie, da wären noch mehr Fehler. Dann bin ich jetzt ruhig ;)
cooky451
Mitglied

Benutzerprofil
Anmeldungsdatum: 16.10.2010
Beiträge: 4840
Beitrag cooky451 Mitglied 15:39:07 03.02.2012   Titel:              Zitieren

7xCore schrieb:
Lesen,ausprobieren und lernen
Du willst also einfach nur das Pattern implementieren ohne irgendeinen Zusammenhang?

_________________
Sie sind nicht berechtigt unrechtmäßige Kopien dieses Datenträgers zu erstellen.™
7xCore
Mitglied

Benutzerprofil
Anmeldungsdatum: 30.07.2011
Beiträge: 386
Beitrag 7xCore Mitglied 17:57:17 03.02.2012   Titel:              Zitieren

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 ?

_________________
Mehr Spaß mit der Windows Konsole? -> http://www.coreengine.de.vu
cooky451
Mitglied

Benutzerprofil
Anmeldungsdatum: 16.10.2010
Beiträge: 4840
Beitrag cooky451 Mitglied 18:08:43 03.02.2012   Titel:              Zitieren

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.

_________________
Sie sind nicht berechtigt unrechtmäßige Kopien dieses Datenträgers zu erstellen.™


Zuletzt bearbeitet von cooky451 am 18:10:28 03.02.2012, insgesamt 1-mal bearbeitet
7xCore
Mitglied

Benutzerprofil
Anmeldungsdatum: 30.07.2011
Beiträge: 386
Beitrag 7xCore Mitglied 12:30:00 04.02.2012   Titel:              Zitieren

cooky451 schrieb:
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.

Stimm ich dir 100% zu :live:

_________________
Mehr Spaß mit der Windows Konsole? -> http://www.coreengine.de.vu
C/C++ Forum :: C++ (auch C++0x und C++11) ::  Nicht aufgelöstes externes Symbol...   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.