std::map unterschiedliche Typen aufnehmen lassen

Schnelle objektorientierte, kompilierende Programmiersprache.
Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: std::map unterschiedliche Typen aufnehmen lassen

Beitrag von Dirty Oerti » Fr Aug 14, 2009 1:25 pm

cloidnerux hat geschrieben:

Code: Alles auswählen

In function `iwas::~iwas()':
undefined reference to `OBJ::~OBJ()'
undefined reference to `OBJ::~OBJ()'
is doch ganz klar: Du versuchst den Destruktor deiner basisklasse aufzurufen, der aber ist Als (rein) Virtuelle deklariert, desswegen kann er nciht genutzt werden, er muss überschrieben werden.
Du brauchst die Basisklasse nur um deine Objekte zu Down-Casten um den Destruktor zu nutzen.
Äh...was auch immer du mir damit sagen willst ;)

Kurze Internetsuche:
http://www.imn.htwk-leipzig.de/~waldman ... de213.html

Also sieht's nun so aus:

Code: Alles auswählen

class OBJ
{
	public:
	virtual ~OBJ(){};
};

Code: Alles auswählen

class iwas : public OBJ
{
   //egal
   public:
   //ebenfalls
   ~iwas();
};
Und so funktionierts auch.
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: std::map unterschiedliche Typen aufnehmen lassen

Beitrag von Xin » Fr Aug 14, 2009 1:36 pm

cloidnerux hat geschrieben:

Code: Alles auswählen

In function `iwas::~iwas()':
undefined reference to `OBJ::~OBJ()'
undefined reference to `OBJ::~OBJ()'
is doch ganz klar: Du versuchst den Destruktor deiner basisklasse aufzurufen, der aber ist Als (rein) Virtuelle deklariert, desswegen kann er nciht genutzt werden, er muss überschrieben werden.
Du brauchst die Basisklasse nur um deine Objekte zu Down-Casten um den Destruktor zu nutzen.
Er ist nicht rein virtuell deklariert, deswegen muss er existieren.
Der GCC konstruiert die vtable dahin, wo der Destructor geparst wird. Also mußt Du einen Destructor in object.cpp definieren, selbst wenn nichts drin steht.

ansonsten wird wie folgt abgeleitet

Code: Alles auswählen

class Irgendwas : public Object
{
};
Du kannst natürlich auch protected und private ableiten.

EDIT: Whoops, da war ja schon wieder eine Seite mehr... ^^
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

sonic
Beiträge: 29
Registriert: Do Aug 13, 2009 6:58 pm

Re: std::map unterschiedliche Typen aufnehmen lassen

Beitrag von sonic » Fr Aug 14, 2009 1:39 pm

Dirty Oerti hat geschrieben:Ok, Frage^^

Wie sieht dann die abgeleitete Klasse aus? (Es ist schon etwas her, dass ich mit Klassen arbeiten konnte :D)

Code: Alles auswählen

class iwas : OBJ
{
 //egal
public:
 //ebenfalls
 ~iwas();
};
Dann bekomme ich:
In function `iwas::~iwas()':
undefined reference to `OBJ::~OBJ()'
undefined reference to `OBJ::~OBJ()'

Du musst den virtuellen Destruktor schon implementieren ;)

Beispiel:

Code: Alles auswählen

#include <iostream>
 class OBJ
 {
 public:
	 virtual ~OBJ(){std::cout << "Destr. Basis" << std::endl;}
 };

 class A : public OBJ
 {
	 ~A(){std::cout << "Destr. A" << std::endl;}
 };

 class B : public OBJ
 {
	 ~B(){std::cout << "Destr. B" << std::endl;}
 };


 int main(void)
 {
	 OBJ* a[2];
	 a[0] = new A();
	 a[1] = new B();

	 for(int i = 0; i < 2; i++)
	 {
		 delete a[i];
	 }

	 return 0;
 }
Frei nach dem refrain für Let it be...

Write in C, Write in C,
Write in C, yeah, Write in C.
Only wimps use BASIC.
Write in C.

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: std::map unterschiedliche Typen aufnehmen lassen

Beitrag von Dirty Oerti » Fr Aug 14, 2009 10:33 pm

Noch was zu den vtables...hat ne kurze Zeit gedauert, bis ich drauf gekommen bin, was diesen Fehler verursacht hat:
In function `Window::Window(Engine*, int, int, short, bool)':
window.cpp:(.text+0xdd): undefined reference to `vtable for Window'
window.cpp:(.text+0xe9): undefined reference to `vtable for Window'

Code: Alles auswählen

class Window : public OpenThreads::Thread, public OBJ
{
	private:
	Engine *mother;
	osg::ref_ptr<osgViewer::Viewer> viewer;
	public:
	Window(Engine *mom,int w, int h, short d, bool fs);
	~Window();
	
	void run();
};

Code: Alles auswählen

Window::Window(Engine *mom,int w, int h, short d, bool fs)
{
	//nicht wichtig
}
Lösung war (auch wenn für mich aus der Meldung wirklich nicht ersichtlich) den fehlenden Destruktor zu implementieren..^^

Code: Alles auswählen

Window::~Window()
{}
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: std::map unterschiedliche Typen aufnehmen lassen

Beitrag von Xin » Fr Aug 14, 2009 11:05 pm

Dirty Oerti hat geschrieben:Noch was zu den vtables...hat ne kurze Zeit gedauert, bis ich drauf gekommen bin, was diesen Fehler verursacht hat:
In function `Window::Window(Engine*, int, int, short, bool)':
window.cpp:(.text+0xdd): undefined reference to `vtable for Window'
window.cpp:(.text+0xe9): undefined reference to `vtable for Window'
Lösung war (auch wenn für mich aus der Meldung wirklich nicht ersichtlich) den fehlenden Destruktor zu implementieren..^^

Code: Alles auswählen

Window::~Window()
{}
Darf ich Dich nochmals auf dieses Posting hinweisen... :->
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: std::map unterschiedliche Typen aufnehmen lassen

Beitrag von Dirty Oerti » Fr Aug 14, 2009 11:49 pm

Äh...*Keinen Zusammenhang sehe, bis auf eine sehr ähnliche Fehlermeldung natürlich*

Das Posting habe ich nicht vergessen. Bei "dir" war das Problem aber verknüpft mit einem als virtual gesetztem Member.
In meinem Fall gibt es nichts, was virtual ist...? (Das passier auch ohne ableiten von OBJ)

*Nachguck*
Ok, doch. Der Desktruktor der abgeleiteten Klasse Thread ist virtual...

Hm...das kann man doch eigntl fast als "Bug" in gcc verstehen, oder?
Also nicht, dass er eine Meldung ausgibt, sondern dass die Meldung so unverständlich ist...?
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: std::map unterschiedliche Typen aufnehmen lassen

Beitrag von Xin » Sa Aug 15, 2009 7:52 am

Dirty Oerti hat geschrieben:Äh...*Keinen Zusammenhang sehe, bis auf eine sehr ähnliche Fehlermeldung natürlich*

Das Posting habe ich nicht vergessen. Bei "dir" war das Problem aber verknüpft mit einem als virtual gesetztem Member.
In meinem Fall gibt es nichts, was virtual ist...? (Das passier auch ohne ableiten von OBJ)

*Nachguck*
Ok, doch. Der Desktruktor der abgeleiteten Klasse Thread ist virtual...
^^
Dirty Oerti hat geschrieben:Hm...das kann man doch eigntl fast als "Bug" in gcc verstehen, oder?
Also nicht, dass er eine Meldung ausgibt, sondern dass die Meldung so unverständlich ist...?
Da gibt's nicht nur eine... aber man kann es auch noch schlimmer haben, man muss nur Visual Studio nehmen.

Hier die anderen, dich ich bisher so unverständlich fand, dass sie mir eine Website wert waren. Die undefined reference to vtable brachte kurz darauf einen Eintrag ins Gästebuch: "Danke!"
Als ich den Fehler hatte, habe ich mich bei Google kaputtgesucht, aber nix gefunden... also ausprobieren, bis es klappt...
http://www.proggen.org/doku.php?id=c:faq
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: std::map unterschiedliche Typen aufnehmen lassen

Beitrag von Dirty Oerti » Sa Aug 15, 2009 8:47 am

Auf was würdest du tippen, wenn du diese Meldung hier bekommst?
terminate called after throwing an instance of 'std::logic_error'
what(): basic_string::_S_construct NULL not valid
Was ich dazu schon rausgefunden hab: Es scheint bei einer falschen String-Initialisierung aufzutreten.
Das Beste: Ich hab da gar keinen String.

Wobei lösen werd ich das Problem nicht können...da geht es nämlich langsam in die Interna von OpenSceneGraph...^^
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: std::map unterschiedliche Typen aufnehmen lassen

Beitrag von fat-lobyte » Sa Aug 15, 2009 11:39 am

Dirty Oerti hat geschrieben:Auf was würdest du tippen, wenn du diese Meldung hier bekommst?
terminate called after throwing an instance of 'std::logic_error'
what(): basic_string::_S_construct NULL not valid
Was ich dazu schon rausgefunden hab: Es scheint bei einer falschen String-Initialisierung aufzutreten.
Das Beste: Ich hab da gar keinen String.

Wobei lösen werd ich das Problem nicht können...da geht es nämlich langsam in die Interna von OpenSceneGraph...^^
Naja, nicht unbedingt. Manchmal können NULL Pointer dazu führen, dass bestimmte Memberfunktionen problemlos aufgerufen werden können (weil sie keinen this- Zeiger brauchen). Der Fehler tritt dann an einer anderen, für dich nicht sichtbaren Stelle auf.
Überprüf mal die Zeiger die du an deinen OpenSceneGraph fütterst.


Ich hab aus dem Thread aber eine Sache noch immer nicht so ganz verstanden:
Wenn du ein map mit "allen" objekten hast, also Objekte eines beliebigen Typs, was genau willst du damit eigentlich machen? Was kannst du mit "einem beliebigen Objekt" tun?
Um mit etwas zu arbeiten müsste man wissen was es ist, und das ist im Typ gespeichert. Wenn du diese Information vernichtest ist außer "da ist irgendwas" nichts mehr da.
Welchen Zweck hat dieses Map im Kontext deines Programms?
Haters gonna hate, potatoes gonna potate.

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: std::map unterschiedliche Typen aufnehmen lassen

Beitrag von Dirty Oerti » Sa Aug 15, 2009 11:54 am

fat-lobyte hat geschrieben:Naja, nicht unbedingt. Manchmal können NULL Pointer dazu führen, dass bestimmte Memberfunktionen problemlos aufgerufen werden können (weil sie keinen this- Zeiger brauchen). Der Fehler tritt dann an einer anderen, für dich nicht sichtbaren Stelle auf.
Überprüf mal die Zeiger die du an deinen OpenSceneGraph fütterst.
Das Problem liegt, glaube ich, einfach irgendwo IN OpenSceneGraph, bei der Weiterleitung der Daten an das SDL-Fenster.
Zeiger übergebe ich nicht, zumindest nicht direkt.
Ich habe eine Viewer-Instanz, deren Member frame() aufgerufen wird (werden muss).
Evtl. kommt das Problem auch daher, dass diese Viewer-Instanz über einen osg::ref_ptr<> im ursrpünglichem Thread erstellt wird. Die ref_ptr sollen eigentl "Threadsicher" sein, aber ich weiß nicht...
fat-lobyte hat geschrieben:Ich hab aus dem Thread aber eine Sache noch immer nicht so ganz verstanden:
Wenn du ein map mit "allen" objekten hast, also Objekte eines beliebigen Typs, was genau willst du damit eigentlich machen? Was kannst du mit "einem beliebigen Objekt" tun?
Um mit etwas zu arbeiten müsste man wissen was es ist, und das ist im Typ gespeichert. Wenn du diese Information vernichtest ist außer "da ist irgendwas" nichts mehr da.
Welchen Zweck hat dieses Map im Kontext deines Programms?
Naja, es bedeutet für mich deutlich weniger Schreibarbeit. Ich hab auf diese Art 3 Memberfunktionen, mit denen ich beliebige Objekte hinzufügen, suchen und wieder entfernen kann.
Ich füge ja nur "bekanntes" in diese Map ein, und suche folglich nur nach Bekanntem.
Die Map ist also keineswegs dynamisch zur Laufzeit beliebig veränderbar.
Dazu müsste ich im String wohl noch eine Typbeschreibung einbauen, nach der dann (aus einer festgelegten Menge an Typen) der Typ bestimmt wird. Das ist mir jetzt aber zu aufwendig.

Und: Vorrangig hat es mich interessiert, ob und wie (einfach oder schwer) so etwas realisierbar ist :)
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Antworten