Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Objekt Variable Ändern ?!

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
10.09.2008, 14:30 Uhr
~Askar
Gast


Hallo,

ich bin ein totaler noob in sachen Objektorientierung.

Ich habe nun eine Klasse erstellt und in einer anderen Funktion erstelle ich die Objekte und
Initialisiere diese z.B:


class CMap
{
public:

//Membervariablen
float fXeckeA;
float fYeckeA;
float fXeckeB;
float fYeckeB;
float fXeckeC;
float fYeckeC;
float fXeckeD;
float fYeckeD;
float fRot;
float fGruen;
float fBlau;
int nVisible;


//Memberfunktion
void Zeichnen(){
glColor3f(fRot,fGruen,fBlau);
glBegin (GL_QUADS);
glVertex3f(fXeckeA,fYeckeA,0.0f);
glVertex3f(fXeckeB,fYeckeB,0.0f);
glVertex3f(fXeckeC,fYeckeC,0.0f);
glVertex3f(fXeckeD,fYeckeD,0.0f);
glEnd ();
}
}

};


//Map Zeichnen
//
void MapZeichnen(){

CMap Zelle1A;


//Konstanten
const float cfRot = 1.0f;
const float cfGruen = 1.0f;
const float cfBlau = 1.0f;

Zelle1A.fRot = cfRot;
Zelle1A.fGruen = cfGruen;
Zelle1A.fBlau = cfBlau;

Zelle1A.nVisible = 1;
Zelle1A.fXeckeA = -1.0f;
Zelle1A.fYeckeA = 0.9f;
Zelle1A.fXeckeB = -0.9f;
Zelle1A.fYeckeB = 0.9f;
Zelle1A.fXeckeC = -0.9f;
Zelle1A.fYeckeC = 1.0f;
Zelle1A.fXeckeD = -1.0f;
Zelle1A.fYeckeD = 1.0f;
Zelle1A.Zeichnen();
}

So ob das nun so nützlich ist oder nicht sei erstmal dahingestellt :-)

Mein Problem ist, dass ich nun z.B in einer anderen Funktion außer MapZeichnen auch gerne Werte von den Einzelnen Zellen verändern würde, diese muss ich dort ja aber
wieder neu deklarieren ( damit meine ich dieses CMap Zelle1A; ) nur weiß ich nicht ob ich dabei ein neues Objekt erstelle oder der Funktion klarmache, dass es ein Objekt mit diesem Namen gibt.

Oder sollten diese Funktionen wie z.B das Zeichnen auch irgendwie in der CMap klasse drinnen stehen ?


Vielen Dank

Askar
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
10.09.2008, 19:18 Uhr
WiredCoder



Was ist das denn für ein Gewuschel!? Du solltest die Membervariablen erstmal als private deklarieren und diese nach belieben im Konstruktor definieren etc. Void MapZeichnen()
solltest du dann als public deklarieren. Der Rest ist irgendwie Komisch, du deklarierst
eine Funktion als Methode in der Klasse und möchtest diese mit "void MapZeichnen()" definieren? Also bitte...wenn, dann bitte doch:

C++:
void CMap::MapZeichnen()
{
CMap Zeile1A;
//Instanzierung definieren blablabla
//.......
}



Wenn du die Instanzwerte weiterverändern möchtest, kannst du sie doch einfach
mit der return ausgeben, nachdem du sie definiert hast. Beispiel:
http://nopaste.org/p/an5ffkV1R
--
Ich würde mich sehr über einen Besuch auf meiner Website freuen: www.Online-Programmierung.com

Dieser Post wurde am 10.09.2008 um 19:35 Uhr von WiredCoder editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
10.09.2008, 21:28 Uhr
0xdeadbeef
Gott
(Operator)


Du erstellst auf die Art jedes mal ein neues Objekt, das am Ende des Blocks, in dem es instantiiert wird, auch wieder zerstört wird. Wenn du das selbe Objekt in mehreren Funktionen benutzen willst, gibst du der Funktion am besten einen Parameter, in diesem Fall eine Referenz:

C++:
void MapZeichnen(CMap &Zeile1A){
  // ...


Richtig schön objektorientiert ist das so auch nicht, aber das ist mit OpenGL auch ein bisschen schwierig; immerhin ist das Konzept, auf dem OpenGL (und auch andere DM-Bibliotheken) basiert, entwickelt worden, bevor OOP populär wurde, und war im Grunde damals schon ein dreckiger Geschwindigkeitshack. Heute ist das Arbeiten mit einer state machine eigentlich unnötig - die Rechner sind inzwischen schnell genug - aber so etwas wird man später nur sehr schwer wieder los; tausende Spieleentwickler müssten neu ausgebildet werden und richtige Programmierung lernen. In einer saubereren Umgebung würde ich hier mit Visitor-Methoden für Gerätekontexte arbeiten, aber mit OpenGL ist das ein bisschen Perlen vor die virtuellen Säue.

Sonstige Anmerkungen - es wäre wahrscheinlich sinnvoll, die Datenmember hier noch etwas weiter zu abstrahieren. Ich kann mir deinen use case hier nur zusammenfantasieren, aber zumindest eine Abstraktion a la

C++:
struct punkt_2d { float x, y; };

class map {
public:
  // ...

private:
  punkt_2d a, b, c, d;
};


scheint sinnvoll. Je nachdem, was das Ding nachher können soll, wäre evtl. auch

C++:
class map {
public:
  // ...

private:
  std::vector<punkt_2d> punkte_;
};


denkbar, aber das kann ich nicht sagen, wenn ich nicht weiß, was du eigentlich machen willst. In ähnlicher Weise ließen sich die Farbwerte in

C++:
struct color { float r, g, b; };


zusammenfassen.

Oh, und bitte, lass die ungarische Notation sein. Wenig macht Code unlesbarer und schwerer zu warten.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
10.09.2008, 22:11 Uhr
~Askar
Gast


Vielen Dank für eure Antworten!

Ich denke das hat mir schon ein ganzes Stück weitergeholfen und das mit der ungarischen Notation werde ich in Zukunft lassen :-)

Askar
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: