Aktuelle Zeit: 22.12.2024, 20:43

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: C++ - Klassen
BeitragVerfasst: 19.12.2008, 18:47 
Offline

Registriert: 24.05.2008, 13:41
Beiträge: 151
Wohnort: Marienhafe
Hallo ich bin heute mal angefangen mit C++ zu programmieren (War ja vorher bei C#)
Nun wollte ich die erste Klasse mache, allerdings versteh ich nicht ganz wie ich das machen soll - könntest ihr mir vll ein Beispiel geben?
Ich schreib mal rein was ich insgesamt will:

1. Nachdem ich eine Klasse in C++ erstellt habe, sah das ganze so aus:
Klassentest.h:
Code:
#pragma once

ref class Klassentest
    {
    public:
        Klassentest(void);
    };


Klassentest.cpp:
Code:
#include "StdAfx.h"
#include "Klassentest.h"

Klassentest::Klassentest(void)
    {
    }




So ich bräuchte vll einfach mal nen Anfang, wäre schön wenn ihr das was ich nun "beschreib" mit den Beiden Codeabschnitten neumachen könntet, damit ich etwas hab, woran ich mich orientieren kann^^

Also:
Die Klasse möchte ich in etwa so aufrufen: Klassentest KT = new Klassentest(a, b);
Dann möchte ich in der Klasse noch eine Funktion haben:
KT->stringschicken(c, out b); -> Mann soll also einen Parameter in die Funktion eingeben können, und einen wieder zurückbekommen
(Wie das mit out ist weiß ich auch noch net bei c++ :P)

Das wars eigentlich schon^^ Ich hab zwar im internet gesucht, aber noch nichts gutes gefunden, was dazu passt :(
Vll könntet ihr mir die Codes noch so posten, wie das zu machen ist (also nur die grundstrucktur)

Hoffe ihr könnt mir helfen :)


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: C++ - Klassen
BeitragVerfasst: 19.12.2008, 21:14 
Offline
Moderator
Benutzeravatar

Registriert: 25.03.2007, 18:11
Beiträge: 834
Wohnort: Hagen, NRW
Ist eigentlich kein alzugroßer Unterschied zwischen C++ und C# (ok mein C# wissen ist ein wenig begrenzt, aber mir ist noch nicht so viel aufgefallen, was jetzt komplett anders ist ^^)

Zuerst mal weg mit "ref"

Und dann eigentlich genau das gleiche wie in C#

Du definierst einen Konstruktor, der zwei parameter erwartet und die Funktion.

Also sind wir schonmal bei in etwa dem:
Code:
class test
{
public:
   test( int a, int b);

   void check( int c, int &bOut);
};


Das int &bOut (man beachte das &) sagt dem Compiler, dass er nicht den Wert der Variable übergeben soll, sondern eine Referenz auf die Variable. So kannst du die Variable inerhalb der Methode ändern, was dann ungefähr so aussehen würde:
Code:
void test::check( int c, int &bOut)
{
   bOut = c;
}


Wenn du in C++ mit new eine Instanz einer Klasse erstellst, bekommst du einen Zeiger auf ein Objekt. Also muss das Objekt dann so erstellt werden:
Code:
test* t = new test( 1, 2 );

Oder du erstellst eine lokale Variable, dann ist das nur
Code:
test t(1, 2);


Wenn du dann jetzt die check methode aufrufen willst, sieht das so aus:
Code:
int b = 12;
t->check( 3, b );

// b ist jetzt 3

Wenn du eine lokale Variable gemacht hast, dann musst du anstatt -> einen punkt schreiben.

Und da du den Speicher mit new angefordert hast, musst du (dh solltest du auf jeden Fall) ihn auch wieder mit delete freigeben, wenn du das Objekt nichtmehr brauchst.
Code:
delete t;


Man merkt aber doch schon, dass du arg C# geschädigt bist ;)
Vielleicht solltest du dir mal ein kleines tutorial zu C++ durchlesen (da du c# kannst sollte sich der aufwand dafür doch arg in grenzen halten, da du dir ja nur den Syntax angucken musst). Oder zumindest mal nach ner Auflistung der Unterschiede zwischen C# und C++ suchen.

P.S.:
Ach ja und noch was: "#pragma once" kennt nur der Microsoft compiler. Wenn du ( und das solltest du eigentlich ;)) compiler unabhängig programmieren willst, verwende sog. Include-Guards.

Das versteht jeder Compiler:
Code:
#ifndef IRGEND_EIN_NAME_AM_BESTEN_DER_DER_DATEI
#define IRGEND_EIN_NAME_AM_BESTEN_DER_DER_DATEI

// hier kommt der code

#endif


Dann guckt der Präprozessor, ob dieses define schon existiert (was es nicht tun sollte) und definiert es falls es nicht der fall war und wertet den Programmcode aus. Wenn das define schon existiert, dann wurde die Datei schon einmal eingebunden, und durch das if - endif wird alles was drin steht ignoriert.

_________________
Phenom X4 9950 BE | 6144MB DDR2-800 | GeForce 8800GT 512MB | Asus M3A32-MVP Deluxe | 2TB HDD | 520W Seasonic NT | Soprano Tower | Samsung 22" TFT + Fujitsu-Siemens 17" TFT + Toshiba 42" FullHD LCD | Windows 7 Proessional x64
Behind the Brain


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: C++ - Klassen
BeitragVerfasst: 19.12.2008, 22:35 
Offline

Registriert: 24.05.2008, 13:41
Beiträge: 151
Wohnort: Marienhafe
Hi, erstmal für die Klasse antwort - soweit hatte ich das in etwa auch, aber da kommen allerhand an fehlermeldungen (hab ich vll auch einfach die falsche Klasse ausgewählt? xD)

Also der erste fehler steckt schon hier:



Editttt:


Okay alles behoben alles super alles toll^^
Wegen dem pragma once | Ist das so richtig?:
-> Was genau bedeutet das eigentlich?^^
Code:
#ifndef MyClassh
#define MyClassh



class MyClass
    {
    public:
        MyClass(int a, int b);
        void SendString(int c, int &bOut);
    };


#endif


Wenn ich jetzt bei SendString(int c, int &bOut);
das int mit string ersetzte - Geht es nichtmehr O.o? Warum das? Der sagt immer unerwarter bezeichner...


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: C++ - Klassen
BeitragVerfasst: 19.12.2008, 23:07 
Offline
Moderator
Benutzeravatar

Registriert: 25.03.2007, 18:11
Beiträge: 834
Wohnort: Hagen, NRW
die string klasse muss du mit
#include <string>
noch einbinden

und da sie im std namespace liegt entweder noch
using namespace std;
und dann
string s;

oder
std::string s;

benutzen.

Der Include guard ist so richtig.
Der ist halt erstmal dafür da, dass eine Header Datei nicht 2mal von der gleichen cpp datei eingebunden wird. Doppelte definition von klassen führt zb zu einem fehler.

Wie der funktioniert hab ich eigentlich schon oben beschrieben.
In C# geht ja erst der compiler durch die Dateien und erzeugt Objektdateien die dann vom Linker zur exe zusammengesetzt werden.

In C(++) gibt es halt vorher noch den Präprozessor, der zb #include anweisungen mit dem inhalt der datei ersetzt.
Außerdem kennt er halt bestimmte Konstanten (defines) die man zb zur Unterscheidung zwischen Debug und Release build verwenden kann.

#ifndef ( = if not defined ) prüft halt ob ein define exisitiert, also vorher irgendwann mal #define xy stand.
#define definiert halt dieses define.
#endif ist selbsterklärend.

Wenn die Datei jetzt also zum ersten mal eingebunden wird sucht der Präprozessor nach diesem define. Wenn das nicht existiert definiert er es. Wenn es allerdings schon existiert entfernt er quasi den ganzen code im if.

Wenn du also diese Header datei hast:
Code:
#ifdef HEADER_DATEI
#define HEADER_DATEI

int variable = 3;

#endif


Und dazu eine cpp mit so einem inhalt:
Code:
#include "header.h"
#include "header.h"

// ...


geht der Präprozessor halt erstmal das erste include durch und wertet die header datei aus.
Dabei kommt dann sowas raus
Code:
int variable = 3;


Zusätzlich hat er jetzt intern gespeichert, dass HEADER_DATEI definiert wurde.
Die nächste inklude anweisung ist dann nach dem präprozessor
Code:

^^

Also wird variable nicht 2mal deklariert.

_________________
Phenom X4 9950 BE | 6144MB DDR2-800 | GeForce 8800GT 512MB | Asus M3A32-MVP Deluxe | 2TB HDD | 520W Seasonic NT | Soprano Tower | Samsung 22" TFT + Fujitsu-Siemens 17" TFT + Toshiba 42" FullHD LCD | Windows 7 Proessional x64
Behind the Brain


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: C++ - Klassen
BeitragVerfasst: 19.12.2008, 23:19 
Offline

Registriert: 24.05.2008, 13:41
Beiträge: 151
Wohnort: Marienhafe
Wow vielen dank für die Antwort :) Nun wird mir einiges klar :)
Und tut mir leid für meine doofen Fragen (mal wieder xD) :) Schön das man sich hier so gut um die User kümmert :)
Ich denke ich kann nun erstmal weiter arbeiten :)
Nochmals vielen Dank für deine guten erklärungen (wundert mich immer wieder, normalerweise kommt es einen sovor: Lies dich mal mehr in die Materie ein bevor du programmieren willst - Aber selber scheint derjenige nicht zu wissen wovon er spricht :P ) Hier kann man richtig dazu lernen :)
Ich weiß ich sag das oft, aber ich bin richtig begeistert von Forum :)


Edit: Supi habs so eingebaut :) funktioniert wurderbar :)
Warum muss man string eigentlich extra einbinden, int aber nicht?^^


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: C++ - Klassen
BeitragVerfasst: 20.12.2008, 10:11 
Offline
Moderator
Benutzeravatar

Registriert: 25.03.2007, 18:11
Beiträge: 834
Wohnort: Hagen, NRW
Weil int ein Datentyp von c ist, der schon von der Sprache definiert wird. String ist aber "nur" eine Klasse, die jemand mal geschrieben hat.

In C# musst du die String klasse doch auch einbinden (mscorelib oder so ähnlich), nur ist das C# schon standardmäßig der Fall.

_________________
Phenom X4 9950 BE | 6144MB DDR2-800 | GeForce 8800GT 512MB | Asus M3A32-MVP Deluxe | 2TB HDD | 520W Seasonic NT | Soprano Tower | Samsung 22" TFT + Fujitsu-Siemens 17" TFT + Toshiba 42" FullHD LCD | Windows 7 Proessional x64
Behind the Brain


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: C++ - Klassen
BeitragVerfasst: 20.12.2008, 10:53 
Offline

Registriert: 24.05.2008, 13:41
Beiträge: 151
Wohnort: Marienhafe
Eben da muss ich mich nicht drum kümmern :P
Gut dann noch eine Frage - Jaja langsam wirds nervig
Bei:
env->addStaticText(L"Testtitest", rect<int>(xgroesse/2-200,10,xgroesse/2+200,22));

-> Das L steht für die Convertierung des Strings in wchar_t oder? Zumindest hab ich nichts anderes darüber gefunden^^
Wenn ich nun eine Variable habe wie:
std::string test = "Testtitest";
Wie kann ich die dann dort einbinden?


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: C++ - Klassen
BeitragVerfasst: 20.12.2008, 12:37 
Offline
Moderator
Benutzeravatar

Registriert: 25.03.2007, 18:11
Beiträge: 834
Wohnort: Hagen, NRW
Benutz einfach die Irrlicht string klasse. Mit der kannst du fröhlich zwischen stringc (char) oder stringw (wchar_t) rumkonvertieren.

Code:
irr::core::stringc str1 = "Hallo Welt!";

irr::core::stringw str2 = "Hallo Welt!";


beide klassen haben die c_str() methode die halt ein konstantes array aus char oder wchar_t zurück gibt.

also könntest du dann sowas machen:
Code:
addStaticText (  stringw( "Test" ).c_str() , ... )

_________________
Phenom X4 9950 BE | 6144MB DDR2-800 | GeForce 8800GT 512MB | Asus M3A32-MVP Deluxe | 2TB HDD | 520W Seasonic NT | Soprano Tower | Samsung 22" TFT + Fujitsu-Siemens 17" TFT + Toshiba 42" FullHD LCD | Windows 7 Proessional x64
Behind the Brain


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: C++ - Klassen
BeitragVerfasst: 20.12.2008, 13:03 
Offline

Registriert: 24.05.2008, 13:41
Beiträge: 151
Wohnort: Marienhafe
Ah okay^^ Wie kann man denn aus einen wstring und einer Variable einen string machen?^^
AST_W = "Hallo "+Variable+" willst du was wissen? ";
So hatte ichs versucht xD
Und wieder Edit:
Okay hat alles geklappt^^

std::string AST_W1 = "Hallo "+Var+" -usw0.";
stringw AST_W = stringw(AST_W1.c_str());
Erstmal als normalen String gemacht und dann in ein strringw umgewandelt und den dann wie oben beschrieben eignesetzt :D


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: C++ - Klassen
BeitragVerfasst: 22.12.2008, 13:41 
Offline

Registriert: 24.05.2008, 13:41
Beiträge: 151
Wohnort: Marienhafe
|Gelöst|


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: C++ - Klassen
BeitragVerfasst: 20.01.2009, 22:45 
Offline

Registriert: 24.05.2008, 13:41
Beiträge: 151
Wohnort: Marienhafe
Sylence hat geschrieben:
Benutz einfach die Irrlicht string klasse. Mit der kannst du fröhlich zwischen stringc (char) oder stringw (wchar_t) rumkonvertieren.

Code:
irr::core::stringc str1 = "Hallo Welt!";

irr::core::stringw str2 = "Hallo Welt!";


beide klassen haben die c_str() methode die halt ein konstantes array aus char oder wchar_t zurück gibt.

also könntest du dann sowas machen:
Code:
addStaticText (  stringw( "Test" ).c_str() , ... )


Huhu ich bins wieder^^ Hab wieder nen problem damit^^ sobald ich mein string in ein stringw konvertiere werden alle umlaute nicht dargestellt. Wenn ich allerdings nen string durch L"Öhm ich bins" in z.b. ne Listbox eintrage wirds wiederum angezeigt :/


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: C++ - Klassen
BeitragVerfasst: 21.01.2009, 08:25 
Offline
Moderator
Benutzeravatar

Registriert: 25.03.2007, 18:11
Beiträge: 834
Wohnort: Hagen, NRW
Naja stringc ist nicht wirklich für Umlaute geeignet. Kann sein, dass der die schon kaputt macht. Am einfachsten ist es wohl nur mit stringw zu arbeiten wenn irgendwo irgedwann irgendwie Umlaute auftauchen könnten.
Aber so wie ich das im englischen Forum mitkrieg, wird sowieso wahrscheinlich bald der ganze mist mit den nicht ASCII Zeichen gelöst, indem man standardmäßig int USC-schlagmichtod codiert.

_________________
Phenom X4 9950 BE | 6144MB DDR2-800 | GeForce 8800GT 512MB | Asus M3A32-MVP Deluxe | 2TB HDD | 520W Seasonic NT | Soprano Tower | Samsung 22" TFT + Fujitsu-Siemens 17" TFT + Toshiba 42" FullHD LCD | Windows 7 Proessional x64
Behind the Brain


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ]  Gehe zu Seite 1, 2  Nächste

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de