🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: de.comp.lang.c++
Article #1627

Re: Datenkapselung

#1627
From: 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);
Technical Details
Message-ID: <312E00C2.5DA@fokus.gmd.de>
Path: arc1-ca.pugleaf.net!stern.fokus.gmd.de!news
References: <MSGID_2=3A2448=2F413.50_c1aeaca1@fidonet.org>

Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!stern.fokus.gmd.de!news
From: Watson <sayegh@fokus.gmd.de>
Newsgroups: de.comp.lang.c++
Subject: Re: Datenkapselung
Date: Fri, 23 Feb 1996 19:00:34 +0100
Organization: GMD FOKUS - Research Institute for Open Communication Systems
Message-ID: <312E00C2.5DA@fokus.gmd.de>
References: <MSGID_2=3A2448=2F413.50_c1aeaca1@fidonet.org>
NNTP-Posting-Host: pollux.fokus.gmd.de
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-2
Content-Transfer-Encoding: 7bit
X-Mailer: Mozilla 2.0 (X11; I; SunOS 5.4 sun4m)