Blick die Fehlermeldung nicht

Hallo ich habe eine Übungsaufgabe zu erledigen und wollte mich der Schrittweise nähern, weis jetzt aber nicht ob der Fehler von einem falschen Schritt herrührt oder davon das der Code einfach nur unvollständig ist.

Eigentlich denke ich die Materie gut verstanden zu haben.

Ich bekomme u.a. folgenden Fehler zu dem Code unten.
Ich habe eigentlich erwartet das mir der Konstruktor „Hallo“ schreibt.

18 E:_schublade\BUERO_ANW_Lohn_Transl_Print_Text\Studium\Informatik 1\Alle_Loesungen_zu_den_Aufgabenblaettern\Blatt_11\main.cpp
instantiated from `DoubleLinkedList’

#include 
#include 

using namespace std;
// class und typename ist gleichwertig und historisch bedingt.
// Man tendiert zu typename
template 
class DoubleLinkedList{
 public :
 DoubleLinkedList ( ) ;
 ~DoubleLinkedList ( ) ;
 bool isEmpty ( ) ;
 void insert (JEDER\_TYP item ) ;
 bool search (JEDER\_TYP item ) ;
 bool remove (JEDER\_TYP item ) ;
 void print ( ) ;
 private :
 class Element{
 public :
 JEDER\_TYP item ;
 Element next ;
 Element prev ;
 Element ( ) { next = NULL ; prev = NULL; }
 ~Element ( ) { }
 };
 int numElements ;
 Element head ;
};

template 
 DoubleLinkedList::smiley:oubleLinkedList () {
 // Implimitierung des Konstruktors
 cout a;
 system("PAUSE"); return 0;
}

Gruß aus Heidelberg
Sebasitan

Hallo,

Ich bekomme u.a. folgenden Fehler zu dem Code unten.
Ich habe eigentlich erwartet das mir der Konstruktor „Hallo“
schreibt.

18
E:_schublade\BUERO_ANW_Lohn_Transl_Print_Text\Studium\Informatik
1\Alle_Loesungen_zu_den_Aufgabenblaettern\Blatt_11\main.cpp
instantiated from `DoubleLinkedList’

Ich bekomme bei mir andere Fehlermeldungen (gcc), habe aber etwas gefunden:

#include
#include

besser: '#include

using namespace std;
// class und typename ist gleichwertig und historisch bedingt.
// Man tendiert zu typename
template
class DoubleLinkedList{
public :
DoubleLinkedList ( ) ;
~DoubleLinkedList ( ) ;

Hier fehlt die Definition vom Destruktor: ‚~DoubleLinkedList ( ) {}‘

bool isEmpty ( ) ;
void insert (JEDER_TYP item ) ;
bool search (JEDER_TYP item ) ;
bool remove (JEDER_TYP item ) ;
void print ( ) ;
private :
class Element{
public :
JEDER_TYP item ;
Element next ;
Element prev ;

Du kannst hier nicht ‚Element‘ nutzen, da die Klasse noch nicht definiert ist. Ausserdem haettest Du eine Rekursion, da jedes ‚Element‘ zwei ‚Element‘ enthaelt, diese beiden auch wieder je zwei usw. Wahrscheinlich willst Du einen Zeiger auf das naechste und das vorherige: ‚Element* prev‘

Element ( ) { next = NULL ; prev = NULL; }
~Element ( ) { }
};
int numElements ;
Element head ;
};

template

besser: Einheitliche Nutzung 'template ’

DoubleLinkedList::smiley:oubleLinkedList () {
// Implimitierung des Konstruktors
cout a;
system(„PAUSE“); return 0;
}

So, nun funktioniert es bei mir (also ohne ‚system(„PAUSE“)‘, da nicht DOS).

Gruss
Diether

Danke :smile: jetzt läuft es bei mir auch.
Nach dem einfügen von {} neben dem Instraktor war der, wie du sagst, definiert.
Dann hat nur noch ein * gefehlt (Zeiger war nicht recht angegeben).

Sagt man dann eigentlich mein Destruktor ist jetzt definiert aber nicht implementiert ?

Ich glaube nicht. Ein {} ist doch auch schon eine Implementierung ?
Sagt man so ?

Interessant finde ich auch das z.B. „bool isEmpty ( ) ;“
ja nicht implementiert ist und trotzdem keine Fehlermeldung kommt.
Liegt wohl daran das Destruktor aufgerufen wird (automatisch) und isEmpty nur explizit, was ich bisher ja nicht getan hab ?

Ich hätte den Desturktor also auch so definieren - aber hier sagt man dann aber doch implementieren (?) - können:
template
DoubleLinkedList::~DoubleLinkedList () {
// Implimitierung des Konstruktors
cout

Testen von Destruktor unter DOS
Hallo, erst die Ausgabe vom Destuktor
nicht gesehen war aber klar.

Hatte sowas:

template
DoubleLinkedList::~DoubleLinkedList () {
cout a;
cout
DoubleLinkedList::~DoubleLinkedList () {
cout

Neues Teilproblem bitte noch mal helfen - danke
Hallo zusammen ich bin mit dem bisschen Quelltext immernoch nicht ganz fertig geworden.
Für Euch hier sicher gleich wieder eine einfache Frage.

Die Implementierung meines Konstruktors klappt wunderbar,
aber wenn ich auf die (fast) gleiche Weise die Funktio
insert implementieren will bekomme ich den Fehler:

36 main.cpp
ISO C++ forbids declaration of `insert’ with no type

Weis nicht weiter, wäre dankbar für Tipp !

template 
class DoubleLinkedList{
 public :
 DoubleLinkedList ( ) ;
 ~DoubleLinkedList ( ) ;
 bool isEmpty ( ) ;
 void insert (JEDER\_TYP \* item ) ;
 bool search (JEDER\_TYP \* item ) ;
 bool remove (JEDER\_TYP \* item ) ;
 void print ( ) ;
 private :
 class Element{
 public :
 JEDER\_TYP item ;
 Element \* next ;

......
template 
 DoubleLinkedList::insert ( JEDER\_TYP \* item ) {
 cout 
 DoubleLinkedList::smiley:oubleLinkedList () {
 cout 

Gruß aus Heidelberg Sebastian

Habs gefunden nach fast einer Stunde :open_mouth: :wink:
Hat ein void gefehlt als Rückgabetyp bei der implementierung.
War ja eigentlich gar nicht so schwehr… wenn man nicht an der falschen Stelle sucht… naja mit der Zeit bekomme ich noch ein Gespühr für C++ Fehlerchen.

So stimmts:
template
void DoubleLinkedList::insert ( JEDER_TYP * item ) {
cout

Sagt man dann eigentlich mein Destruktor ist jetzt definiert
aber nicht implementiert ?

Nein, es heisst ‚deklariert‘ und ‚definiert‘. ‚Deklariert‘ ist etwas, von dem Du angibst, dass es so ein Objekt gibt (also z.B. ‚bool isEmpty();‘). Deklarationen kannst Du in Deinem Programm so viele angeben, wie Du willst (nichts anderes machst Du, wenn Du die Bibliotheksdateien einbindest, da stehen jede Menge Deklarationen drin).
Bei einer Definition wird das Objekt (z.B. die Funktion) erst erstellt. Eine Definition ist immer dann noetig, wenn Du das Objekt auch nutzt (also die Funktion aufrufst). Die darf uebrigens beim Linken immer nur einmal auftreten.

Ich glaube nicht. Ein {} ist doch auch schon eine
Implementierung ?

Das ist eine Definition, in der Funktion passiert halt nichts.

Interessant finde ich auch das z.B. „bool isEmpty ( ) ;“
ja nicht implementiert ist und trotzdem keine Fehlermeldung
kommt.
Liegt wohl daran das Destruktor aufgerufen wird (automatisch)
und isEmpty nur explizit, was ich bisher ja nicht getan hab ?

Genau. Der Destruktor wird aufgerufen, deshalb muss er definiert sein, ‚isEmpty()‘ wird nicht aufgerufen, also muss die Funktion nicht definiert sein.
Programmiertechnisch ist das gut, da man schon mal alle Methoden (Funktionen) der Klasse deklarieren kann (also im Header hinschreiben), definieren (also richtig programmieren) muss man sie erst, wenn man die Methoden nutzt.

Ich hätte den Desturktor also auch so definieren - aber hier
sagt man dann aber doch implementieren (?) - können:
template
DoubleLinkedList::~DoubleLinkedList () {
// Implimitierung des Konstruktors
cout

Hallo nochmal,

Erst einmal ist der Test unabhaengig vom Betriebssystem, das einzige betriebssystemspezifische Dienes Programmes ist das ‚PAUSE‘ in ‚system‘.

Aber wie kann ich eigentlich meine spezielle Klasse a löschen
um auf die Art den Destuktor testen zu können ?

Da gibt es zwei Moeglichkeiten, aber erst einmal Grundsaetzliches:
Ein Destruktor wird immer dann aufgerufen, wenn der Gueltigkeitsbereich der Variablen beendet wird. Das ist bei statischen Variablen und den globalen Variablen am Ende des Programms, bei den anderen am Ende des Blockes, in dem sie definiert sind. In Deinem Fall ist die Variable direkt im Rumpf von ‚main()‘ definiert, also verliert sie ihre Gueltigkeit, wenn ‚main()‘ verlassen wird, also das Programm sich beendet.

Zum Testen kannst Du zum einen die Variable in einem Block definieren, dann wird der Destruktor am Ende des Blockes automatisch aufgerufen:
{
CLASS var;
} /* Ende der Gueltigkeit von ‚var‘ */

Genauer kannst Du den Aufruf regeln, wenn Du dir die Variable mit ‚new‘ erzeugst und mit ‚delete‘ loeschst, dann wird der Destruktor vom ‚delete‘ aus aufgerufen:

CLASS* var = new CLASS;
delete var; /* Hier wird der Destruktor von ‚var‘ aufgerufen. Hinterher kann auf ‚var‘ nicht mehr zugegriffen werden -> Speicherzugriffsfehler */
/* Am besten hier nich ‚var = NULL;‘ einfuegen, dann kommt man nicht in anderen Speicherbereich. */

Gruss
Diether