Problem mit Header!
-
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 dasconst
doch vergessen zu haben, denn in der Fehlermeldung enthält die Signatur des Konstruktors nur einstd::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 derstd::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 derstd::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é
-
Iljaronaldo schrieb:
Ja,da steht nix von beiden.Also weder person.cpp noch Person.h!
Dann füge die mal hinzu (glaube über Rechte Maustaste, hinzufügen)...
-
[quote="asc"]
Iljaronaldo schrieb:
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é
Ja,wie gesagt das mit Ordner habe ich schon geprüft gehabt also alle Dateien die bei dem Projekt Explorer stehen sind ort und noch dazu die person.h und person.cpp
Das mit Initialisierungslisten würde ich persönlich so machen:
Person(.......): name(n), vorname(v) {}
-
asc schrieb:
Iljaronaldo schrieb:
Ja,da steht nix von beiden.Also weder person.cpp noch Person.h!
Dann füge die mal hinzu (glaube über Rechte Maustaste, hinzufügen)...
ja,das habe ich schon probiert über rechte-maustaste gehts nciht benso wie das mit dem ziehen aber ich suche grad noch weiter.
Ok,ich habe es gesachafft nun kommen noch mehr Fehler:------ Erstellen gestartet: Projekt: Header, Konfiguration: Debug Win32 ------ Kompilieren... Header.cpp Person.cpp c:\dokumente und einstellungen\$ilja$\eigene dateien\eigene musik\c++ codes\header\header\person.cpp(1) : warning C4627: "#include "Person.h"": Wird bei der Suche nach Verwendung des vorkompilierten Headers übersprungen. "stdafx.h" Direktive hinzufügen oder vorkompilierten Header erneut erstellen c:\dokumente und einstellungen\$ilja$\eigene dateien\eigene musik\c++ codes\header\header\person.cpp(4) : error C2871: 'std': Es ist kein Namespace mit diesem Namen vorhanden c:\dokumente und einstellungen\$ilja$\eigene dateien\eigene musik\c++ codes\header\header\person.cpp(6) : error C2653: 'Person': Keine Klasse oder Namespace c:\dokumente und einstellungen\$ilja$\eigene dateien\eigene musik\c++ codes\header\header\person.cpp(6) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt. c:\dokumente und einstellungen\$ilja$\eigene dateien\eigene musik\c++ codes\header\header\person.cpp(8) : error C2550: 'Person': Initialisierungslisten für Konstruktoren dürfen nur in Konstruktordefinition stehen c:\dokumente und einstellungen\$ilja$\eigene dateien\eigene musik\c++ codes\header\header\person.cpp(8) : warning C4508: 'Person': Funktion sollte einen Wert zurückgeben; Ergebnistyp 'void' angenommen c:\dokumente und einstellungen\$ilja$\eigene dateien\eigene musik\c++ codes\header\header\person.cpp(9) : error C2653: 'Person': Keine Klasse oder Namespace c:\dokumente und einstellungen\$ilja$\eigene dateien\eigene musik\c++ codes\header\header\person.cpp(9) : error C2065: 'string': nichtdeklarierter Bezeichner c:\dokumente und einstellungen\$ilja$\eigene dateien\eigene musik\c++ codes\header\header\person.cpp(9) : error C2143: Syntaxfehler: Es fehlt ')' vor 'const' c:\dokumente und einstellungen\$ilja$\eigene dateien\eigene musik\c++ codes\header\header\person.cpp(9) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt. c:\dokumente und einstellungen\$ilja$\eigene dateien\eigene musik\c++ codes\header\header\person.cpp(9) : error C2365: "Person": Erneute Definition; vorherige Definition war "Funktion". c:\dokumente und einstellungen\$ilja$\eigene dateien\eigene musik\c++ codes\header\header\person.cpp(6): Siehe Deklaration von 'Person' c:\dokumente und einstellungen\$ilja$\eigene dateien\eigene musik\c++ codes\header\header\person.cpp(9) : error C2550: 'void __cdecl `dynamic initializer for 'Person''(void)': Initialisierungslisten für Konstruktoren dürfen nur in Konstruktordefinition stehen c:\dokumente und einstellungen\$ilja$\eigene dateien\eigene musik\c++ codes\header\header\person.cpp(9) : error C2059: Syntaxfehler: ')' c:\dokumente und einstellungen\$ilja$\eigene dateien\eigene musik\c++ codes\header\header\person.cpp(10) : error C2065: 'name': nichtdeklarierter Bezeichner c:\dokumente und einstellungen\$ilja$\eigene dateien\eigene musik\c++ codes\header\header\person.cpp(11) : error C2448: 'name': Funktionsstil-Initialisierung scheint eine Funktionsdefinition zu sein Code wird generiert... Das Buildprotokoll wurde unter "file://c:\Dokumente und Einstellungen\$Ilja$\Eigene Dateien\Eigene Musik\C++ Codes\Header\Header\Debug\BuildLog.htm" gespeichert. Header - 13 Fehler, 2 Warnung(en) ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
Ok,ich habe den fehler undzwar habe ich unter Person.cpp erstmal #inlcude "Person.h" und dann erst #include <stdafx.h> gemacht und wdas musste genau andersrum sein.
-
Iljaronaldo schrieb:
Das mit Initialisierungslisten würde ich persönlich so machen:
Viel Spaß wenn deine Parameterliste mal länger wird. Du scrollst gerne horizontal, oder?
cu André
-
Iljaronaldo schrieb:
ja,das habe ich schon probiert über rechte-maustaste gehts nciht benso wie das mit dem ziehen aber ich suche grad noch weiter.
Ok,ich habe es gesachafft nun kommen noch mehr Fehler:Logisch. Auf die stdafx.h & Ähnliches sind wir aber schon früher eingegangen.
-
asc schrieb:
Iljaronaldo schrieb:
Das mit Initialisierungslisten würde ich persönlich so machen:
Viel Spaß wenn deine Parameterliste mal länger wird. Du scrollst gerne horizontal, oder?
cu André
ich könnte das auch so machen
Person():name(n),v..(..),sgs(...), name(..),.................
-
Wieso frags du eigentlich?Jeder hat doch eigenen Stil und macht so wie es ihm gefällt.