Der Kampf mit mehrfach weitervererbten Klassen

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Benutzeravatar
Bebu
Beiträge: 562
Registriert: Mi Okt 21, 2009 6:19 pm
Wohnort: In der Nähe von Salzburg - Bin aber kein Österreicher!

Der Kampf mit mehrfach weitervererbten Klassen

Beitrag von Bebu » Di Nov 22, 2011 11:40 pm

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.
Wer immer nach dem Unerreichbaren jagt, der wird irgendwann auf die Schnauze fallen!

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Der Kampf mit mehrfach weitervererbten Klassen

Beitrag von cloidnerux » Mi Nov 23, 2011 7:19 am

"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?
Redundanz macht wiederholen unnötig.
quod erat expectandum

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

Re: Der Kampf mit mehrfach weitervererbten Klassen

Beitrag von Xin » Mi Nov 23, 2011 9:55 am

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 ;->
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
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: Der Kampf mit mehrfach weitervererbten Klassen

Beitrag von Kerli » Mi Nov 23, 2011 10:48 am

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:

Code: Alles auswählen

SqliteWrapper(SqliteWrapper const&) = delete;
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

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

Re: Der Kampf mit mehrfach weitervererbten Klassen

Beitrag von Xin » Mi Nov 23, 2011 10:59 am

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:

Code: Alles auswählen

SqliteWrapper(SqliteWrapper const&) = delete;
Wieder was gelernt. ^^
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
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: Der Kampf mit mehrfach weitervererbten Klassen

Beitrag von Kerli » Mi Nov 23, 2011 12:56 pm

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.
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Benutzeravatar
Bebu
Beiträge: 562
Registriert: Mi Okt 21, 2009 6:19 pm
Wohnort: In der Nähe von Salzburg - Bin aber kein Österreicher!

Re: Der Kampf mit mehrfach weitervererbten Klassen

Beitrag von Bebu » Mi Nov 23, 2011 1:20 pm

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...
Wer immer nach dem Unerreichbaren jagt, der wird irgendwann auf die Schnauze fallen!

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

Re: Der Kampf mit mehrfach weitervererbten Klassen

Beitrag von Xin » Mi Nov 23, 2011 1:35 pm

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
:lol:

(auf die Schnelle habe ich kein GIF gefunden, was cool tanzt, darum nehme ich den epileptischen Anfall hier ersatzweise)
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
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
Bebu
Beiträge: 562
Registriert: Mi Okt 21, 2009 6:19 pm
Wohnort: In der Nähe von Salzburg - Bin aber kein Österreicher!

Re: Der Kampf mit mehrfach weitervererbten Klassen

Beitrag von Bebu » Mi Nov 23, 2011 8:37 pm

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
:lol:

(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 ;) :P
Wer immer nach dem Unerreichbaren jagt, der wird irgendwann auf die Schnauze fallen!

Antworten