Einsatz von Library
-
Hallo,
ich verwende den Keil Relaview C++ Compiler fuer ARM Controller und möchte eine Klasse in eine Bibliothek verpacken, die ich dann anderen Programmen mit einer include Datei zur Verfügung stelle. Das funktioniert soweit auch, nur muss ich in der Include Datei auch alle privaten Mitglieder auflisten, damit das Programm, welches die Bibliothek einbindet, die Größe ermitteln kann. Ich möchte aber die privaten Mitglieder nicht in der Header Datei aufscheinen lassen. Hier ein kurzes Beispiel:
1. Teil, welcher in Library eingebunden wird (clsCrc.h):
#ifndef CLS_CRC_H
#define CLS_CRC_Hclass clsCrc
{
private:
int Crc;public:
clsCrc(); // Constructor
int GetCrc(void);
};
#endif2. Teil, Applikation, welche die obige Library einbindet.
#include "clsCrc.h"
int main (void)
{
static clsCrc oCrc[3];
static int iCrc;iCrc = oCrc[0].GetCrc();
while(1)
;
}Meine Frage nun:Ist dies der falsche Weg bzw. wie wird das üblicherweise gemacht.
Hoffe, jemand kann mir dazu etwas sagen.
Danke im Voraus
Eugen
-
Die meisten Programmierer nehmen ganz einfach zur Kenntnis, daß Anwender auch die privaten Elemente ihrer Klassen sehen können (ohne üble Hacks kann der Anwender sowieso nicht mehr machen als sich Gedanken über deine Namenskonvention zu machen ;)). Wenn du die Daten unbedingt verstecken willst, kannst du einen Proxie anlegen:
//Lib.h struct lib_impl; class lib { private: lib_impl* data; public: //die folgenden Member sind nötig, um die dynamischen Daten zu verwalten: lib(); lib(const lib&); ~lib(); lib& operator=(const lib&); //deine eigenen Methoden int get_data1(); }; //lib.cpp struct lib_impl { int data1; }; lib::lib() : data(new lib_impl) {} lib::lib(const lib& other) : data(new lib_impl(other.data)) {} lib::~lib() {delete data;} lib& lib::operator=(const lib& other) { if(this!=&other) { delete data; data = new lib_impl(other.data); } return *this; } int lib::get_data1() { return data->data1; }
-
Hallo CStoll,
vielen Dank für die rasche Antwort. Also liege ich mit meinem Ansatz zumindest nicht ganz daneben. Ich dachte nur, nachdem der Anwender sowieso nichts anfangen kann damit, braucht er es auch nicht zu sehen. Ein anderer Grund war,
daß im Falle einer Änderung in der Library wie z.B. ich brauche noch einige private Variablen, genügt es dem Anwender nicht die Library zu tauschen sondern er muss auch jedes mal die Header Datei tauschen, obwohl in diesem Falle die Änderung in der Header Datei ihn nicht betreffen würde.Aber gut, dann nehme ich das so zur Kenntnis. Mir war vor allem wichtig zu wissen, ob es auch noch andere Ansätze gibt.
Vielen Dank nochmals, du hast mir sehr geholfen.
Grüße
Eugen