oop protectete variablen ausgeben.

pointhi

Erfahrenes Mitglied
hallo, ich will protectete variablen ausgeben, die in einem namespace, und dann in einer class sind. Das ist mein erstes programm wo ich richtig oop proggrammieren will, hab daher noch nicht so viel erfahrung darin.

zurzeit versuche ich eine header-datei mit den nötigen funktionen zu schreiben, und zum testen hab ich versucht eine der protecteten variablen auszugeben (ohne vorherige initialisierung). mir gings nur darum ob der compiler das zuläst, leider ohne erfolg.

meine main.cpp:

Code:
#include <iostream>
#include "satpos.hpp"


using namespace std;
using namespace satpos;

int main()
{
    satpos::tracking track;

    cout << track.tle_klass;

    return 0;
}

Hier versuche ich also vom "element" track das von der klasse satpos::tracking "generiert" wird die variable tle_klass auszugeben, was gläglich scheitert. Wenn ich tle_klass public in der satpos.hpp als public markiere funktioniert es aber.

Hier die aktuelle satpos.hpp

Code:
#ifndef _SATPOS_H
#define _SATPOS_H

#include "cmath"

namespace satpos
{
    class tracking {

 //#################### Variablen

        public:     // Öffentliche Variablen

        protected:  // Geschützte Variablen

        unsigned char       tle_klass;          // Klassifizierung

        private:    // Unsichtbare Variablen


//#################### Funktionen

        public: int tle_input(char *tle);
            // ...
    };
}

#endif

Ich hab alle anderen Variablen mal herausgelöscht, die sind alle auch in dem protectet-bereich. Das ganze will ich am besten so wie eine struct benutzen können, halt mit private, funktionen, ect.
Wisst ihr was ich falsch mache?

Frage:

Ich möchte später mehrere dieser selbstdefinierten variablen benutzen. Muss ich die variable jedesmal übergeben (ich meine solche variablen: satpos::tracking track;) oder gibt es da eine einfachere möglichkeit mit this oder so ähnlich?

mfg. pointhi
 
Hi.

protected bedeutet nun mal, dass man "von Außen" keinen Zugriff hat. Ich verstehe nicht was dich jetzt da so erstaunt... :confused:

OOP Stichwort: data hiding.

Du solltest eine get Methode implementieren, die den Wert des Attributs zurückgibt:
C++:
class tracking {
...
public:
  unsigned char get_tle_klass() const { return tle_klass; }

};
Und bitte halte dich an die Netiquette, insbesondere Groß-/Kleinschreibung! Danke.

Gruß
 
was ist bei der nettique falsch?, weiß leider noch nicht alle regeln.

frage, bei SDL kann man z.b. die struktur SDL_Surface* "erstellen", dabei sind manche variablen protectet, andere nicht. auch kann man sie wie eine normale variable in arrays "gliedern". Das wäre auch mein ziel, aber ich hab bei dem programm weitergemacht und ich müsste bei der aktuellen version : z.b. track.tle_out(&track); eingeben, aber ich will dann tle::tle_out(&track) oder tle.tle_out(&track) nutzen, wie mach ich das?

mfg. pointhi
 
Hi

Zur Netiquette:
Und bitte halte dich an die Netiquette, insbesondere Groß-/Kleinschreibung! Danke.
Hier steht schon, was falsch ist.
Wenn du es gern nachlesen willst, einen Link zu den kompletten Regeln
gibts auf jeder Seite im Forum ganz unten, oder direkt unter meinem Beitrag.

Im Gegensatz zu facebook & Co. wird hier Wert auf korrektes Deutsch gelegt.



Zu protected: Wie deepthroat schon gesagt hat, ist es ja eben der Sinn von protected,
dass man nicht von außen zugreifen kann.
Wenn du das willst, mach entweder wie von ihm gezeigt eine Methode, oder nimm nicht protected.



Zu SDL_Surface: Ja, mit dem kann man auch Arrays machen.
Unabhängig vom Inhalt (protected etc).

Den Rest hab ich nicht verstanden.
Was hast du vor?
Was ist track usw.?
Relevanter Code?
 
was ist bei der nettique falsch?
Gar nichts. Aber du solltest Gross-/Kleinschreibung beachten und grundsätzlich die deutsche Sprache nicht allzu sehr misshandeln.
2. Problem: Wieso das denn? Ich sehe hier keine Klasse tle?

Gruss
cwriter

/EDIT Zu spät
@sheel
C++:
satpos::tracking track
 
Zuletzt bearbeitet:
Ich habe wärend dem posten bei dem Projekt weitergearbeitet. Darum villeicht auch diese unklarheiten.

Mal zu den Fragen:

Ich will einen Namspace/Class schreiben die aus einer TLE-Datei aktuelle Satelitenpositionen berechnet. Das ganze soll so OOP wie nur möglich sein. Ich will von den "normalen" C-Funktionen zu class, namespace,... wechseln. Wenn das ganze gut funktioniert werde ich das ergebnis auch onlinestellen zum weiterarbeiten. Ich hab zurtzeit keine richtige opensource-Bibliotek zu diesem Thema gefunden, und bei fertigen Programmen sind mir ungereimtheiten aufgefallen die auf fehlende aktuallisierung / falschen daten hinweisen. Ich mach lieber alles selber und versteh danach auch wie das ganze funktioniert. Und villeicht brauch jemand anderer das auch einmal später.

Was ist track usw.?

track ist einfach irgendein name, also nur zum testen. ich hätte ihn auch asdfjlhasjdfla nennen können :). Auch arbeite ich erst seit heute an der Programmierung von diesem Projekt, und nein, ich hab kein UML-Erstellt, da ich simultan die Bibliotek schreiben will, mich in die Materie einarbeite und eine Excel-Tabelle zum testen schreibe. Ist nicht optimal aber ich kann nicht 1 Woche lang programmieren oder nur lesen. Und aktuell schreibe ich die grundlage der Bibliotek. Das ist noch relativ unabhängig von den späteren klassen.

Warscheinlich muss ich den kompletten code noch einmal überdenken. Also schreibe ich mal nicht den kompletten code hinein, besteht auserdem eigentlich zu einem drittel aus variablendeklarationen.

Was ich will:

Eine Bibliotek schreiben die komplett OOP ist mit diesen Möglichkeiten:

Mit strukturen/klassen wo einzelne Bereiche wie bei SDL protectet, andere public sind. Was nützt sich protectet wenn es auch private gibt?

Es soll einen namespace aus sicherheitsgründen geben, wie "std" also. Auch soll das ganze dann in einzelne Klassen aufgeteilt werden. Eine, wird warscheinlich "tle" heißen und die Funktionen "tle_load" und "tle_out" besitzen. Sie muss auf die entsprechende struktur/klasse wo alle Daten liegen vollen schreibzugriff besitzen. Ansprechen soll ich sie am besten z.b. mit satpos::tle.tle_out(); oder satpos::tle::tle_out(); können. Könnte falsch sein so wie ich es gerade geschrieben habe, hab davon noch nicht so viel erfahrung. Darin soll ich dann die struktur/klasse mit den entsprechenen funktionen übergeben können.

Das sollte in etwa mein ziel sein. Wenn irgendetwas bei meiner erklärung nicht verstanden wird, ich bin leider kein profi mit fachausdrücken. Musst schon relativ lange googlen damit ich ein Beispiel für klassen in einem namespace gefunden habe. Also bei unklarheiten einfach fragen. Villeicht schaffe ich eine UML zu zeichen. Ich hab mir extra für das Projekt das Buch "Von den Grundlagen zur professionellen Programmierung" ausgeliehen.


Ich hoffe die Nettiquette stimmt jetzt in etwa.

mfg. pointhi
 
Zuletzt bearbeitet:
Solange du nichts mit Vererbung zu tun hast, ist private und protected komplett gleich.

Und so viel wie möglich OOP...
ich werf einfach mal ein paar Stichworte in den Raum, bei genaueren Fragen immer her damit :)

Konstruktor/Destruktor
Copykonstruktor, =-Operator
public/protected/private
Einfache Pattern

Und nur wegen uns musst du kein UML-Zeichnen üben, falls du es sonst nicht brauchst :)
In Worten verstehen wir es auch, und können dir zum Aufbau dann auch so Verbesserungsvorschläge geben.

Gruß
 
Ich werde das ganze noch einmal schrittweise abarbeiten.

Meine erste Frage:

wenn ich z.b.:

Code:
class tle{
public:
//Variablen
};

definiere, kann ich dann das machen:

Code:
tle tle_satelliten[10];

,also wie bei struct eine array anlegen?
Und kann ich die class irgendwie auf main vererben für protectet? Man soll ja nur so viel Zugriff zulassen wie nötig. Settern und Gettern würde bei der Anzahl von Variablen irgendwann unüberschaubar.

Und ist es bei OOP möglich ohne instanzen für die funktionen zu erzeugen zu arbeiten?
Muss man da dann alles mit namespace machen?
,also wie z.b. bei C# der befehl "system.io.text.output("text");" Mir gefällt das Programmierdesign, da man das Objekt immer genauer definiert und der Zusammenhang klar nachvollziehbar ist.

Pattern ist eine gute idee, aber z.b. Fassade ist mir nicht aussagekräftig genug :). Da hat man keine idee was dahinter steht.

mfg. pointhi
 
Zu der Frage mit dem Array: Natürlich, das geht problemlos.
Man kann von jeder Variablenart Arrays machen.

Zu "auf main vererben": Vererben kann man nur zw. Klassen.
Main ist keine.

Wenn es Nicht-public-Variablen in einer struct/class gibt,
muss es auch Funktionen (heißt eigentlich Methode) in der Klasse geben,
die diese Variablen irgendwie verwendet.
Sonst kann die Varialbe ja überhaupt nicht verwendet werden und ist damit sinnlos.

Es müssen ja nicht unbedingt Getter/Setter sein, mit denen man ziemlich direkt den Wert beeinflussen kann. Es können ja auch Variablen sein, die nur intern von den Klassenmethoden verwendet werden; von denen man außen gar nichts merkt.

Zu den namespaces:
Wäre eine Möglichkeit für das Vorhaben C#-Art.
Den gleichen Effekt hätte eine Klasse, in der alles "static" gemacht wird.

Bei der static-Variante kann man ggf. auch mischen:
Eine Klasse zum Instanz-erzeugen, die aber auch static-Teile für das Instanzen-lose drin hat.
 
static ist eine gute idee, ich werde morgen einen neuen Versuch für die Programmierung anstellen. Die Variablen werden zunächst mal alle public definiert, kann das ja später noch immer ändern.

mfg. pointhi
 
Zurück