Forum: PC-Programmierung privat Variable bei Vererbung weiterbenutzen??


von JkaliPd (Gast)


Lesenswert?

Wenn ich 2 Klassen habe, wobei eine die Basis der anderen ist. Wie kann
ich dann die PRIVATE Variablen der Basis-Klasse weiterbenutzen ?

von Christian (Gast)


Lesenswert?

wenn du sie anstatt private als protected deklarierst...

von JkaliPd (Gast)


Lesenswert?

das will ich aber eben gerade umgehen deswegen hab ich PRIVATE mit
großbuchstaben geschrieben !

von Hagen (Gast)


Lesenswert?

dann geht es nicht denn exakt das ist der Unterschied zwischen der
PRIVATE und PROTECTED Deklaration. PRIVATE soll verhindern das man
diese Member/Felder der Klasse ausserhalb des implementierenden Modules
= Unit, C Source oä. benutzen kann.

Christians Antwort ist also absolut korrekt.

Es gibt Wege wie man den Compiler überlisten kann, denn im Grunde ist
es nur eine virtuelle Beschränkung die der Compiler beim Parsen der
Sourcen vornimmt. Es ist also einzigst eine Frage der Syntax der
Programmiersprache.

Um nun denoch auf diese felder zugreifen zu können (ich beziehe mich
hier mal auf Delphi) genügt es die Klassendeklaration ohne Methoden
nochmal in die zweite Unit zu kopieren (samt privater Feldr/Member).
Nun kannst du per Typcast auf diese Felder zugreifen.
Guter Programmierstil ist das dann aber nicht mehr.


Gruß Hagen

von Hagen (Gast)


Lesenswert?

Du kannst aber auch in der Basis Klasse im Protected Abschnitt
sogenannte Getter- und Setter- Methoden implementieren. Über diese wird
dann auf die private deklarierten Felder zugegriffen. Für Properties
einer Klasse sollte man sowieso solche Zugriffs-Methoden benutzen. Da
sie nun wieder protected sind sind sie für dich erreichebar, aber deren
dahinterliegendes Datenfeld ist das es private ist immer noch
geschützt.

Übrigens: falsches Forum das hier ist (Zitat Joda)

Gruß hagen

von JkaliPd (Gast)


Lesenswert?

Genau das mit getter und setter Funktionen mein ich!

Nur ich bekomm es irgendwie nicht zum laufen !!


C Benutz ich

von Hagen (Gast)


Lesenswert?

Schade, da kann ich dir auch nicht soviel weiterhelfen. Will man mit
Objekten arbeiten dürfte C (ausser C#, da ja dort der richtige
Chefentwickler sein Werk vollendet hat) gegenüber Delphi stark im
Nachteil sein.

Bitte keine Diskussionen anfangen das man in C viel universeller ist,
das man Unions hat und so Objekte mischen kann und das man Overloads
auf Klassen hat. Das weis ich alles und halte davon überhaupt nichts,
denn die Grundidee der Objektorientierten Programmierung ist es eine
restriktive Schnittstelle den Programmiern in die Hand zu geben. Die
Features von C in diesem Sektor sind also eher kontraproduktiv.

Nur meine 10 Cent Meinung, wie gesagt keinen Glaubenskrieg anfangen,
bitte.

In deinem Falle definierst du eine Methode die ohne Rückgabeparameter
einen Parameter vom gleichen Typ wie das Member besitzt. In dieser
Methode wird einfach This.Member = Parameter gesetzt, das kannst du wie
in C übel-ig gleich in der Deklaration der Klasse als inline Makro
durchführen (kotz :)
Die andere Methode ist eine Getter Funktion die nur den gleichen
Datentyp zurückgibt, also return(This.Member); Oder auch wieder als das
übel-ige inline Makro gleich direkt in der Klassendeklaration einbauen.
Naja ihr wisst ja nun was ich davon halte.

Besser wäre es komplett diese beiden Methoden auszuimplementieren.
Später kannst du zb. in der Setter methode nämlich nachträglich noch
Typüberprüfungen, Inhaltsüberprüfungen, Aktualisierungen,
Neuberechnungen oder Benachrichtigung das sich das member geändert hat
implementiren.

In der Getter Methode könntest du statt einem Zugriff auf ein internes
Member dieses eventuell wegrationalisieren und so eine virtuelle
property erzeugen. Der zugrückgebene Wert wird also zur Laufzeit
dynamisch berechnet, statt gespeichert. Nach aussen verhält sich ds
ganze so als wäre es ein Member der Klasse.

Ansonsten: such im WEB es gibt haufenweise gute online tutorials.

Gruß Hagen

von JkaliPd (Gast)


Lesenswert?

Ich checks nicht ??!?!?!?!

verfickte scheisse der kack geht einfach nicht

von JkaliPd (Gast)


Lesenswert?

1.Klasse:


void vektor_2::eingabe()
{
  cout<<"Bitte geben sie einen X-Wert in [LE] ein: ";
  cin>>x;

  cout<<"Bitte geben sie einen Y-Wert in [LE] ein: ";
  cin>>y;
}

float vektor_2::betrag()
{
  return( sqrt( pow(x,2) + pow(y,2) ) );
}

void vektor_2::lesen()
{
  uebergeben_x = x;
  uebergeben_y = y;
}


2.Klasse:


float vektor_3::betrag_3d()
{
  lesen();

  return( sqrt( pow(uebergeben_x,2) + pow(uebergeben_y,2) + pow(z,2) )
);
}



main-Programm:



  cout<<"Die Strecke im 3-Dimensionalen Koordinatensystem ist
"<<objekt_3.betrag_3d()<<" [LE] lang!"<<endl;






...Sorry wenn ich nerve, aber mir ist dies gerade sehr wichtig!

Also ich hoff irgendjemand kann damit etwas anfangen!

Schonmal großen Dank im Vorraus;-)

von Chris (Gast)


Lesenswert?

> verfickte scheisse der kack geht einfach nicht

Und du wunderst dich ernsthaft über ausbleibende Antworten?



Schau dir mal Templates an (ernstgemeinter Tipp). Die sind für dein
Vorhaben (verschiedene Vektor-Größen) vermutlich viel besser geeignet.

Bzgl. deines letzten Postings: Was genau ist das Problem an diesem
Code? Ich nehme doch mal stark an, dass vector_3 mit vector_2 genau gar
nichts zu tun hat und keinesfalls davon erbt (das wäre sinnlos).

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.