Seite 1 von 1
Der Kampf mit mehrfach weitervererbten Klassen
Verfasst: Di Nov 22, 2011 11:40 pm
von Bebu
Ich habe wieder mal ein Problem...
Initialisierungsliste von SqliteWrapper:
Code: Alles auswählen
Dedupe::Dataholding::SqliteWrapper::
SqliteWrapper( std::string Path ) : dbs_path( Path ),
db_handle( NULL ),
ReturningTable( )
Initialisierungsliste von Dataholding:
Code: Alles auswählen
Dataholding::Dataholding( Dedupe::FilePath Path )
: Dataholding::SqliteWrapper( Path.native() )
Dataholding erbt von SqliteWrapper:
Code: Alles auswählen
class Dataholding : protected Dedupe::Dataholding::SqliteWrapper
Jetzt versuche ich aus allen Modulen eine Klasse Kernel zu verschmelzen, was mit allen Modulen funktioniert, bis auf Dataholding:
Code: Alles auswählen
class Kernel : protected Dedupe::FileSearch::SearchFiles,
protected Dedupe::Hash::Hash64,
protected Dedupe::Dataholding::Dataholding
Initialisierungsliste:
Code: Alles auswählen
Dedupe::Core::Kernel::Kernel( Dedupe::FilePath DatabaseLocation,
std::ostream &Messages )
: Dedupe::Dataholding::Dataholding( DatabaseLocation ),
MessageOut( Messages )
Das ganze kompiliert Fehlerlos, aber ich bekomme ein "undefined reference to Dedupe::Dataholding::SqliteWrapper::SqliteWrapper( Dedupe::Dataholding::SqliteWrapper const&" zurück. Dataholding kann innerhalb einer Memberfunktion instanziert werden, also liegt es nicht daran, das er die Bibliothek nicht dazulinken kann. Wo ist mein Denkfehler?
Edit: Habe gerade noch den aktuellen Stand hochgeladen, habe allerdings die betreffenden Zeilen auskommentiert, damit sich das ganze auch bauen lässt.
Re: Der Kampf mit mehrfach weitervererbten Klassen
Verfasst: Mi Nov 23, 2011 7:19 am
von cloidnerux
"undefined reference to Dedupe::Dataholding::SqliteWrapper::SqliteWrapper( Dedupe::Dataholding::SqliteWrapper const&"
Klingt so, als ob du dem Konstruktor die Falschen werte gibst und der Linker nun versucht einen Konstruktor zu finden, der dieses Argument annimmt.
So weit ich das gesehen habe, nimmt der SqlWrapper nur strings oder paths an?
Re: Der Kampf mit mehrfach weitervererbten Klassen
Verfasst: Mi Nov 23, 2011 9:55 am
von Xin
Bebu hat geschrieben:Das ganze kompiliert Fehlerlos, aber ich bekomme ein "undefined reference to Dedupe::Dataholding::SqliteWrapper::SqliteWrapper( Dedupe::Dataholding::SqliteWrapper const&" zurück. Dataholding kann innerhalb einer Memberfunktion instanziert werden, also liegt es nicht daran, das er die Bibliothek nicht dazulinken kann. Wo ist mein Denkfehler?
Hier wird der Copy-Construktor für den Sqlite-Wrapper gerufen. C++ versucht also ein Sqlite-Wrapper-Objekt zu kopieren. Vermutlich fehlt irgendwo ein Referenz-Operator (&).
Was Du da soweit geschrieben hast, sieht okay aus. Ich vermute daher das Problem an einer ganz anderen Stelle.
Erstelle einen Copy-Construktor, lass ihn darin abschmieren ( *((int*)0) = 0 => "Segmentation Fault" ) und guck mal mit gdb, von wo Du in den Copy-Konstruktor überhaupt reingekommen bist.
Ja, ein Break-Point wäre auch okay ;->
Re: Der Kampf mit mehrfach weitervererbten Klassen
Verfasst: Mi Nov 23, 2011 10:48 am
von Kerli
Es könnte sich auch um eine unbeabsichtigte Kopie bzw. temporäres Objekt handeln.
Xin hat geschrieben:Ja, ein Break-Point wäre auch okay ;->
Oder noch besser den Copy-Constructor private machen bzw. in C++11 überhaupt entfernen:
Re: Der Kampf mit mehrfach weitervererbten Klassen
Verfasst: Mi Nov 23, 2011 10:59 am
von Xin
Kerli hat geschrieben:Es könnte sich auch um eine unbeabsichtigte Kopie bzw. temporäres Objekt handeln.
Xin hat geschrieben:Ja, ein Break-Point wäre auch okay ;->
Oder noch besser den Copy-Constructor private machen
Das nutzt nichts, falls das Problem in einer Member-Funktion ist.
Kerli hat geschrieben:bzw. in C++11 überhaupt entfernen:
Wieder was gelernt. ^^
Re: Der Kampf mit mehrfach weitervererbten Klassen
Verfasst: Mi Nov 23, 2011 12:56 pm
von Kerli
Xin hat geschrieben:
Das nutzt nichts, falls das Problem in einer Member-Funktion ist.
Nachdem der Fehler aber erst beim Ableiten aufgetreten ist vermute ich dass, das Problem wohl irgendeine implizite Typumwandlung ist und nicht in einer Memberfunktion.
Der Konstruktor sollte natürlich nicht implementiert werden. So gibt es bei einem Zugriff von außen eine genaue Fehlermeldung inkl. Zeile und bei einem Zugriff aus der Klasse selbst immerhin noch den Linkerfehler.
Re: Der Kampf mit mehrfach weitervererbten Klassen
Verfasst: Mi Nov 23, 2011 1:20 pm
von Bebu
Dank euren Hinweise habe ich den Fehlerteufel entdeckt:
Code: Alles auswählen
std::for_each(
AddValues.begin(),
AddValues.end(),
boost::bind(
&Dedupe::Core::Kernel::AppendFile, &Kernel, _1, Recursive));
Ich hatte vor Kernel den Referenzoperator vergessen

Die Zeile sitzt in der Kommandozeilenklasse und kann so ohnehin nicht bleiben, sonst schieße ich mir beim Thema Multithreading selbst ins Knie. Aber im Moment beschäftige ich mich damit noch nicht...
So manchen Fehler kann man wirklich nicht so leicht finden...
Re: Der Kampf mit mehrfach weitervererbten Klassen
Verfasst: Mi Nov 23, 2011 1:35 pm
von Xin
Xin hat geschrieben:Hier wird der Copy-Construktor für den Sqlite-Wrapper gerufen. C++ versucht also ein Sqlite-Wrapper-Objekt zu kopieren. Vermutlich fehlt irgendwo ein Referenz-Operator (&).
Bebu hat geschrieben:Dank euren Hinweise habe ich den Fehlerteufel entdeckt:
Ich hatte vor Kernel den Referenzoperator vergessen

menschen_tanz-5719.gif
(auf die Schnelle habe ich kein GIF gefunden, was cool tanzt, darum nehme ich den epileptischen Anfall hier ersatzweise)
Re: Der Kampf mit mehrfach weitervererbten Klassen
Verfasst: Mi Nov 23, 2011 8:37 pm
von Bebu
Xin hat geschrieben:Xin hat geschrieben:Hier wird der Copy-Construktor für den Sqlite-Wrapper gerufen. C++ versucht also ein Sqlite-Wrapper-Objekt zu kopieren. Vermutlich fehlt irgendwo ein Referenz-Operator (&).
Bebu hat geschrieben:Dank euren Hinweise habe ich den Fehlerteufel entdeckt:
Ich hatte vor Kernel den Referenzoperator vergessen

menschen_tanz-5719.gif
(auf die Schnelle habe ich kein GIF gefunden, was cool tanzt, darum nehme ich den epileptischen Anfall hier ersatzweise)
Schön, wenn sich ein Mensch so einfach erfreuen lässt
