[VC++] Wie funktionieren Klassen?!

SOD

Grünschnabel
Hallo zusammen!

Ich habe vor kurzen begonnen, Visual C++ zu lernen und mir das Buch "VC++6 in 21 Tagen" gekauft.
Ich habe auch schon etwas Erfahrung in C und weiß auch (glaube ich zumindest) dis Sache mit den Klassen halbwegs verstanden zu haben.
Aber:

Es war immer so, dass man eine MAIN-Funktion hatte, und von der dann in andere Funktionen gesprungen ist und mit Klassen ja eigentlich nur Variablen gesetzt und geändert hat. (2DPunkt.x - 2DPunkt.y)

Wenn ich mir aber jetzt so ein VC++ Programm ansehe, dessen Grundgerüst ja autom. erstellt wird, finde ich weit und breit keine MAIN-Funktion. Wo definiere ich denn z.B. globale Variablen? Das ganze Programm scheint nur aus Klassen zu bestehen.

Kann mir vielleicht jemand genauer erklären, was es nun wirklich mit den Klassen auf sich hat?

Danke,
SOD
 

Kachelator

Peter Jerz
Ui! Da hast du direkt was Kompliziertes ausprobiert!

Was Klassen sind, kann dir dein Buch besser erklären (würde hier zu lange dauern), aber das mit den 2DPunkten geht auch, sogar besser! Also nur Geduld und lies mal weiter!

Die vom Projekt-Assistenten angelegten Klassen sind nur Beispiele für besonders komplizierte, nicht immer elegante Klassen, die man z.B. für eine MFC-Anwendung benötigt. Aber das kann dir erstmal egal sein - versuch es erst einmal mit einer Konsolenanwendung. Dann wirst du nicht so mit Wizard-generierten Klassen totgeschlagen. Und die main-Funktion hast du dann auch direkt vor dir.

Eine Konsolenanwendung kannst du als neues Projekt anlegen. Du hast dann die Möglichkeit, ein "Hello World"-Projekt zu erzeugen. Versuch das mal.

Wenn dir das nicht weiterhelfen konnte, frag einfach nochmal nach.
 

SOD

Grünschnabel
Erstmal danke für deine Antwort.

Mir ist schon klar, dass meine Frage für mein Können etwas zu weit vorgegriffen ist.

Aber es ist nicht ganz so, dass ich von C keine Ahnung hab. Hab vor ca. einem Jahr schon mal begonnen, etwas C zu lernen und auch schon eine Konsolenanwendung programmiert - ein einfaches DirectX 2D Spiel mit Hilfe von Tutorials (Von Stefan Zerbst - Vielleicht kennt den jemand?)

Ich werde auch jetzt wieder mit einfachen Programmen beginnen - keine Frage. Hab mich aber voller Vorfreude gleich mal auf das Kapitel SDI-Anwendungen gestürzt und eine Anwendung erstellt (naja - eigentlich abgeschrieben) mit der mann mit der Maus Linien zeichnen kann. Und dabei ist mir aufgefallen, dass alles aus Klassen besteht.

Für mich ist eine Klasse ein Variablen-Typ so wie 'int'. Und desshalb ist mir nicht ganz klar, wie ein Programm, das nur aus Klassen besteht, funktionieren kann. Ein Programm mit lauter Deklarationen wird auch nie etwas tun - oder?

Vielleicht kann mir ja jemand eine kurze Erklärung geben, wie das wirklich zusammen hängt. Ich will auf gar keinen Fall eine Antwort, nach der ich dann ein Programm erstellen kann.

Danke nochmals für eure Mühe.

SOD
 

Kachelator

Peter Jerz
Für mich ist eine Klasse ein Variablen-Typ so wie 'int'. Und desshalb ist mir nicht ganz klar, wie ein Programm, das nur aus Klassen besteht, funktionieren kann. Ein Programm mit lauter Deklarationen wird auch nie etwas tun - oder?
Da hast du recht! :)

Im einfachsten Fall kann so ein Programm aber folgendermassen aufgebaut sein:
Code:
class meine_dolle_klasse
{
  public:
    int TuWasOderOderAuchNicht()
    {
      // irgendwas tun, meist hauptschleife oder auch nicht
      // vielleicht eingaben pollen
      return 0;
    }
};

// das Anwendungsobjekt:
meine_dolle_klasse theApp; // könnte auch lokal in Main definiert sein 

int main()
{
  // main startet nur ein Methode des Anwendungsobjektes
  return theApp.TuWasOderOderAuchNicht();
}

Auch bei den MFC-Anwendungen gibt es auch irgendwo (versteckt) eine main- (oder WinMain-) Routine. In der wird allerdings (einfach ausgedrückt) nicht viel mehr gemacht, als ein (globales) Applikations-Objekt zu initalisieren (Mit der Methode InitInstance() ). Das sorgt dafür, dass Fenster geöffnet werden usw. Danach tut die Anwendung im Normalfall nichts mehr, ausser auf Windowsnachrichten zu lauschen (zum Beispiel Mausklicks). Diese Nachrichten rufen dann Methoden deines Fensterobjektes auf, das von der Anwendung (theApp) geöffnet wurde. (Das sollte jetzt nur ein ganz kurzer Abriss sein; ich weiss, dass ich sehr stark vereinfacht habe.)

Hoffe, das hilft weiter.
 

Daniel Toplak

Erfahrenes Mitglied
...finde ich weit und breit keine MAIN-Funktion.
Die main-Funktion bzw. die WinMain() Funktion ist in einer Headerdatei definiert (in der WINBASE.H).
Die Implementation, ist in der Core-Lib der MFC.
D.h. sobald du eine MFC Anwendung mit dem Assistenten erstellst, wird diese Lib gebraucht und hat somit eine WinMain() Funktion.
Wo definiere ich denn z.B. globale Variablen?
Bei MFC hast du eine Instanz der Applikationsklasse (wird vom Assistenten generiert und benannt). Diese Klasse ist abgeleitet von der Klasse CApp und diese wiederum von anderen Klassen.
Letztendlich sind so ziemlich alle MFC Klassen von CObject abgeleitet, das ist die Basisklasse aller Basisklassen von MFC.
Zum Thema Globale Variablen:
"Ein guter Programmierer braucht keine globalen Variablen", nee im Ernst globale Variablen kannst du entweder in der Applikationsklasse deklarieren oder in deiner Hauptfensterklasse bzw. Hauptdialogklasse.

So das war mal ein kurzer Umriss zu MFC.
Aber wie gesagt, Konsolenanwendungen sind zum Anfangen schon geeigneter.
Aber wenn du die ganz Thematik der Klassen bzw. der Objektorientierten Programmierung verstanden hast, dann wird das mit der MFC schon auch etwas.

Gruß Homer
 

Kachelator

Peter Jerz
Die main-Funktion bzw. die WinMain() Funktion ist in einer Headerdatei definiert (in der WINBASE.H).
Die Implementation, ist in der Core-Lib der MFC.
D.h. sobald du eine MFC Anwendung mit dem Assistenten erstellst, wird diese Lib gebraucht und hat somit eine WinMain() Funktion.
Aaah, das wusste ich noch nicht. Vielen Dank!