fragen zur virtual methode

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

fragen zur virtual methode
ich habe genau den fehler bei sos2 aufgabe wie folgende beispiel, kann jemand mir sagen, wo den fehler ist? :finger:

/* Basis.hpp */
#ifndef BASIS
#define BASIS
#include
using namespace std;
class Basis {
public :
virtual void func() = 0;
};
#endif

/* Class1.hpp */
#ifndef CLASS1
#define CLASS1
#include “Basis.hpp”
class Class1 : public Basis {
public :
void func();
};
#endif

/* Class1.cpp */
#include “Class1.hpp”
void Class1::func() {
cout <<“Class1\n”;
}

/* Class2.cpp*/
#include “Class1.hpp”
class Class2 : public Class1 {
public :
void func() {
cout <<“Class2\n”;
}
};
int main()
{
Class2 obj;
}

bei complieren taucht die fehlermeldung auf :
/tmp/ccsTiZdB.o(.gnu.linkonce.t._ZN6Class1C2Ev+0x16): In function Class1::Class1[not-in-charge]()': : undefined reference to vtable for Class1’
/tmp/ccsTiZdB.o(.gnu.linkonce.r._ZTI6Class2+0x8): undefined reference to `typeinfo for Class1’
collect2: ld returned 1 exit status


Hab dein Beispiel mal gecodet und ausprobiert. Funktioniert alles einwandfrei. Da der Fehler vom Linker kommt, könnte es sein, dass du beim Compilieren eine Object-Datei vergisst.

Habe dein Beispiel mit

g++ -o test Class1.cpp Class2.cpp
compiliert.

Oder:

g++ -c Class1.cpp
g++ -o test Class2.cpp Class1.o

Übrigens:
Es ist kein guter Stil, die Header die du weiter unten in der include Hierarchie brauchst, auf oberster Ebene schon zu includen. Immer in jeder Datei genau die Header-Dateien includen, die wirklich in dieser Datei Verwendung finden.

Also genau in den Dateien includen, in denen du etwas daraus verwendest, auch wenn es dann evtl. unnötig oft vorkommt. Dafür macht man ja das #ifndef#define#endif in jeder Header-Datei.


jo , würde auch mal sagen das mit deinem compileraufruf was nicht passt … sieht mir so aus dass du Class1.cpp nicht dazulinkst ( bzw überhaupt nicht kompilierst ) …


ich habe nochmal probiert, mit g++ -c Class1.cpp g++ -o test Class2.cpp Class1.o lass es complieren.


Bekomm den gleichen Fehler beim Aufruf von ‘make dvbreceivertest’…
Ich hoff mal, das ich nich einfach nur irgendwo ein ; vergessen hab… .

g++     dvbreceivertest.cpp   -o dvbreceivertest
/tmp/ccCCm3MV.o(.text+0x51): In function `main':
: undefined reference to `DVBReceiver::DVBReceiver[in-charge](char const*, int, int, char const*)'
/tmp/ccCCm3MV.o(.text+0xc2): In function `main':
: undefined reference to `DVBReceiver::DVBReceiver[in-charge](char const*, int, int, char const*)'
/tmp/ccCCm3MV.o(.text+0x16c): In function `main':
: undefined reference to `DVBReceiver::bildschirmtyp() const'
/tmp/ccCCm3MV.o(.text+0x1f3): In function `main':
: undefined reference to `DVBReceiver::bildschirmtyp() const'
/tmp/ccCCm3MV.o(.text+0x46a): In function `main':
: undefined reference to `typeinfo for Analog'
/tmp/ccCCm3MV.o(.text+0x4e8): In function `main':
: undefined reference to `DVBReceiver::~DVBReceiver [in-charge]()'
/tmp/ccCCm3MV.o(.text+0x50a): In function `main':
: undefined reference to `DVBReceiver::~DVBReceiver [in-charge]()'
/tmp/ccCCm3MV.o(.gnu.linkonce.r._ZTI11DVBReceiver+0x10): undefined reference to `typeinfo for Digital'
collect2: ld returned 1 exit status
make: *** [dvbreceivertest] Error 1

Und hier gibts den Fehler bei make radiotest

Analog.o(.gnu.linkonce.t._ZN19KodierungsverfahrenC2Ev+0x8): In function `Kodierungsverfahren::Kodierungsverfahren[not-in-charge]()':
: undefined reference to `vtable for Kodierungsverfahren'
Analog.o(.gnu.linkonce.r._ZTI6Analog+0x8): undefined reference to `typeinfo for Kodierungsverfahren'
Digital.o(.gnu.linkonce.r._ZTI7Digital+0x8): undefined reference to `typeinfo for Kodierungsverfahren'
collect2: ld returned 1 exit status
make: *** [radiotest] Error 1

Ja verdammt nochmal… schoen, das wir alle im gleichen Boot sitzen…
aber hat einer nen Plan, was genau da schief laeuft??? verzweifel
Fehler mit dem Linker, ok…
hat wohl was mit Vererbung und Includen von hpps zu tun… aber mehr faellt mir auch nicht ein.

Bin alle Dateien noch mal durchgegangen - kann einfach keinen Fehler finden.
Und er bringt ja immerhin keine Fehlermeldungen bezgl. meiner Dateien… .

Um Hilfe wird gebeten!

P.S.:
ich wuerds ja in der Newsgroup regeln…
aber irgendwie spinnt mein Opera im CIP-Pool rum und ich krieg keinen Zugang.


Habt ihr schonmal versucht, diese aclocal-, automake- und configure-Geraffel nochmals durchlaufen zu lassen? Gewiss kann ichs nicht sagen, ich glaube das hat bei mir geholfen…


DOH… wie konnte ich (/wir g) nur soooo bloed sein und das vergessen

  • das war ‘der Fehler’ (zumindest bei mir)!

DANKE!!!


also ich hatte den fehler auch. habt ihr schon mal geschaut ob ihr die methode wechsle_verfahren abstrakt deklariert habt?daran lags bei mir


Hi,
ich hab’ ein Problem mit Handy::senden(…) und zwar:

  • wie kann ich ein ‘int’-Telfonnummer in ein char-Array schmerzlos “einpacken”?

Danke im Voraus.


Am einfachsten geht das ganze mit sprintf bzw snprintf:

snprintf( str, 512, “%d:%s”, nr, msg );


sollen die codes eigentlich ANSI-konform sein? snprintf() isses ja z.b. nicht


Handy an
Handy an
Handy: Methoden hersteller, bandbreite, eigene_telefonnummer ok
Handy: Klassenhierarchie ok
Handy: Methoden aktuelles_verfahren, senden, empfangen ok
Handy: Methode wechsle_verfahren ok
Handy aus
Handy aus
Handy: OK

:gun: :gun: :gun:
Juhuuu!
DANKE!!!


Ne coolere Methode, weil mehr Hacker-Style (lol):

  • 48

Wer das jetzt nicht versteht, kann ja mal in die ASCII-Code-Tabelle in der Dec. Spalte schaun.

P.S.:
warum zum Henker werden in diesem Drecks-Forum meine Smilies gekillt?!?!?!?!?!?!?!?!?!?

…TOB…SCHREI…


Super Sache…nehmen wir als Zahl doch 4711.
4711 + 48 = 4759.

Damit hab ich immer noch eine Zahl, und keinen String :wink:


Schon klar, das das ganze nicht gerade praktisch ist - wuerde auch sprintf vorziehen. Aber just for fun:
[…]

char array[i] = (zahl % 10) + 48; // halber Pseudo-Code

[…]

Verstaendlicher geworden?

Oh mann…

genau an dem Fehler hab ich die ganze Nacht gesessen!

Jau, mit aclocal, autoconf, usw… hats dann gefunkt.
Schade, dass davon nichts in der Newsgroup stand und der Threadtitel passte auch irgendwie nicht…

Bleibt wohl nichts anderes uebrig, als jetzt Forum und Newsgropu zu lesen :slight_smile:

/H.


stand das nicht alles im übungsskript? :wink: