Aufbau von Klassen
-
Hallo Leute,
Dies ist der mir bekannte Aufbau von Klassen:
class X : Basisklasse(n) { friend Funktion(en) private: ... protected: ... public: ... };Allerdings hab ich letztens beim rumgooglen eine Klasse gefunden in der eine Funktion auserhalb der drei Zugriffsspaten und ohne den Zusatz friend deklariert wurde..:
class X : Basisklasse(n) { void bla(...); // ??? friend Funktion(en) private: ... protected: ... public: ... };War das einfach nur ein Fehler oder geht das wirklich, und wenn ja wie sieht das dann mit den Zugriffsrecht aus??

-
private
-
Achso alles kla.. Dann ist private = default
Danke für die schnelle Hilfe.
-
Mit dem Schlüsselwort
classist es defaultprivateund wenn du eine Klasse mit dem Schlüsselwortstructdefinierst, dann ist defaultpublic.
Das giltet übrigens auch für die Vererbung.
-
Mal noch eine weitere Frage:
Unter welchen Umständen leg man wie eine Klasse an (statisch, dynamisch, statische Member etc.)??
-
Generelle Antwort: Wenn es Sinn macht.
Allerdings verstehe ich nicht ganz, was du genau meinst. Was meinst du mit eine Klasse dynamisch oder statisch anlegen?
Statische Member benutzt du, wenn sie Sinn ergeben. Sprich die Funktion logisch zur Klasse gehört, aber an keine Instanz davon gebunden ist (z.B eine Factor Methode).
-
Schonmal danke..
Ich meine:
Dynamisch:
TEST* CTest = new TEST(); CTest->Do();Statisch:
TEST CTest; CTest.Do();Statische Member
class BLA{ public: static void main(); }; void main(){ BLA::main(); }Wann benutze ich was??

-
Das ist nicht statisch, sondern automatisch.
Um mal kurz die Namen zu korrigieren. In C++ hast du 3 Speichermodelle.- Dynamisch
- Automatisch
- Statisch
Dynamisch musst du dich selbst um das zerstören mit delete/[] kümmern, wenn du es per new/[] anforderst.
Automatisch ist das, was du statisch nennst und da erzeugst du in einem lokalen Scope (Bereich) eine Variable, welche automatisch wenn der Bereich beendet ist wieder zerstört wird. Das kann innerhalb einer Klasse oder einer Funktion sein.
Dann hast du die statischen Objekte, welche während des ganzen Progammes leben und erst am Ende des Programmes zerstört werden (automatisch).void foo () { int n; // automatisches Objekt lebt nur in foo int* pn = new int; // dynamisches Objekt lebt bis es zerstört wird static int sn; // statsiches Objekt lebt von hier an bis ans Ende des Programmes }Und benutzen solltes du eben das, was du gerade brauchst. Das heisst grundsätzlich solltest du automatische Objekte bevorzugen, weil die nur so lange leben wie nötig. Dynamsiche Objekte braucht man nicht ganz so oft und wenn, dann am besten in Verbindung mit einem Smart Pointer, welcher dann das zerstören übernimmt. Statische Objekte braucht man noch weniger als dynamische.
Wenn du also meinst, dass du etwas anderes, als ein automatisches Objekt brauchst, dann überleg dir das noch einmal gut (und/oder frag hier nach, ob es angebracht ist).
-
Ich meine doch automatisch

Und so die Funktionsweisen und wie man diese richtig benutzt weiß ich ja..
Mein Problem ist halt nur ich weiß nich wann dynamisch und wann automatisch.. Hab bis her einfach alles dynamisch angelegt
(und was ist ein Smart Pointer???)Zu meinem Beispiel mit den statischen Memberfunktionen - das hab letztens beim googlen gesehen. Da wurden alle Member statisch angelegt und unter main stand nicht mehr wie oben.. Macht sowas sinn??
-
Nein! Mach als default automatisch!
Dynamisch brauchst du "nur", wenn du wirklich eine Lebenszeit brauchst, welche über den Scope geht, wo du das Objekt erzeugst (gibt natürlich noch ein paar Ausnahmen, aber egal).
Zu der statischen Funktion: Naja ist wohl eher Geschmackssache. Das mit der Klasse erinnert sehr an Java. Allerdings habe ich meist auch nicht viel in der main.
Für Smart Pointer besuchst du Wikipedia.
Grob gesagt verwaltet ein Smart Pointer einen Zeiger intelligent (daher der Name). Das heisst, dass es ein Objekt, welches du selbst verwalten musst verwaltet und dich so nicht um die Freigabe kümmern musst obwohl du es dynamisch angeforderst hast.
-
Achso ok jetzt hab ichs kapiert

Und das mit dem Smart Pointer echt nicht schlecht..
Danke für die Hilfe
