Problem mit Header!



  • Ok,danke für deine Tipps das mit Initialisierungslisten wäre wohl eher besser aber das mit "" beim Includen,ich habe früher immer mit Dev-Cpp gearbeitet und dort war es ja auch mit <> aber dann bin ich zu Visual Studio umgestiegen und dachte einfach mal das muss dort so sein.



  • Iljaronaldo
    Ob in Dev-C++ oder in MSVS-C++ ist egal, Libs werden per <> und Header per "" inkludiert.



  • Ok,ich habe es genau so verbessert wie du es gesagt hast und nun kommt folgender Fehler:
    **Header.cpp
    Verknüpfen...
    Header.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: __thiscall Person::Person(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (??0Person@@QAE@V?basic_string@DU?basic\_string@DU?char_traits@D@std@@V?allocator@D@2@@std@@@Z)" in Funktion "\_wmain". C:\\Dokumente und Einstellungen\\Ilja\\Eigene Dateien\\Eigene Musik\\C++ Codes\\Header\\Debug\\Header.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise. Das Buildprotokoll wurde unter "file://c:\\Dokumente und Einstellungen\\Ilja$\Eigene Dateien\Eigene Musik\C++ Codes\Header\Header\Debug\BuildLog.htm" gespeichert.
    Header - 2 Fehler, 0 Warnung(en)
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
    **

    Ich glaube das liegt irgednwie an den Dateien also z.B. wenn ich Person.h speichern will da drücke ich auf speichern dann kommt Fenster auf ich schreibe ganz normal person.h und dann sagt er das es so eine Datei schon breits gibt und ob ich sie ersetzen möchte,obwohl ich ganz normalen ordner erstellt habe wo nur die Datein für das Projekt liegen.

    Also ich habe halt nur ne zeile in der main eingefügt:
    Person ilja("Ilja");
    Es soll sich halt den passenden Kontruktor aussuchen und aufrufen.



  • way schrieb:

    Iljaronaldo
    Ob in Dev-C++ oder in MSVS-C++ ist egal, Libs werden per <> und Header per "" inkludiert.

    Nicht ganz. Bibliotheken werden meistens gelinkt. Selbst wenn du Bibliothek im weiten Sinne von Framework meinst, kann man das nicht so sagen. Dateien, die mit <> eingebunden werden, werden nur in den angegebenen Pfaden gesucht, bei "" sucht der Präprozessor noch im Projektverzeichnis.

    Iljaronaldo schrieb:

    Ok,ich habe es genau so verbessert wie du es gesagt hast und nun kommt folgender Fehler:

    Du scheinst den Person -Konstruktor nur deklariert, aber nicht definiert zu haben. Schau, dass seine Definition bekannt ist.



  • Nexus schrieb:

    Iljaronaldo schrieb:

    Ok,ich habe es genau so verbessert wie du es gesagt hast und nun kommt folgender Fehler:

    Du scheinst den Person -Konstruktor nur deklariert, aber nicht definiert zu haben. Schau, dass seine Definition bekannt ist.

    Vermutlich 1:1 übernommen, habe einen Fehler:

    // Im Header            >&< vergessen...
    Person(std::string const & name);
    


  • asc schrieb:

    Nexus schrieb:

    Iljaronaldo schrieb:

    Ok,ich habe es genau so verbessert wie du es gesagt hast und nun kommt folgender Fehler:

    Du scheinst den Person -Konstruktor nur deklariert, aber nicht definiert zu haben. Schau, dass seine Definition bekannt ist.

    Vermutlich 1:1 übernommen, habe einen Fehler:

    // Im Header            >&< vergessen...
    Person(std::string const & name);
    

    Nein,da war cih schon so schlau es selbst einzufügen, kommt trotzdem der Fehler.Irgedwie habe ich das Geühl, dass mit dem Kompiler irgendwas nciht stimmt da er immer Probleme macht obwohl der Code meiner Meiung nach korrekt ist.
    ich dachte erstmal ich habe irgendwie bei dem Dateipfad fehler aber nochmal alles überprüft stimmt alles und sonst hätte er es ja angezeigt das er die person.h nicht gefunden hatte.



  • Iljaronaldo schrieb:

    Irgedwie habe ich das Geühl, dass mit dem Kompiler irgendwas nciht stimmt da er immer Probleme macht obwohl der Code meiner Meiung nach korrekt ist.

    Sicher, der Compiler ist schuld. :p

    Nein, hast du die Dateien richtig eingebunden und stimmt die Signatur der Konstruktordeklaration exakt mit der der Definition überein?

    Zeig ansonsten nochmals etwas Code...



  • Iljaronaldo schrieb:

    Irgedwie habe ich das Geühl, dass mit dem Kompiler irgendwas nciht stimmt da er immer Probleme macht obwohl der Code meiner Meiung nach korrekt ist.

    Das bezweifel ich wiederum, es sei den deine Installation ist defekt (wovon ich nicht ausgehe). Unter Windows ist der MSVC zumindest derzeit ungeschlagen (oder gehört definitiv zu den Besten).



  • Hallo,also ich habe jetzt noch was gemerkt undzwar ich hatte in der mein eine neue person angelegt wenn ich die zeile lösche dann geht alles aber sobald ich irgednwas einfüge wie z.B. Person i("Name"); aber beim einfügen von Person i; kommt kein Fehler.Der Fehler:

    Kompilieren...
    Header.cpp
    Verknüpfen...
    Header.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: __thiscall Person::Person(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (??0Person@@QAE@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)" in Funktion "_wmain".
    C:\Dokumente und Einstellungen\$Ilja$\Eigene Dateien\Eigene Musik\C++ Codes\Header\Debug\Header.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise.
    Das Buildprotokoll wurde unter "file://c:\Dokumente und Einstellungen\$Ilja$\Eigene Dateien\Eigene Musik\C++ Codes\Header\Header\Debug\BuildLog.htm" gespeichert.
    Header - 2 Fehler, 0 Warnung(en)
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
    


  • Das rührt daher, dass Funktionen nur definiert sein müssen, wenn sie aufgerufen weden.

    Du scheinst aber das & und das const doch vergessen zu haben, denn in der Fehlermeldung enthält die Signatur des Konstruktors nur ein std::string als Parameter...

    class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >  // <- hier müsste ein "const &" stehen
    

    Ich hab ja gesagt, du die Deklaration muss exakt mit der Definition übereinstimmen (Rückgabewert und Signatur). Sonst wird es nie linken...



  • Ok,ich poste mal ochmal jetzt meien aktuellen Code:

    Person.h:

    #include <iostream>
    #include <string>
    
    class Person
    {
    public:
    	std::string name;
    	Person(void);
    	Person(std::string const & name);
    
    };
    

    Dann die Person.cpp:

    #include "Person.h"
    
    using namespace std;
    
    Person::Person(void):
    name("")
    {}
    Person::Person(string const & name):
    name(name)
    {}
    

    Und die main also hier die Header.cpp:

    // Header.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
    //
    
    #include <stdafx.h>
    #include <iostream>
    #include "Person.h"
    
    using namespace std;
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	Person ilja("Ilja");
    	cin.get();
    	cin.ignore();
    }
    

    Ich habe es genau so übernommen wie es gesagt wurde.Und das & ist doch da.

    Edit: Und was bedeutet das eingentlich const & name,dass die Speicherandresse konstant(also nicht veränderbar) oder der Inhalt?



  • Hast du Person.cpp mal neukompiliert? Fehlt da nicht ein #include "stdafx.h" ?

    Das const & steht für eine Const-Referenz. Es wird also eine Referenz übergeben, deren referenziertes Objekt (hier der std::string ) nicht von der Funktion verändert werden darf.

    Kompilier am besten die Projektmappe mal neu. Falls du vorkompilierte Header aktiviert hast, musst du in jeder CPP-Datei die "stdafx.h" einbinden.



  • Nexus schrieb:

    Hast du Person.cpp mal neukompiliert? Fehlt da nicht ein #include "stdafx.h" ?

    Das const & steht für eine Const-Referenz. Es wird also eine Referenz übergeben, deren referenziertes Objekt (hier der std::string ) nicht von der Funktion verändert werden darf.

    Kompilier am besten die Projektmappe mal neu. Falls du vorkompilierte Header aktiviert hast, musst du in jeder CPP-Datei die "stdafx.h" einbinden.

    Nein,ich denke eher nicht das mit person.cpp und stdafx aber habe trotzdem mal eingefügt hat nix gebracht.Und wie kann ich unter Visual Studio eigentlich einzelne Dateien Kompilieren,wei wie gesagt bin noch nicht lange auf Vidual Studio und habe noch nnie mit mehreren Dateien gearbeitet.



  • Du kannst einfach unter Projekt -> Projektmappe neu erstellen alles neu erstellen. Möglicherweise beinhaltet nämlich die Person.obj noch eine falsche Definition vom Konstruktor.



  • Nexus schrieb:

    Du kannst einfach unter Projekt -> Projektmappe neu erstellen alles neu erstellen. Möglicherweise beinhaltet nämlich die Person.obj noch eine falsche Definition vom Konstruktor.

    Ok,habe ich gemacht hier nochmal der gleiche Fehler:

    ------ Neues Erstellen gestartet: Projekt: Header, Konfiguration: Debug Win32 ------
    Die Zwischen- und Ausgabedateien für das Projekt "Header" mit der Konfiguration "Debug|Win32" werden gelöscht.
    Kompilieren...
    stdafx.cpp
    Kompilieren...
    Header.cpp
    Manifest in Ressourcen wird kompiliert...
    Microsoft (R) Windows (R) Resource Compiler Version 6.1.6723.1
    Copyright (C) Microsoft Corporation.  All rights reserved.
    Verknüpfen...
    Header.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: __thiscall Person::Person(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (??0Person@@QAE@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)" in Funktion "_wmain".
    C:\Dokumente und Einstellungen\$Ilja$\Eigene Dateien\Eigene Musik\C++ Codes\Header\Debug\Header.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise.
    Das Buildprotokoll wurde unter "file://c:\Dokumente und Einstellungen\$Ilja$\Eigene Dateien\Eigene Musik\C++ Codes\Header\Header\Debug\BuildLog.htm" gespeichert.
    Header - 2 Fehler, 0 Warnung(en)
    ========== Alles neu erstellen: 0 erfolgreich, Fehler bei 1, 0 übersprungen ==========
    

    ich weiß das es irgednwie auf das const & zeigt aber ihr seht doch selbst,ich habe es dort stehen.



  • Jetzt ist wenigstens schon mal ein std::string const& im Linkerfehler.

    Aber Person.cpp wurde ja gar nicht kompiliert? Gehört die Datei zum Projekt? Veränder dort mal was (irgendwo ein Leerzeichen schreiben reicht), dann wird sie neu kompiliert.



  • Nexus schrieb:

    Jetzt ist wenigstens schon mal ein std::string const& im Linkerfehler.

    Aber Person.cpp wurde ja gar nicht kompiliert? Gehört die Datei zum Projekt? Veränder dort mal was (irgendwo ein Leerzeichen schreiben reicht), dann wird sie neu kompiliert.

    Ok,habe ich gemacht paar Leerzeichen eingefügt und die Initialisierungsliste bischen verschoben.Aber immer noch der gleiche Fehler.Und ich habe eben überprüft die Person.cpp liegt im gliechen Ordner wie Person.h und Header.cpp!



  • Aber gehört sie auch zum Projekt? Es gibt so ein Menü "Projektmappen-Explorer" (üblicherweise links in der IDE). Dort siehst du die Dateien, die zum Projekt gehören.



  • Nexus schrieb:

    Aber gehört sie auch zum Projekt? Es gibt so ein Menü "Projektmappen-Explorer" (üblicherweise links in der IDE). Dort siehst du die Dateien, die zum Projekt gehören.

    Ja,da steht nix von beiden.Also weder person.cpp noch Person.h!



  • Iljaronaldo schrieb:

    Aber immer noch der gleiche Fehler.Und ich habe eben überprüft die Person.cpp liegt im gliechen Ordner wie Person.h und Header.cpp!

    Und sind die Dateien im Ordner IDENTISCH mit denen im Editor? (Nicht das hier zwei Pfade durcheinander geraten sind)...

    Davon abgesehen: Unabhängig davon welchen Einrückstil etc. du verwendest, würde ich dennoch zumindestens die beiden Konstruktoren in deiner cpp-Datei mit einer Leerzeile voneinander trennen (Wenn du längere Sourcedateien hast, ist sonst das Lesen etwas schwer...).

    Und deinen Einrückstil von der Initialisierungsliste will ich zumindestens hinterfragen: Was ist wenn du mehrere Werte in der Initialisierungsliste hast, willst du das dann Optisch wirklich so lassen?

    cu André


Anmelden zum Antworten