• Aktualisierte Forenregeln

    Eine kleine Änderung hat es im Bereich Forenregeln unter Abschnitt 2 gegeben, wo wir nun explizit darauf verweisen, dass Forenkommentare in unserer Heftrubrik Leserbriefe landen können.

    Forenregeln


    Vielen Dank

C++ Problem (DevC++ Compiler)

servernet

Anwärter/in
Mitglied seit
13.02.2005
Beiträge
22
Reaktionspunkte
0
Aktuell bin ich dabei C++ zu lernen, es gibt nur ein Problem: einfache .h datein werden nicht inkludiert, zumindest gibt der Compiler etliche [Linker Error] Undefined reference- Fehler aus. Hier mal das ziemlich einfache Programm:

1.header-datei:
//bsp10051.h

#ifndef _FLAECHE_
#define _FLAECHE_

class Flaeche {
public:
Flaeche(char * n);
~Flaeche();
void getFarbe() const;
private:
char farbe[11];
};

#endif

2.header-datei:
//bsp10052.h

#ifndef _KREIS_
#define _KREIS_
#include "bsp10051.h"

class Kreis : public Flaeche {
public:
Kreis(char *n, float a);
~Kreis();
float berechneFlaeche() const;
private:
float radius;
};

#endif

3.header-datei:
// bsp10053.h


#ifndef _RING_
#define _RING_
#include "bsp10052.h"


class Ring : public Kreis {
public:
Ring(char *n, float aussen, float innen);
~Ring();
float berechneFlaeche() const;
private:
float innenradius;
};

#endif

Die Hauptdatei:

//test5253.cpp
#include <cstdlib>
#include <iostream>
using namespace std;
#include "bsp10052.h"
#include "bsp10053.h"

int main(int argc, char *argv[])
{
// blauer Kreis r=5
Kreis blau_kreis("BLAU",5);
// gelber Ring ra=10, ri=3
Ring gelb_ring("GELB",10,3);
blau_kreis.getFarbe();
cout << "\\n" << blau_kreis.berechneFlaeche();
gelb_ring.getFarbe();
cout << "\\nRingflaeche: "
<< gelb_ring.berechneFlaeche()
<< "\\nFlaeche des Grundkreises: "
<< gelb_ring.Kreis::berechneFlaeche();
system("PAUSE");
return EXIT_SUCCESS;
}

Alle Datein befinden sich in einem gesonderten Ordner, außerdem habe ich ein Projekt angelegt und die Dateien zum Projekt hinzugefügt. Die jeweiligen #include-Befehle in den .h-Datein wurden von mir zu Testzwecken bereits entfernt und dafür in der Hauptdatei (.cpp) alle drei header-Datein inkludiert, was aber auch nichts brachte.
Der erste Fehler, den der Compiler anzeigt, ist dieser:
[Linker error] undefined reference to `Kreis::Kreis(char*, float)'
Es folgen insgesamt dann weitere 9 Fehler in dergleichen Art und Weise. Das Programm sollte funktionieren, denn es ist aus einem C++ Buch entnommen. Ich weiß nicht mehr weiter, benötige Hilfe....

Danke schonmal, greetz servernet
 
hi

ich kenn das so das wenn man c header in c++ nutzen möchte sollte man das
".h" am ende der header entfernen und am anfang ein "c" einbauen so wird aus

#include <math.h> zu=> #include <cmath>
ausserdem muss die header meines wissens in <........> den zeichen stehen

ich weiß nicht ob das was hilft aber probier mal
 
nein so funktioniert das nicht. es handelt sich ja nicht um standard header wo deine umformung meist zutrifft, sondern um eine eigens angelegte header datei.
 
Hallole,
was du da bekommst ist ein Linker-Fehler, das hat nichts damit zu tun, dass die Header -Dateien nicht includiert werden ! In deinen Headern sind die "Schablonen" der Klassen deklariert, aber wo bitte schön, sind die einzelnen Klassen DEFINIERT ?? Das heisst, du hast lediglich das Aussehen der Klassen bekannt gemacht, aber die einzelnen Methoden der Klassen nirgends definiert, oder anders gesagt: Wo ist die Implementierung der Methoden, also der Code der "etwas macht" ? Dein erster Linker-Fehler sagt dir, dass der Code des Konstruktors nicht gefunden werden konnte....
Hope this helps, FK4
 
master-of-U am 22.04.2006 14:17 schrieb:
hi

ich kenn das so das wenn man c header in c++ nutzen möchte sollte man das
".h" am ende der header entfernen und am anfang ein "c" einbauen so wird aus

#include <math.h> zu=> #include <cmath>
ausserdem muss die header meines wissens in <........> den zeichen stehen

ich weiß nicht ob das was hilft aber probier mal

Was ein Schwachsinn...


Kreis blau_kreis("BLAU",5);

Du müsstest noch irgendwo, am besten in dieselbe Header-Datei wie die Klasse oder als gesonderte *.cpp Datei, dessen Objektdatei der Linker dann verwenden wird, angeben, was eigentlich der Konstruktor bzw. jede Methode, die du aufrufst, machen soll, dazu reicht:

Kreis::Kreis(char* n, float a)
{
// ... irgendeine Aktion
}
 
Es gibt dort ein paar fehler!!!
ich studiere informatik und lerne dort sehr viel c++.

1. Zu den Funktionen die du deklariert hast fehlen die implementierungen.
Also:

Kreis(....){
//Sein Code
};

2. Du erbst die Klassen also Class Kreis : public egal. Dann mus du auch default konstuktoren anlegen.
Also

class kreis{
kreis();
kreis(para1, para2);
};

Die sind wichtig, weil die du die klasse erbst unddiese klassen initialisieren auch die ererbeten kalssen und suchen dort den default jostruktor.

also
 
Hotmenwolf am 25.05.2006 22:09 schrieb:
Es gibt dort ein paar fehler!!!
ich studiere informatik und lerne dort sehr viel c++.

1. Zu den Funktionen die du deklariert hast fehlen die implementierungen.
Also:

Kreis(....){
//Sein Code
};

2. Du erbst die Klassen also Class Kreis : public egal. Dann mus du auch default konstuktoren anlegen.
Also

class kreis{
kreis();
kreis(para1, para2);
};

Die sind wichtig, weil die du die klasse erbst unddiese klassen initialisieren auch die ererbeten kalssen und suchen dort den default jostruktor.

also

Das ist so nicht ganz korrekt.
Die Basisklasse muss keinen Default-Konstruktor haben. Wenn die Basisklasse keinen Default-Konstruktor hat, dann muss man hinter dem Konstuktor der Abgeleiteten Klasse den Konstruktor der Basisklasse notieren und seine Parameter übergeben.

z.B.

class Huibuh : public Kreis
{
private:
public:
Huibuh() : Kreis( 10, 10 );
Huibuh(int arg1, int arg2) : Kreis ( arg1, arg2 );
}

;)
 
Zurück