Schritt für Schritt: eine Klasse erstellen
-
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.