Problem mit Header!



  • Hallo bin ganz neu hier und programmiere schon einige Zeit in C++.

    Nun mein Problem:
    ich will eine Klasse Person anlegen und deise dann als eine Headerdatei in das Hauptprogramm main einbinden.
    Hier sind erstmal die Codes.Hier ist person.h:

    #include "iostream"
    #include "string"
    using namespace std;
    
    class Person()
    {
    public:
          string name;
          Person();
          Person(string n);
    };
    

    Dann mal die person.cpp:

    #include "C:/Dokumente und Einstellungen/$Ilja$/Eigene Dateien/Visual Studio 2008/Projects/Header/person.h"
    
    Person::Person()
    {
        name = "";
    }
    Person::Person(string n)
    {
        name = n;
    }
    

    und hier die mian(wo eigentlich bis jetzt sich nciht sonderlich viel getan hat)!
    Main:

    // Header.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
    //
    
    #include "stdafx.h"
    #include "C:/Dokumente und Einstellungen/$Ilja$/Eigene Dateien/Visual Studio 2008/Projects/Header/person.h"
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    
        cin.get();
        cin.ignore();
        return 0;
    }
    

    Ich weiß nicht wo das Problem ist,der zeigt folgende fehler:

    Kompilieren...
    Header.cpp
    c:\dokumente und einstellungen\iljailja\eigene dateien\visual studio 2008\projects\header\person.h(5) : error C2059: Syntaxfehler: ')'
    c:\dokumente und einstellungen\iljailja\eigene dateien\visual studio 2008\projects\header\person.h(6) : error C2143: Syntaxfehler: Es fehlt ';' vor '{'
    c:\dokumente und einstellungen\iljailja\eigene dateien\visual studio 2008\projects\header\person.h(6) : error C2447: '{': Funktionsheader fehlt - Parameterliste im alten Stil?
    Das Buildprotokoll wurde unter "file://c:\Dokumente und Einstellungen\IljaIlja\Eigene Dateien\Eigene Musik\C++ Codes\Header\Header\Debug\BuildLog.htm" gespeichert.
    Header - 3 Fehler, 0 Warnung(en)
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========

    Falls ihr noch was braucht dann einfach sagen.
    Nur mla ne kurze Erklärung wie ich es mir vorgestellt hatte:
    ich lege eine person.h wo ich eine Klasse Person anlege und dort zwei Konstruktoren deklariere und einen string.
    Dann kommt die person.cpp dort einfach die Konstruktoren anpassen.
    Und in der main ist wohl alles selbsterklärend einfach die person.h einbnden und mit der Klasse arbeiten können.

    Hoffe auf schnelle Hilfe.



  • class Person // hier ohne Klammern
    {
    ...
    }
    


  • MiP schrieb:

    class Person // hier ohne Klammern
    {
    ...
    }
    

    ja,dummer fehler aber das problem ist aus welchem Grund auch immer es zeigt imer noch den gleichen Fehler an.



  • Ilja schrieb:

    ...

    Ich habe da ein paar allgemeine Anmerkungen...
    1. Benutze bitte die cpp-, nicht die PHP-Tags für die Codedarstellung
    2. #include "iostream" habe ich bislang noch nie gesehen, normalerweise verwendet man bei den Includes der Bibliothekspfade die eckigen Klammern (#include <iostream>).
    3. Man sollte using namespace nicht in Headern einsetzen (Das macht das Konzept der Namensräume unsinnig, da das using namespace damit global deklariert wird).
    4. Unnötige Kopien sind meinst nicht so gut. Bei Objekten verwendet man in der Regel eher "call by const-reference" statt "call by value".
    5. Kryptische Abkürzungen wie "n" für name halte ich immer für Unsinn.
    6. Für die Initialisierung sollte man die Initialisierungsliste, nicht den Konstruktorrumpf verwenden.
    7. Wenn du mit der stdafx.h arbeitst, musst du das in jedem Source machen, ich deaktiviere die Option grundsätzlich. Ich würde eher bei der Projekterstellung "Win32 Konsolenanwendung", "Leeres Projekt" und deaktivierte "vorkompilierte Header" verwenden...

    Zur Vereinfachung gehe ich davon aus das alle Header/Sourcen im gleichen Verzeichnis liegen (und ansonsten würde ich mit relativen Pfaden zum Projektverzeichnis arbeiten (z.B. "header/person.h")... Denn wehe du kopierst deinen Code mal an einen anderen Ort...). Wenn du noch immer die gleichen Fehler hast könnte dies nämlich an den Pfaden liegen...

    // person.h
    #include <iostream>
    #include <string>
    
    class Person
    {
    public:
          std::string name;
          Person();
          Person(std::string const & name);
    };
    
    // person.cpp
    #include "person.h"
    
    using namespace std; // <- Hinter den Includes in der cpp meist unproblematisch
    
    Person::Person()
    :   name("") // Initialisierungsliste
    {
    }
    
    Person::Person(string const & name)
    :   name(name)
    {
        // Im Konstruktorrumpf bei gleichen Bezeichnernamen
        // this->name = name;
    }
    
    // Header.cpp
    #include <iostream>
    #include "person.h"
    
    int main()
    {
        cin.get();
        cin.ignore();
        // return 0; Ist unnötig, da bei int main explizit return 0 am Ende
        //   aufgerufen wird
    }
    


  • 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.


Anmelden zum Antworten