Ich habe versucht, einen Weg zu finden, einige der Unzulänglichkeiten der HDF5 C ++ - Bindungen zu umgehen. Momentan ist mein Code mit try / catch-Blöcken ähnlich der folgenden versehen:
%Vor%Dies sollte nicht notwendig sein - ich möchte nur eine Datei für den Lese- / Schreibzugriff öffnen und, wenn sie nicht existiert, diese erstellen. Ein anderes, schwierigeres Problem besteht darin, eine verschachtelte Gruppe (z. B. "/ Eltern / Gruppe") zu erstellen, bei der die Elterngruppe nicht notwendigerweise existiert. In Unix / Linux wäre das Äquivalent
%Vor%In den HDF5 C ++ - Bindungen wird jedoch durch Erstellen einer Gruppe, deren Elterngruppe nicht existiert, eine Ausnahme ausgelöst.
Aus diesen Gründen wurde ich motiviert, eine Header-Datei zu erstellen, die einige dieser allgemeinen Probleme behandelt. Mein erster Gedanke war, einfach eine Reihe von Funktionen zu erstellen, die zum Beispiel einen Dateinamen und Zugriffsmodus annehmen und ein H5 :: H5File-Objekt zurückgeben, oder einen Gruppennamen nehmen und ein Gruppenobjekt zurückgeben. Ich denke jedoch, dass dies weniger als ideal ist, da es den Programmierer verlässt, der diese Header-Datei verwendet, um auf den zurückgegebenen Objekten "delete" aufzurufen, obwohl der Programmierer niemals explizit "neu" in seinem eigenen Code aufruft. Dies scheint nach Speicherlecks zu fragen.
Mein zweiter Gedanke war daher, eine Menge abgeleiteter Klassen aus H5 :: H5File und H5 :: H5Group mit Konstruktoren zu erstellen, die keine Ausnahmen auslösen, wenn die Datei noch nicht existiert oder wenn die übergeordnete Gruppe der Gruppe dies tut noch nicht vorhanden. Mein Versuch für die abgeleitete Dateiklasse war wie folgt:
%Vor%Das Problem, auf das ich stoße, ist ein zweifaches. Erstens, der try / catch-Block im Konstruktor löst die durch
erstellte Ausnahme erneut aus %Vor%Wenn die Datei nicht existiert, wird das Programm beendet. Das zweite Problem ist, dass ich nicht sicher bin, dass der zweite Konstruktor,
%Vor%ist korrekt (d. h. konstruiert es die Elternklasse?) Gibt es eine Möglichkeit, dass die abgeleitete Klasse im Konstruktor der Basisklasse Ausnahmen abfängt und dann einen anderen Konstruktor für die Basisklasse aufruft?
Allgemeiner kann jemand an einen besseren / eleganteren Umgang mit diesen Mängeln der HDF5 C ++ - Bindungen denken?
Ich bevorzuge Ihre ursprüngliche Idee, einige einfache Hilfsfunktionen zu erstellen - es wird einfacher sein und die Menge an Code minimieren, die Sie schreiben und dokumentieren müssen. Um eine ordnungsgemäße Speicherverwaltung sicherzustellen, können Sie außerdem shared_ptr
verwenden.
Hier ist eine einfache Wrapper-Funktion, die Ihrem ursprünglichen Beispiel entspricht:
%Vor%In den HDF5 C ++ - Bindungen wird jedoch durch Erstellen einer Gruppe, deren Elterngruppe nicht existiert, eine Ausnahme ausgelöst.
Sie können die Link-Erstellungseigenschaftsliste auf fehlende Zwischengruppen erstellen festlegen und vermeide diese Ausnahme. Zum Beispiel:
%Vor%Tags und Links c++ inheritance hdf5