www.mikrocontroller.net

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


Autor: JkaliPd (Gast)
Datum:

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

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn du sie anstatt private als protected deklarierst...

Autor: JkaliPd (Gast)
Datum:

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

Autor: Hagen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hagen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: JkaliPd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genau das mit getter und setter Funktionen mein ich!

Nur ich bekomm es irgendwie nicht zum laufen !!


C Benutz ich

Autor: Hagen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: JkaliPd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich checks nicht ??!?!?!?!

verfickte scheisse der kack geht einfach nicht

Autor: JkaliPd (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;-)

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.