Klassen definieren in C++



  • Hallo zusammen,

    ich bin in der C++ Programmierung ein ziemlicher Anfänger und wahrscheinlich ist das, was ich hier beschreibe, nur ein dummer Anfängerfehler, aber ich verstehe einfach nicht, was ich Falsch mache:

    Die folgenden drei Dateien habe ich mehr oder weniger analog zu dem Beispiel in meinem C++-Buch erstellt: Es handelt sich um eine Header-Datei einer Klasse, eine Datei mit der Implementierung der Klasse und eine Datei mit der main-Methode, in der ein Objekt der Klasse erstellt wird:

    Datei "Ding.h":

    #ifndef DING_H
    #define DING_H
    
    class Ding{
    	public:
    
    		void setVar(int x);
    
    		int getVar() const;
    
    	private:
    	int a;
    };
    
    #endif
    

    Datei "Ding.cpp":

    #include "Ding.h"
    #include <iostream>
    using namespace std;
    
    void Ding::setVar(int x){
    	a = x;
    }
    
    int Ding::getVar() const {
    	return a;
    }
    

    Datei "Prog1.cpp":

    #include "Ding.h"
    #include <iostream>
    using namespace std;
    
    int main() {
    	cout << "Hallo!";
    	int c;
    	int o;
    	cin >> c;
    	Ding m;
    	m.setVar(1);
    	o = m.getVar();
    	cout << o;
    }
    

    Alle drei Dateien liegen im selben Ordner. Fehlerfrei kompilieren lässt sich allerdings nur die Header-Datei! Bei der Kompilierung von Prog1.cpp melder der Compiler:

    Prog1.cpp:(.text+0x40): undefined reference to Ding::setVar(int)' Prog1.cpp:(.text+0x4c): undefined reference toDing::getVar() const'
    [Error] ld returned 1 exit status

    Und bei der Kompilierung von Ding.cpp sagt er:

    In function main': undefined reference toWinMain'
    [Error] ld returned 1 exit status

    Was mache ich denn falsch? Ich würde mich sehr freuen, wenn ihr mir helfen könntet. Und außerdem wollte ich noch fragen (da ich das meinem Buch nicht so recht entnehmen konnte): Ist es eigentlich zwingend notwendig, bei Klassen die Deklaration und Implementierung und main-Methode auf diese Weise auf drei Dateien aufzuteilen? Habe auch versucht, die Klasse mit den implementierten Funktionen und darunter die main-Mathode in eine Datei zu setzen, das ergab aber auch einen Fehler.

    Viele Grüße,
    Daniel



  • Bei dir tritt kein Compilerfehler auf, sondern ein Linkerfehler.

    Du hast mindestens folgende Möglichkeiten:

    a) Kompiliere alle cpp-Dateien zusammen. Das ist insbesondere beim Testen von Kleinkram sinnvoll. Also rufe den Compiler auf mit <compiler-executable> <optionen> Prog1.cpp Ding.cpp

    b) Du kompilierst du Dateien einzeln. Bei gcc gibt es z.B. dazu die Option -c. Danach linkst du die Ergebnisse.

    c) Du nutzt irgendein Buildsystem wie z.B. cmake und lässt dieses die Probleme lösen.

    Problem2: WinMain:
    Diese Funktion ist Einstiegspunkt für graphische Windows-Programme. Wahrscheinlich musst du irgendwo auf "Konsolenanwendung" umstellen. (habe kein Windows - und wahrscheinlich hängt das auch noch irgendwie von deinem Compiler ab)



  • Hallo wob,

    vielen Dank für die Antwort! Es hat tatsächlich nur das Linken gefehlt: Ich habe (in Dev-C++) ein neues Projekt angelegt und dort die drei Dateien eingefügt, dann hat es funktioniert 🙂


Anmelden zum Antworten