CodeDesign
-
Hallo Forum,
zuallererst: Ich habe die Threads aus der FAQ gelesen.
Nehmen wir an ein Programm besteht aus 2 Komponenten:
- Eine Gui (MFC Geschlabber)
- Ein Berechnungsmodul (aus mehrere Klassen)Es muß nun etwas berechnet werden was eine Variable Länge hat (Pointerarray, char *). Dann muß der Aufrufer (Gui) den Speicher verwalten. Aber im BM ist die Information wie viel Speicher benötigt wird. Wie würdet Ihr das machen?
Im Moment habe ich für jede Berechnung eine Methode in einer Klasse. Dies Methode fordert den Speicher an und stellt das Ergebnis in einer zweiten Get Methode ReadOnly bereit. Was ist in solchen Situationen das normal Handling?
Viele Grüße
Der Klenk
-
Hallo
Wenn du schon mit Klassen im Interface arbeitest, warum nimmst du nicht gleich auch std::vector?
Wenn das Interface doch in C ist und die Klassen nur intern, hat sich dieses Prinzip als praktikabel herausgestellt
DatenTyp ... // Definition der Daten DatenTyp* CreateData(); // Funktion in DLL reserviert Speicher FreeData(DatenTyp* daten); // Funktion in DLL gibt Speicher freiAuf keinen Fall solltest du das mischen, zum Beispiel das new in der DLL ausgeführt wird und delete im Hauptprogramm.
bis bald
akari
-
Hallo Akari,
Vektoren habe ich noch nicht benutzt. Wer macht das delete für den Vektor? Das müsste ja dann außerhalb des Berechnungsmoduls geschehen wo der Speicher angefordert wurde?
Zu Deinem Beispiel: FreeData wäre eine Funktion in der DLL die den Speicher wieder freigibt und als Paramter einen Zeigen auf diesen erhält? Das müsste dann auch von außerhalb aufgerufen werden? Ich kann schwer glauben das sich sowas durchgesetzt hat?
Ich dachte mehr an einen Ansatz wo GUI und Berechnungsmodul strikt getrennt Ihren Seicher verwalten. Das die Daten entweder kopiert werden oder bei der Zersörung des Klassenobjektes auch zerstört werden.
class DoCalculation { public: DoCalculation(int param1, char *param2); // Hier wird m_cResult angelegt. ~DoCalculation(); // Hier wird delete m_cResult gemacht. char *m_cResult; // Diese 'GetFunktion' muß ich später nochmal überdenken, weil m_cResult geändert werden könnte... // zB woander hinzeigen könnte, so dass das delete im Destruktor scheitern würde. } int main () { DoCalculation *oCalc; char *ABC; oCalc = new oCalc(33, "abc"); // Hier steht Code für: Kopiere oCalc->m_cResult nach ABC. delete oCalc; // Mache etwas mit ABC; delete ABC; }