Forum: PC-Programmierung Automatisches Starten von Init-Funktionen


von hopplahopp (Gast)


Lesenswert?

Hi, in Python kann ich das machen:
1
class MeineKlasse:
2
   def __init__(self):
3
      tu was...
4
5
Hexe = MeineKlasse()

Beim Zuweisen von Hexe=MeineKlasse wird automatisch 
__init__()-Konstruktor aufgerufen.


Geht das mit C-Klassen auch?
1
class MeineKlasse {
2
  int function_1();
3
  int fungtion_2();
4
};
5
6
int MeineKlasse::function_1() {
7
   printf ("\n Tuetensuppen schmecken lecker");
8
   return (1);
9
}
10
11
int MeineKlasse::function_2() {
12
  return (0);
13
}

Kann ich es in C so machen, dass ich - wenn ich das mache:

MeineKlasse Tuetensuppen;

dann automatisch wie in Python eine Funktion gestartet wird? Oder kann 
ich das nicht machen, sondern muss etwas anderes machen, um eine 
Klassen-Init-Funktion aufzurufen, durch einen Direktaufruf?

Es gibt ja auch die Schlangenfunktionen mit Destruktorfunktion, die dann 
ausgeführt wird, wenn die Klassenfunktion nicht mehr gebraucht werden 
soll:
1
int MeineKlasse::~function_2() {
2
  printf ("\n Tütensuppen sind nun alle");
3
}

also es gibt ja da dann auch diese De- und Konstruktoren scheinbar, oder 
gibt es die dann nur in C++ und nicht in C?

von Helfer (Gast)


Lesenswert?

Hi hopplahopp,
ja, die Konstruktoren sind schon das, was in Python die Init Funktion 
ist.
Allerdings sind Konstruktoren und Klassen nicht im C Sprachumfang 
enthalten. Das ist der Unterschied zu C++.
Dort werden Konstruktoren werden automatisch bei der Instanziierung von 
Klassen aufgerufen, also dann, wenn so etwas in deinem Code steht:
1
MyClass instanz;
2
MyClass ptr_instanz2 = new MyClass();

Ein Konstruktor/Destruktor wird folgendermaßen deklariert:
1
class MyClass{
2
  public:
3
   MyClass(); //Konstruktor
4
   ~MyClass(); //Destruktor
5
   //more Code...
6
}

Gruß
Helfer

von hopplahopp (Gast)


Lesenswert?

Helfer schrieb:
> Ein Konstruktor/Destruktor wird folgendermaßen deklariert:

Ach so - der Kon- und Destruktur müssen dann den gleichen Namen haben 
wie die Klasse? Aber es gibt doch in C auch den Befehl class für die 
Klassenbildung. Warum gibts den denn dann auch in C?

von Helfer (Gast)


Lesenswert?

Ja, genau, die Klasse, Kon- und Destruktor müssen den Selben Namen 
haben.

Aber bei dem Rest verwechselt du etwas. Das Schlüsselwort class kennt C 
in keiner Version. Das ist erst in C++ dazu gekommen. C ist zur 
prodezuralen Programmierung entworfen worden, erst mit C++ kam eine 
richtige Objektorientoerung (durch das Klassenkalkül) dazu.
Das heißt: Alles, was mit C geht, geht auch mit C++, aber nicht alles 
was mit C++ geht, geht auch mit C.
Vielleicht solltest dir nochmal ein bisschen Zeit nehmen, in ein C, bzw. 
C++ Buch einzulesen und dieses durchzuarbeiten, sodass dir die 
Grundlagen klarer werden.

von Vn N. (wefwef_s)


Lesenswert?

hopplahopp schrieb:
> Aber es gibt doch in C auch den Befehl class für die
> Klassenbildung.

Nein.

von Karl Käfer (Gast)


Lesenswert?

Hallo,

hopplahopp schrieb:
> Helfer schrieb:
>> Ein Konstruktor/Destruktor wird folgendermaßen deklariert:
>
> Ach so - der Kon- und Destruktur müssen dann den gleichen Namen haben
> wie die Klasse? Aber es gibt doch in C auch den Befehl class für die
> Klassenbildung.

Nein, den gibt es in C eben nicht. Genau genommen, gibt es auch in 
Python und C++ keinen "Befehl", der "class" heißt. Schon deswegen, weil 
das in C++ und Python ein Schlüsselwort ist, das in Python und C++ die 
Deklaration einer Klasse einleitet. Darauf folgt, in Python wie in C++, 
dann der Name der Klasse, die Eltern, von denen diese Klasse erbt, und 
hierauf folgt dann die Definition der Klasse.

Wie dann der Konstruktor und der Destruktor einer Klasse heißen, bleibt 
dem Entwickler der jeweiligen Sprache vorbehalten. Der BDFL hat für sein 
Python entschieden, daß die Konstruktoren "__init__()" und Destruktoren 
"__del__()" heißen sollen, Bjarne Stroustrup hat sich für C++ dagegen 
dazu entschieden daß Konstruktoren und Destrukroten den Namen der Klasse 
haben sollen, und den Destruktoren zusätzlich eine Tilde ("~") 
vorangestellt wird.

Python:
1
class MingKlass():
2
  def __init__(self):
3
    self.i = 5

C++:
1
class MingKlass {
2
public:
3
  int i;
4
  MingKlass(void) {
5
    this->i = 5;
6
  }
7
};

In beiden Fällen wird eine Klasse "MingKlass" deklariert, und in deren 
Konstruktor der Variablen "i" der Wert "5" zugewiesen. "Deklarieren" 
heißt hier: Du sagst dem Compiler/Interpreter, daß Du einen Datentyp mit 
dem Namen "MingKlass" benutzen willst, der so aussieht und sich so 
benimmt, wie dann im Folgenden beschrieben.

Aber bereits in diesem einfachen Beispiel siehst Du zwei Unterschiede: 
in Python wird dem Konstruktor als erster Parameter die Instanz der 
Klasse übergeben (das muß übrigens nicht "self" sein, ist aber gute 
Praxis [1]), während in C++ nichts (void) übergeben wird, aber auf 
einmal magisch die Variable "this" auftaucht, die ein Zeiger auf die 
Instanz der Klasse ist.

Der zweite gravierende Unterschied ist: dank Autovivikation mußt Du in 
Python Deine Variable "i" nicht deklarieren, die wird einfach erzeugt 
sobald Du schreibend darauf zugreifst. In C++ hingegen mußt Du Deinem 
Compiler nicht nur bekanntmachen, daß Du eine Variable "i" benutzen 
willst, sondern im obendrein noch sagen, daß diese Variable vom Datentyp 
"int" sein soll. Und während Du in Python Deiner Membervariablen "i" 
später problemlos den Wert "fünf" zuweisen kannst (PEP263 beachten!) 
wird C++ sich dem Versuch vehement widersetzen, einer "int"-Variablen 
etwas zuzuweisen, dessen Datentyp nicht "int" ist.

Du siehst: obwohl beide Programmiersprachen (und viele andere) dieselben 
Schlüsselworte haben und diese sogar grob dasselbe tun, handelt es sich 
dennoch um zwei völlig verschiedene Programmiersprachen.

In C gibt es keine Klassen, und auch das Schlüsselwort "class" existiert 
nicht in C. C ist nämlich wieder eine andere Programmiersprache als C++, 
auch wenn C++ eine Weiterentwicklung und Erweiterung von C ist -- und 
zwar um genau die objektorientierten Konzepte, für die man Klassen 
braucht.

HTH,
Karl

[1] Das funktioniert genauso wie der Code oben:
1
class MingKlass():
2
  def __init__(klausdieter):
3
    klausdieter.i = 5

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.