🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: de.comp.lang.c++
3 messages
3 total messages Started by Joachim Gudermann Thu, 22 Feb 1996 13:37
Datenkapselung
#1616
Author: Joachim Gudermann
Date: Thu, 22 Feb 1996 13:37
40 lines
1327 bytes
Hallo C++ler!

Ich habe folgendes Problem:

class XXX
  ...
  public:
    void PutData(???);
  ....

  protected:
    Struktur1* theStruct1Dat;
    Struktur2* theStruct2Dat;
    Strukturn* theStructnDat;
    ...

Struktur1-3 sind vorher per typdef definiert worden und enthalten  
unterschiedlich viele Variablen von Typ BOOLEAN (short int) und char[10].

Um jetzt aus anderen Modulen Daten dieser Strukturen zu veraendern, soll  
ausschliesslich die Funtion PutData verwendet werden.
Dieser werden als Parameter mitgeteilt,
        welche Struktur zu aendern ist,
        welches Element zu aendern ist,
        der neue Wert.

Nur laesst sich nicht sagen, von welchem Typ die Parameter jeweils sind.

Muss ich jetzt verschiedene PutData-Funktionen schreiben, oder lassen sich  
alle Faelle mit einer Funktion erschlagen?




Bis denne,
             Joachim

--
"Gotta make a million doesn't matter who dies."
                                Queensryche - Revolution calling
Re: Datenkapselung
#1627
Author: Watson
Date: Fri, 23 Feb 1996 18:00
67 lines
2569 bytes
Joachim Gudermann wrote:
> class XXX
>   ...
>   public:
>     void PutData(???);
>   ....
> 
>   protected:
>     Struktur1* theStruct1Dat;
>     Struktur2* theStruct2Dat;
>     Strukturn* theStructnDat;
>     ...
> Um jetzt aus anderen Modulen Daten dieser Strukturen zu veraendern, soll
> ausschliesslich die Funtion PutData verwendet werden.
> Dieser werden als Parameter mitgeteilt,
>         welche Struktur zu aendern ist,

Wie willst Du die denn ermitteln? Einzige Moeglichkeit, die
mir einfaellt ist:

Fuer 1: (Struktur1*)&this->theStruct1Dat
Fuer 2: (Struktur2*)&this->theStruct1Dat + sizeof(Struktur1*)
Fuer n: (Strukturn*)&this->theStruct1Dat + sizeof(Struktur1*) + sizeof(Struktur2*) + ... + sizeof(Strukturn-1*)

Das wird ja huebsch haesslich werden. Unter der Voraussetzung,
dass gilt:

sizeof(Struktur1*) == sizeof(Struktur2*) == .. == sizeof(Strukturn*)

(was aber nicht gilt, aber darauf kommt's bei dieser Biegerei
wohl nicht mehr an).
kannst Du auch schreiben:

(Strukturi*)&this->theStruct1Dat + (i-1)*sizeof(Struktur1*)
Oops, schon wieder so unaesthetisch...

>         welches Element zu aendern ist,
Dito.

>         der neue Wert.
> Nur laesst sich nicht sagen, von welchem Typ die Parameter jeweils sind.

Polymorphe Parameter packt man ueblicherweise in eine Struktur, die
etwa so aussieht:

struct blubber {
	enum { TYP1, TYP2, ..., TYPn } tag;
	union {
		typ1 typ1_val;
		typ2 typ2_val;
		...
		typn typn_val;
	} valueHolder;
};

> Muss ich jetzt verschiedene PutData-Funktionen schreiben, oder lassen sich
> alle Faelle mit einer Funktion erschlagen?

Ich empfehle Dir, Dein Design zu ueberdenken. Wenn Du eine
Klasse verwendest, willst Du ja eigentlich die darin ent-
haltene Struktur verwenden, und nicht selbst herleiten,
in welchen Speicherbereich Du schreiben musst.
Das hier ist purer Heavy Metal ;-)
-- 
*	Greetinx from Watson (sayegh@fokus.gmd.de)
	http://www.fokus.gmd.de/ovma/employees/sayegh/entry.html
	signal(SIGSEGV,SIG_IGN);
Re: Datenkapselung (Korrektur)
#1628
Author: Watson
Date: Fri, 23 Feb 1996 18:05
16 lines
1176 bytes
Ist mir doch tatsaechlich wieder was schlimmes
passiert, es handelt sich dabei ja um Zeiger
auf Zeiger (macht die Sache noch etwas unan-
sehnlicher):

> Fuer 1: (Struktur1**)&this->theStruct1Dat
> Fuer 2: (Struktur2**)&this->theStruct1Dat + sizeof(Struktur1*)
> Fuer n: (Strukturn**)&this->theStruct1Dat + sizeof(Struktur1*) + sizeof(Struktur2*) + ... + sizeof(Strukturn-1*)

Und nochmal: 
> (Strukturi**)&this->theStruct1Dat + (i-1)*sizeof(Struktur1*)

-- 
*	Greetinx from Watson (sayegh@fokus.gmd.de)
	http://www.fokus.gmd.de/ovma/employees/sayegh/entry.html
	signal(SIGSEGV,SIG_IGN);
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads