Klassendeklaration in Header, Funktionen in cpp-Datei - wie bekomm ich das zusammen?
-
Gibt es nur ein TischBein oder gibt es mehrere TischBeine? Da mußt Du Dich entscheiden.

Außerdem fehlt der Konstruktor in der Klassendefinition.
-
Ja das war nur ein schnell ausgedachtes, sehr dummes und vom Code her nicht wirklich richtiges Beispiel
es sei mir verziehen 
Also,
folgendes:
Meine Klasse und der Header befinden sich momentan in einem Testprojekt (muss ja schließlich schauen ob die Klasse auch geht). Ich habe also 1 Projekt mit 3 Dateien offen. Ich gehe auf den Reiter "Tisch.cpp" (wo wir wieder beim dummen Beispiel wären) und sagen "build"->selber Error.
Dann gehe ich auf den Reiter "main.cpp" und sagen "Build and Run"->selber Error.Ich nutze CodeBlocks, falls das damit etwas zu tun hat.
-
Geht es um obigen Source Code? Wenn nicht solltest Du uns den Abschnitt zeigen der den Fehler verursacht. Außerdem wäre die vollständige Fehlermeldung auch nicht schlecht...
-
Es geht bei beiden nicht. Hab gerade die Tisch-Klasse mal rüberkopiert (und neues Projekt) aber keine Änderung - Fehler ist auch dabei derselbe
Gesamte Fehldermeldung ist bei "Build and Run" bzw. "build" so:
obj\Debug\main.o:: In function `main': D:/Programmieren/C++/Programme/test/main.cpp:6: undefined reference to `Tisch::Tisch()' : D:\Programmieren\C++\Programme\test\main.cpp:7: undefined reference to `Tisch::getAnzahlTischBeine()' : D:\Programmieren\C++\Programme\test\main.cpp:8: undefined reference to `Tisch::~Tisch()' : D:\Programmieren\C++\Programme\test\main.cpp:8: undefined reference to `Tisch::~Tisch()' :: === Build finished: 3 errors, 0 warnings ===Main sieht so aus:
#include "Tisch.h" #include <iostream> int main() { Tisch tisch; std :: cout << tisch.getAnzahlTischBeine() << std :: endl; return 0; }Header und Tisch.cpp sind natürlich im Programmordner vorhanden

-
Hast du den destructor und getTischbein... auch (wie bei "muffelmolch") implementiert?
-
Ich hab den Code eins zu eins kopiert und in die entsprechenden drei Dateien aufgeteilt...
-
Aber (bitte nich schlagen wenns falsch ist) der konstruktor wird ja auch ohne probleme aufgerufen, also kanns ja eigentlich nur an der implementation liegen.
Aber lösch doch einfach mal die temporären dateien...
-
Der De- bzw. Konstruktor kann auch vom compiler selber erstellt werden, es ist nicht immer notwendig einen selber zu schreiben. Vielleicht mischt sich CodeBlocks da ein. Komisch ist nur, dass dann kein Destruktor von CodeBlocks erstellt wird.
Was ich komisch finde ist die Tatsache, wie mein Programm überhaupt an die Funktionen kommen soll. Hier mal ne "Grafik" wie der Präprozessor vorgehen müsste (wenns falsch ist bitte sagen :D)main.cpp -> include -> Tisch.h => Funktionsnamen bekannt => Programm wird ausgeführt => griff ins leere, da Funktion nicht gefunden wurde
Tisch.cpp -> include -> Tisch.h => Funktionsnamen bekannt => Funktionen werden zugeordnet
Nur wie komm ich nun vom include auf die Tisch.cpp, also die Datei, die die eigentlichen Funktionen enthält? Bisher kenne ich ja nur die Funktionsnamen (und ihr Verhältnis zueinander) aber nicht die eigentlichen Funktionen.
Edit: Hab das Projekt mal ganz geschlossen, neu geöffnet und kompiliert - ohne Erfolg
-
In Deinem ersten Posting hast Du den Konstruktor in der Cpp aber nicht im Header gehabt. Wenn der Kompiler also den Konstruktor selbst erstellt (weil keiner im Header) könnte er ziemlich sauer werden wenn er feststellt das er sich die arbeit hätte sparen können weil in der cpp doch einer ist

Der Präprozessor fügt nur den Quellcode zusammen. Da wird kein Programm ausgeführt. Der Compiler führt auch kein Programm aus, er kompiliert NUR die vom Preprozessor bearbeiteten cpp Dateien. Der Linker klatscht dann die kompilierten cpp Dateien zu einer Exe zusammen. Jetzt sind die Funktionen alle da. Nun erst startet der Debugger von main() aus.
Hier ist mein Versuch:
#ifndef TISCH_H #define TISCH_H class Tisch { public: Tisch(); ~Tisch(); int GetAnzahlTischBeine(); private: int m_iAnzahlTischBeine; }; #endif //TISCH_H //----- Tisch.cpp ----- #include "Tisch.h" Tisch::Tisch() { } Tisch::~Tisch() { } int Tisch::GetAnzahlTischBeine() { return m_iAnzahlTischBeine; } //----- main.cpp ----- #include "Tisch.h" int main() { Tisch oTisch; oTisch.GetAnzahlTischBeine(); return 0; }
-
Ich habs nun gefunden. Klar es war ein Linker Fehler und zwar wurde die Tisch.cpp nicht gefunden (wuhhaa).
Hab nun im Projekt->Eigenschaften->"Build": "Build Target Files" die .cpp und .h Dateien ausgewählt und nun gehts.
Scheinbar war das Problem, dass beim kompilieren (egal über welche Datei ich es gemacht habe) das Projekt kompiliert wurde. Da die Einstellungen des Projektes aber nur die main.cpp vorsahen zu kompilieren konnte das ja nicht richtig gehen
Also weniger ein Fehler von uns bzw. C++ sonder ehr ein Fehler bzw. eine falsche Verwendung von CodeBlocks.
-
na, dann hääte der fehler ja nach meinem ersten post geklärt sein müssen!
zitat:
du musst die Tisch.cpp ebenfalls kompilieren und linken.
