Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » linker: undefined reference

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
29.04.2007, 17:13 Uhr
Lensflare



Hi

mein compiler gibt diese Fehlermeldung aus:

Code:
  [Linker error] undefined reference to `vtable for Immobilie'
  [Linker error] undefined reference to `Immobilie::berechneMiete()'
  ld returned 1 exit status


wenn ich einen Construktor definiere.

hier die beteiligten dateien:

farbengruppe.h

C++:
#ifndef FARBENGRUPPE_H
#define FARBENGRUPPE_H

class Farbengruppe
{
  
};

#endif //FARBENGRUPPE_H



immobilie.h

C++:
#ifndef IMMOBILIE_H
#define IMMOBILIE_H

#include "farbengruppe.h"

class Immobilie
{
protected:
  int mietTabelle[6];
  Farbengruppe *pFarbengruppe;
  
public:
  virtual int berechneMiete();
};

#endif //IMMOBILIE_H



strasse.h

C++:
#ifndef STRASSE_H
#define STRASSE_H

#include "immobilie.h"

class Strasse : public Immobilie
{
private:
  int anzHaeuser;
  bool hotel;

public:
  Strasse(Farbengruppe *fg, int mn, int m1ha, int m2ha, int m3ha, int m4ha, int mho);
  
  int berechneMiete(int anzahl);
};

#endif //STRASSE_H



strasse.cpp

C++:
#include "strasse.h"

//fehler kommt, wenn ich den Konstruktor Strasse definiere.
Strasse::Strasse(Farbengruppe *fg, int mn, int m1ha, int m2ha, int m3ha, int m4ha, int mho)
{
  //...
};

int Strasse::berechneMiete(int anzahl)
{
  //...
}




was mache ich falsch?
Danke im Voraus.
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
29.04.2007, 18:17 Uhr
0xdeadbeef
Gott
(Operator)



C++:
#ifndef IMMOBILIE_H
#define IMMOBILIE_H

#include "farbengruppe.h"

class Immobilie
{
protected:
  int mietTabelle[6];
  Farbengruppe *pFarbengruppe;
  
public:
  virtual ~Immobilie() { } //Notwendig, wenn abgeleitet werden soll

  virtual int berechneMiete() = 0;
};

#endif //IMMOBILIE_H


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
29.04.2007, 18:32 Uhr
Lensflare



ok. jetzt geht es.

würde dennoch gerne wissen, warum man die virtuelle methode gleich null setzen muss und warum man den destruktor definieren muss.
ohne destruktor wird bei mir fehlerfrei kompiliert.
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)

Dieser Post wurde am 29.04.2007 um 18:33 Uhr von Lensflare editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
29.04.2007, 18:52 Uhr
0xdeadbeef
Gott
(Operator)


Du musst die Methode nicht als =0 deklarieren, aber wenn du das sein lässt, musst du sie auch implementieren. In diesem Fall soll sie pure virtual sein, also macht eine Implementierung wenig Sinn.

Was den Destruktor angeht, der muss laut Standard und sollte eigentlich auch sonst virtual sein, wenn von einer Klasse abgeleitet werden soll, damit (angenommen, B ist abgeleitet von A) sowas hier funktioniert:

C++:
A *p = new B;
delete p;


maw, damit da auch der Destruktor von B aufgerufen wird.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
29.04.2007, 21:38 Uhr
Lensflare



achso, macht Sinn.
Danke.
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
29.04.2007, 23:44 Uhr
Lensflare



Jetzt bekomme ich einen Fehler, wenn ich versuche von 'Strasse' eine Instanz zu erzeugen.


C++:
//main.cpp
  Strasse *s = new Strasse(NULL,0,0,0,0,0,0);




Code:
c:\...\main.cpp(30): error C2259: 'Strasse' : cannot instantiate abstract class



'Strasse' soll eigentlich nicht abstrakt sein.
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)

Dieser Post wurde am 29.04.2007 um 23:45 Uhr von Lensflare editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
30.04.2007, 09:02 Uhr
ao

(Operator)



Zitat von 0xdeadbeef:
Was den Destruktor angeht, der muss laut Standard und sollte eigentlich auch sonst virtual sein, wenn von einer Klasse abgeleitet werden soll

Aha ... dass das zur Laufzeit Ärger geben kann, wenn nur der Basis-Destruktor aufgerufen wird, weiß ich ja. Aber heißt das auch, dass es jetzt in Standard-C++ einen *Compiler*fehler gibt, wenn abgeleitet wird und der Destruktor nicht virtuell ist? Das wär ja mal ne feine Sache.

Sorry, dass ich das frage, aber ich hab hier zum Ausprobieren nur VC++ 6, und der ist für aktuelle Standards viel zu alt.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
30.04.2007, 10:40 Uhr
FloSoft
Medialer Over-Flow
(Administrator)



Zitat von ao:

Aha ... dass das zur Laufzeit Ärger geben kann, wenn nur der Basis-Destruktor aufgerufen wird, weiß ich ja. Aber heißt das auch, dass es jetzt in Standard-C++ einen *Compiler*fehler gibt, wenn abgeleitet wird und der Destruktor nicht virtuell ist? Das wär ja mal ne feine Sache.

neuer VC und auch der gcc meckern wenn du virtuelle Funktionen aber keinen virtuellen Destruktor hast.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
30.04.2007, 18:28 Uhr
0xdeadbeef
Gott
(Operator)


In Strasse sollst du die berechneMiete-Funktion ja auch nicht auf Null setzen - da gibts es die Funktion ja.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
30.04.2007, 19:19 Uhr
Lensflare



Mache ich auch nicht.
Die Methode ist bei mir in strasse.cpp definiert. (siehe erster post)

Ich hab mal in der Oberklasse 'Immobilie' die Methode 'berechneMiete()' statt auf 0 zu setzen das hier gemacht:

C++:
virtual int berechneMiete() { return -1; };


und es scheint jetzt zu funktionieren.
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)

Dieser Post wurde am 30.04.2007 um 19:20 Uhr von Lensflare editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: