Schritt für Schritt: eine Klasse erstellen



  • Hi!

    Klassen dekleration is ganz einfach:

    class Klassenname // Klassenname ist frei wählbar, class identifiziert die Klasse
    {
    Zugriffsspezifizierung 1: 
      Member 1;
      // ...
    
    Zugriffsspezifizierung 2:
      Member 2:
      // ...
    } Objektname /*Ist optional*/; //";" am Ende beachten!
    

    Member können sowohl Variablen als auch Funktionen (Methoden) sein. Diese unterliegen den übergeordneten Zugriffsrechten davon gibt es drei publib, protected und private.

    Public gibt an das die entsprechenden Klassenmember von überall gesehen werden. Sowohl innerhalb als auch außerhalb der Klasse kann darauf zugegriffen werden.

    Protected schütz Member vor externen Zugriffen. Intern kann weiterhin zugegriffen werden und auch abgeleitete Klassen haben Zugriff auf "protected" Member.

    Private schützt die Member vor jeglichem Zugriff von außerhalb der Klasse. Innerhalb darf natürlich noch Zugegriffen werden. Hier dürfen aber auch keine Abgeleiteten Klassen auf private Member zugreifen.
    Außnamen sind hierbei befreundete Klassen/Methoden. Die dürfen auch auf private Member zugreifen.

    Normal trennst du Dekleration und Definition voneinandern. Idealerweise in sogar verschiedene Dateien.
    Zum obigen Beispiel: Die Methode könntest du in eine Klasse einfügen die du HTTPConnection oder HTTPUtility nennst... Denk dir halt was schönes aus. 😉

    grüße



  • vollkommenegal schrieb:

    estartu schrieb:

    Und: Fällt dir eine sinnvolle Basisklasse ein?

    Nein, ich weiß nicht einmal, was ne Basisklasse ist bzw. wozu ich die brauche. 😞

    Oh, du sagtest doch, du hättest schon Bücher dazu gelesen...

    Okay, eine Basisklasse ist eine Klasse, die schon ziemlich genau das ist, was du willst und die du nur noch erweitern willst.
    Beispiel:
    Klasse Datei:
    m_strDateiname
    DateiOeffnen
    DateiSchließen
    DateiKopieren
    ...
    Klasse TextDatei : public Datei (Datei ist die Basisklasse von TextDatei)
    ZeileLesen
    ZeileSchreiben

    TextDatei hat ja gar kein Öffnen und Schließen, brauchts das nicht? Doch, das braucht es und das hat es - es "erbt" von Datei. Alles was Datei kann (Einschränkungen hat David_pb gezeigt) kann TextDatei auch.
    Soweit klar?

    vollkommenegal schrieb:

    estartu schrieb:

    Ja: Dann ist es eine MFC Klasse und du musst die Basisklasse im Dialog auswählen.
    Nein: Dann ist es eine allgemeine Klasse.

    Sorry, das ist mir zu schnell. Ich versteh kein Wort.

    Mach den Dialog mal auf, dann findest du die Worte wieder. 😉



  • estartu schrieb:

    Oh, du sagtest doch, du hättest schon Bücher dazu gelesen...

    gelesen != verstanden.

    estartu schrieb:

    Mach den Dialog mal auf, dann findest du die Worte wieder.

    Also irgendwie steh ich auf dem Schlauch!? Wenn ich auf File->New->Project... gehe, öffnet sich ein "New Project"-Fenster. Auf der linken Seite stehen dann "Project Types":
    - Visual C++ Projects
    .NET
    ATL
    MFC
    Win32
    General
    - Setup and Deployment Projects
    - Other Projects
    - Visual Studio Projects

    und auf der rechten Seite die entsprechenden Templates, also für MFC bspw.
    - MFC ActiveX Control
    - MFC Application
    - MFC DLL
    - MFC ISAPI Extension DLL

    Unter .NET steht als Template "class libraryy", aber das ist es ja wohl nicht, oder?!? Ansonsten sehe ich nichts, was mit einer Klasse zu tun haben könnte?

    mfg



  • Ach, du hast noch gar kein Projekt... 😮

    Okay, für was für ein Projekt hattest du den Beitrag denn gesucht? Willst du die Klasse gleich da einbauen? Dann hättest du schon eine Testumgebung.

    vollkommenegal schrieb:

    estartu schrieb:

    Oh, du sagtest doch, du hättest schon Bücher dazu gelesen...

    gelesen != verstanden.

    Hast du meine Erklärung jetzt verstanden? Sonst frag.



  • Das mag daran liegen dass die Projektart generell nichts mit Klassen zu tun hat. Jedes C++-Projekt kann (und ich nehme an 99,99% aller C++-Projekte werden) Klassen nutzen. Du brauchst um die Klassen anzuwenden eine Rahmenanwendung (z.B. Konsoleanwendung).

    Aber vielleicht solltest Du Dich wirklich vorher etwas mehr mit Basics beschäftigen, ich sehe Du hast da noch einige Verständnislücken...



  • Hi!

    Wenn du ganz frisch in Sache OOP bist reicht es den grafischen Schnickschnack außenvor zu lassen und in der Konsole zu arbeiten.
    Also: Win32->Konsolenprojekt->Leeres Projekt (oder wie das in der deutschen Version heist).
    Dann kannst du dir beliebig Dateien zum Projekt hinzufügen. Und dann ein paar Beispiele durchgehen.

    grüße



  • Ich bedanke mich bei allen für die Hilfe, aber entweder drücke ich mich so kompliziert aus oder ich bin wirklich zu blöd. 😞

    Ich versuche es noch einmal: ich hab ein Projekt, sagen wir irgendwas dialog-basiertes. Dort gibt es einen Button "Laden". Wenn ich den drücke, soll der von mir gepostete Code ausgeführt werden. (Seine Aufgabe: Text von http://home.pages.at/joachimh/cplusplustest.php einlesen)

    Nun hab ich mir überlegt, dass ja alles OOP sein muss und ich nicht einfach nur den Code in mein Projekt einfügen sollte. Früher hätte ich davon ne Funktion gemacht und die aufgerufen, was aber ja nicht mehr "in" ist.
    Deshalb möchte ich eine Klasse erstellen, um die Methode ggf. später noch einmal nutzen zu können.

    Hier kommen wir nun zu meinen Problemen:

    Wie erstelle ich eine Klasse? (Der Vorgang als solches; welchen Assistenten muss ich starten? Oder erstelle ich einfach ne CPP-Datei mit meinem Text-Editor und schreibe da was rein?)

    Wie erstellt man eine Klasse? D.h.: ich hab ein "Idee" für eine Funktionalität. In diesem Fall stützt sie sich auf eine einzige Methode ("getHtmlSource"), aber vielleicht kann man ja mehr daraus machen!?

    Wenn ich es nun irgendwie geschafft habe, die Klasse zu erstellen: wie benutze ich sie in einem Projekt? Wie binde ich sie ein?

    Ach ja: und dass "Verständnislücken" da sind, weiß ich auch, sonst wäre ich ja nicht hier und würde Euch nerven. 😉

    Ich hoffe, jetzt ist klar, was ich will und wo es hakt?! Wenn nicht, gebe ich es auf und bleib bei meiner prozeduralen PHP-Programmierung. 😃

    mfg



  • vollkommenegal schrieb:

    Wie erstelle ich eine Klasse? (Der Vorgang als solches; welchen Assistenten muss ich starten? Oder erstelle ich einfach ne CPP-Datei mit meinem Text-Editor und schreibe da was rein?)

    Den Assistenten hattest du doch schon gefunden.

    Bin auf "Add class" gegangen und stand dumm da, denn ich hatte keine Ahnung, was ich machen musste.

    Natürlich kannst du die Dateien auch von Hand anlegen - aber eine Klasse hat immer ein cpp und ein h. Bei abgeleiteten Klassen (also welchen mit Basisklasse) ist es aber einfacher, den Assistenten zu nehmen, der nimmt dir eben viel Arbeit ab.

    vollkommenegal schrieb:

    Wie erstellt man eine Klasse? D.h.: ich hab ein "Idee" für eine Funktionalität. In diesem Fall stützt sie sich auf eine einzige Methode ("getHtmlSource"), aber vielleicht kann man ja mehr daraus machen!?

    Als Beispiel kann sie trotzdem herhalten, auch wenn man es in der Praxis vielleicht nicht so machen würde.

    vollkommenegal schrieb:

    Wenn ich es nun irgendwie geschafft habe, die Klasse zu erstellen: wie benutze ich sie in einem Projekt? Wie binde ich sie ein?

    Das machen wir, wenn du die Klasse fertig hast. Geht aber ganz einfach. Wenn du schon mal mit z.B. CString oder einem Dialog gearbeitet hast, dann wirst du es wiedererkennen. 🙂



  • Hi!

    Beispiel:
    Du fügst in dein Projekt zwei neue Dateien hinzu: HTTPUtility.cpp und HTTPUtility.h (z.B.).

    Dann deklarierst du die Klasse in HTTPUtility.h:

    class HTTPUtility /*oder wie auch immer du die Klasse nennen willst*/
    {
    public:
      // Konstruktor, Copy C'tor, Destruktor... was auch immer du brauchst
    
      std::string getHTTPSource( const std::string &uri );
    
      // ... was deine Klasse sonst noch benötigt ...
    };
    

    Dann Definierst du die Klasse in HTTPUtility.cpp

    #include "HTTPUtility.h"
    
    std::string HTTPUtility:::getHTTPSource( const std::string &uri )
    {
      // Dein Quellcode, der Rückgabewert ist der Quellcode im ASCII format
    }
    

    Und an der Stelle wo du die Methode verwenden willst:

    #include "HTTPUtility.h"
    
    // ...
    void DeineMethode()
    {
      HTTPUtility utility;
    
      std::string source = utility.GetHTTPSource( "www.google.de" );
      // Tu mit dem Quellcode was du willst
    }
    

    Für die Klasse würde sich übrigens als Basis ein Singleton anbieten, da du nicht mehr als eine Instanz dieser Klasse benötigst und auch keine Kopie davon brauchst.

    grüße



  • David_pb schrieb:

    Für die Klasse würde sich übrigens als Basis ein Singleton anbieten, da du nicht mehr als eine Instanz dieser Klasse benötigst und auch keine Kopie davon brauchst.

    Was ist ein Singleton? 😕



  • vollkommenegal schrieb:

    Nun hab ich mir überlegt, dass ja alles OOP sein muss und ich nicht einfach nur den Code in mein Projekt einfügen sollte. Früher hätte ich davon ne Funktion gemacht und die aufgerufen, was aber ja nicht mehr "in" ist.
    Deshalb möchte ich eine Klasse erstellen, um die Methode ggf. später noch einmal nutzen zu können.

    Es muß nicht alles OOP sein. Um einen einzelnen Ablauf zur Verfügung zu stellen gibt es nach wie vor eine sehr gut geeignete Abstraktion, die Funktion. Ich sehe auch nicht, was Dich daran hindert, diese Funktion später wieder zu verwenden.

    Objekte brauchst Du dann, wenn Du Daten und Funktionen hast, die zusammengehören. Also eine bestimmte Datenstruktur, zusammen mit Funktionen, die sie manipulieren. Dafür benutzt man Klassen.

    Die FUnktion in ne Klasse zu packen wäre irgendwie eher unsinnig. Ein namespace wäre zur Gliederung besser geeignet. Daraus auch noch ein Singleton zu machen ist einfach nur fehl am Platze. Wozu überhaupt ein Objekt anlegen, wenn es auch ohne geht? Wozu ein Singleton bauen, wenn es auch ohne geht? Ein Singleton sollte man nicht dann bauen, wenn es normalerweise nur ein Objekt davon gibt, sondern dann, wenn es nur eines geben darf, bzw. ein sehr zentrales Objekt von überall zugreifbar sein muß. Mit Singletons baut man globale Variablen, sie heißen zwar netter und sind ein tolles Pattern, aber trotzdem sind es im Prinzip globale Variablen. Man sollte sich gut überlegen wann und wofür man die einsetzt.



  • Hi!

    Jester schrieb:

    Ein Singleton sollte man nicht dann bauen, wenn es normalerweise nur ein Objekt davon gibt, sondern dann, wenn es nur eines geben darf

    Genau das wäre hier der Fall!
    Im übrigen hast du natürlich recht damit, das es unsinnig ist für diese Methode eine Klasse zu erstellen.
    Ich dachte ihm geht es eher darum einen Einstieg in die Objektorientierte Programmierung zu finden und er wollte, quasi als Beispiel, den Quellcode in ein Objekt verfrachten.

    grüße



  • David_pb schrieb:

    Hi!

    Jester schrieb:

    Ein Singleton sollte man nicht dann bauen, wenn es normalerweise nur ein Objekt davon gibt, sondern dann, wenn es nur eines geben darf

    Genau das wäre hier der Fall!

    Wieso wäre es schlimm, wenn zwei dieser Objekte existieren? Nochmal: Nicht dann Singleton, wenn normalerweise nur eins existiert, sondern dann wenn es nur eins geben darf. Das ist hier nicht der Fall. Die globale Zugreifbarkeit wäre auch mit einer statischen Methode oder einer normalen Funktion gegeben, kann hier also nicht als Argument dienen. Gerade, wenn es in einem Projekt üblich ist nur ein Objekt einer Klasse zu haben sollte man vorsichtig sein. Was wenn man später doch mal zwei braucht? Dann muß man das Singleton wieder beseitigen und da es quasi ne globale Variable ist kann das ganz schön aufwendig sein.

    Das Singleton wird imho viel viel zu häufig eingesetzt. Dabei macht es den Code oft unnötig kompliziert und bringt unnötige Abhängigkeiten mit.



  • @David_pb:
    da waren ein paar Fehler im Code, aber die hab ich rausbekommen. Vielen Dank, läuft soweit. 😃
    std::string wurde bemängelt und ich kenne das auch nicht. Ich hab davon CString gemacht, ist wohl im Prinzip dasselbe?!

    Was Singleton ist, weiß ich auch nicht, aber da selbst estartu das nicht weiß, gehe ich mal davon aus, dass ich das auch nicht unbedingt wissen muss, oder?

    Wie dem auch sei: ich hab das hinbekommen, so wie es wollte, muss aber Jester zustimmen, dass es nicht ganz sinnig ist, für sowas nun ne ganze Klasse zu machen. Aber es ging ja auch nur um die Übung, so dass das IMO okay war.

    Nun habe ich aber Blut geleckt und würde gerne eine "richtige" Klasse erstellen, die man auch wirklich (sinnvoll) nutzen kann. Jemand eine Idee? Ich würde die ganz gerne mit 1 oder 2 Leuten entwickeln. (Ich hätte kein Problem, wenn es eine Klasse wäre, die es schon gibt; sie muss halt nur sinnvoll sein.)

    mfg



  • vollkommenegal schrieb:

    std::string wurde bemängelt und ich kenne das auch nicht. Ich hab davon CString gemacht, ist wohl im Prinzip dasselbe?!

    Du mußte dafür den entsprechenden Header einbinden, also am Anfang ein
    #include <string>

    Wichtig: nicht string.h sondern wirklich einfach nur string. Dann klappt's auch. Im Prinzip ist std::string das selbe wie CString, eine stringklasse halt. CString ist allerdings Teil der MFC, einer speziellen Bibliothek von MS für Windowsprogrammierung. std::string gehört zur Standardbibliothek von C++ und ist daher auf jeder Plattform verfügbar (zum Beispiel auch unter Linux). Generell würde ich Dir zumindest für den Anfang empfehlen die Standardkomponenten zu benutzen, sonst besteht die Gefahr, daß Du nicht richtig auseinanderhältst, was zur Sprache dazugehört und was ne externe Bibliothek Dir bereitstellt.

    Eine richtige Klasse zu erstellen ist sone Sache. Viele einzelne Klassen sind sehr einfach. Das spannende an Klassen ist das Zusammenspiel. Vielleicht wäre es einfacher, Du überlegst Dir ne einfache kleine Aufgabe, die Du gerne lösen würdest und versuchst es dann mal mit Klassen. Poste auch regelmäßig Dein Design (Klassenaufteilung etc.) hier, dann kriegst Du Feedback, was Du anders machen könntest.



  • Jester schrieb:

    Im Prinzip ist std::string das selbe wie CString, eine stringklasse halt. CString ist allerdings Teil der MFC

    Verstehe.

    Jester schrieb:

    Dir zumindest für den Anfang empfehlen die Standardkomponenten zu benutzen, sonst besteht die Gefahr, daß Du nicht richtig auseinanderhältst, was zur Sprache dazugehört und was ne externe Bibliothek Dir bereitstellt.

    An sich ein guter Rat, aber wenn ich nicht unterscheiden kann, ob etwas zur Sprache und zu einer externen Bibliothek gehört, wie soll ich dann Standardkomponenten nutzen? 😃
    Oder anderes gefragt: wie erkennt man Standardkomponenten? Gibt es da einen "Trick"?

    Sehe ich das richtig, dass ich MFC-Komponenten "frei" nutzen kann, wenn ich mir sicher bin, dass meine Prog (vorerst) nur unter Windows laufen müssen?

    Jester schrieb:

    Du überlegst Dir ne einfache kleine Aufgabe

    Ich solchen Dingen bin ich immer voll unkreativ. 😞

    mfg



  • vollkommenegal schrieb:

    An sich ein guter Rat, aber wenn ich nicht unterscheiden kann, ob etwas zur Sprache und zu einer externen Bibliothek gehört, wie soll ich dann Standardkomponenten nutzen? 😃
    Oder anderes gefragt: wie erkennt man Standardkomponenten? Gibt es da einen "Trick"?

    Ja, den gibt es. Nimm Dir irgendein etwas besseres C++-Buch und Du solltest einiges an Informationen finden. Die wichtigsten Dinge für den Anfang sind

    streams (cin, cout), std::string, std::vector, vielleicht noch std::map. Alles andere kommt mit der Zeit von selbst.

    Sehe ich das richtig, dass ich MFC-Komponenten "frei" nutzen kann, wenn ich mir sicher bin, dass meine Prog (vorerst) nur unter Windows laufen müssen?

    Ja, und solange Dur halt unter Windows nen Compiler benutzt, für den es MFC gibt.

    Irgendne Aufgabe wirste schon finden. Bau notfalls ein TicTacToe-Spiel oder ein 4-gewinnt oder sowas. Da kann man schon einiges dabei lernen.


Anmelden zum Antworten