Schritt für Schritt: eine Klasse erstellen



  • Dieser Thread wurde von Moderator/in estartu aus dem Forum MFC (Visual C++) in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • vollkommenegal schrieb:

    Sehe ich nicht so; zumindest hab ich noch kein Tutorial mit einem sinnvollen und verständlichen Beispiel gesehen, so dass man auch nachvollziehen kann, WARUM man dies und das macht und wozu das alles gut ist. (Aber das ist vielleicht ein subjektives Problem von mir?)

    mfg

    Oha, ein Warum-Frager 😃
    Dieser Gattung gehöre ich auch an. 🙂

    Kleiner Vorschlag: DU denkst dir was aus, wozu du eine Klasse entwickeln möchtest - ich (und vielleicht auch andere) helfen dir dabei, indem wir dich in die richtige Richtung dirigieren.

    Die Klasse kann es auch ruhig schon so ähnlich geben, z.B. in der MFC - und du baust darauf auf oder was besseres. 😉
    Wie wäre es mit einem String?



  • estartu schrieb:

    Oha, ein Warum-Frager 😃

    Sind wir das nicht alle...irgendwie? 😃

    estartu schrieb:

    Kleiner Vorschlag: DU denkst dir was aus, wozu du eine Klasse entwickeln

    Na ja, ich hab gestern dies gesehen

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-55235.html

    und mir den Code von Unix-Tom genommen und ausprobiert: läuft. Dann habe ich mir überlegt, dass es gut wäre, wenn ich den Code irgendwie in eine Klasse packen könnte, denn sowas kann man vielleicht mal brauchen. Bin auf "Add class" gegangen und stand dumm da, denn ich hatte keine Ahnung, was ich machen musste. 😞

    Und da wir gerade bei Unix-Tom sind: ich war auf seiner HP und habe mir die MySQL-DLL geholt und angesehen: massig Dateien, aber leider keine einzige Beschreibung dabei, was ich damit machen muss, um die DLL nutzen zu können.

    mfg



  • Hmm, aus dem Code werde ich nicht ganz schlau, aber das wird schon werden. 😉
    Also, zwei Dinge zuerst: Hast du schon einen Namen für die Klasse?
    Und: Fällt dir eine sinnvolle Basisklasse ein?
    Ja: Dann ist es eine MFC Klasse und du musst die Basisklasse im Dialog auswählen.
    Nein: Dann ist es eine allgemeine Klasse.

    Als nächsten Schritt zeig mal, welche Funktionen in die Klasse rein sollen, also aus dem Beitrag.
    Einfach hier reinkopieren.



  • // Wenn möglich im header
    class Koerper
    {
    public:
        int iGroesse;
        int iGewicht;
        int iMase[3];
        int iBeinlaenge;
        SetMase(int iMas1, int iMas2, int iMas3)
        {
            iMase[0] = iMas1;
            iMase[1] = iMas2;
            iMase[2] = iMas3;
        }
    };
    
    // irgendwo in der cpp
    Koerper Ich;
    Ich.iGroesse = 183;
    Ich.iGewicht = 80;
    Ich.SetMase(150,30,120);
    Ich.iBeinlaenge = 45;
    

    Da hast du ein Klassenbeispiel 😉



  • Hi!

    Ja, ein super schlechtes! 🙄

    grüße



  • ich habe nicht gesagt dass es gut ist..
    aber er weiss ja nichtmal wie und wo er eine klasse deklarieren muss..
    also hilft ihm das ja evtl in die richtige richtung 😃



  • Ein sehr verbesserungsfähiges Beispiel...

    Ich habe übrigens (eher zufällig) grade ein recht nettes Buch mit einem umfangreichen Teil zu Klassen entdeckt:
    Visual C++ .NET ENT-PACKT | ISBN: 3826608933
    Es ist nicht sooo viel zu VC.net drin, wie ich gehofft hatte - dafür aber eben ein sehr umfangreicher Grundlagenteil. 👍



  • estartu schrieb:

    Hmm, aus dem Code werde ich nicht ganz schlau, aber das wird schon werden. 😉

    Der Code ruft nur ne URL auf und liefert das zurück, was die Webseite ausspuckt. Also bspw.

    http://home.pages.at/joachimh/cplusplustest.php

    estartu schrieb:

    Also, zwei Dinge zuerst: Hast du schon einen Namen für die Klasse?

    WebConnect?

    estartu schrieb:

    Und: Fällt dir eine sinnvolle Basisklasse ein?

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

    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.

    estartu schrieb:

    welche Funktionen in die Klasse rein sollen, also aus dem Beitrag.

    Na ja, erst einmal das, was Unix-Tom gepostet hat:

    CString somecode, s;       
         CInternetSession session("test",1,INTERNET_OPEN_TYPE_PRECONFIG); 
    
         CStdioFile* pFile = NULL;    
           CString strUrl("http://www.sensorme.de"); 
    
       try   
       {   
               pFile = session.OpenURL(strUrl,1,INTERNET_FLAG_TRANSFER_BINARY,NULL,0); 
    
            if(pFile)   
            {            
                while (pFile->ReadString(somecode) != NULL)   
                {   
                    s = s + somecode;   
                }   
                pFile->Close();   
            }        
       }   
       catch (CInternetException* e)   
       {         
            e->Delete(); 
            session.Close(); 
            CloseHandle(session);   
       }
    

    Vielleicht als getHtmlSource(), so wie Rapha es in dem Thread schon versucht und genannt hat?!

    @BigNeal: nein, das hilft nicht, denn Du schreibst zwar den grundsätzlichen Aufbau für eine Klasse hin (den kenne ich schon von PHP), aber "wie und wo ich eine klasse deklarieren muss", schreibst auch Du nicht. Wo packe ich den Code denn hin? Und wie rufe ich dann die Klasse auf?

    mfg



  • 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.


Anmelden zum Antworten