JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=5ce7d2704eb5c75788664704ec24dadbMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

class vs. struct

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Otscho
Super JLI'ler


Alter: 36
Anmeldedatum: 31.08.2006
Beiträge: 338
Wohnort: Gummibären-Gasse
Medaillen: Keine

BeitragVerfasst am: 27.01.2008, 12:45    Titel: class vs. struct Antworten mit Zitat

Hi, ich hab da mal ein kleines Verständnisproblem:
Man kann ja in einer struct genauso methoden deklarieren wie in einer class. Was ist denn da dann eigentlich der große Unterschied zwischen structs und classes ?? Außer dass ein ein struct nicht zwangsläufig nen constructer bzw. destructer haben muss.

Nebenbei : Wenn ich jetzt ca 200 Instancen vom gleichen Object haben will. Ist es dann sinnvoller diese als structs oder als class zu definieren ?
Wie sieht es da mit dem Speicherverbrauch aus ?

Was ist sinvoller ?
CPP:
struct DefaultStruct{
public:
   DefaultStruct();
   virtual ~DefaultStruct();

   void SetBla(int wert);
   int GetBla();
   ...
   void MachMalWas();
protected:
   int bla;
   int blu;
};

class StructManager{
public:
   StructManager();
   virtual ~StructManager();

   void AddDefaultStruct(int ID, int bla, int blu);
   DefaultStruct* GetDefaultStructPtr(int ID)

protected:
   std::map<int , DefaultStruct>DefaultStructMap;
};

oder das :
CPP:
class DefaultClass{
public:
   DefaultClass();
   virtual ~DefaultClass();

   void SetBla(int wert);
   int GetBla();
   ...
   void MachMalWas();
protected:
   int bla;
   int blu;
};

class ClassManager{
public:
   ClassManager();
   virtual ~ClassManager();

   void AddDefaultClass(int ID, int bla, int blu);
   DefaultClass* GetDefaultClassPtr(int ID)

protected:
   std::map<int , DefaultClass>DefaultClassMap;
};


oder wär ses sogar besser die methoden der ersten structs bzw classes in den jeweiligen Manager auszulagern, damit diese nicht 100-fach im RAM schlummern?

Auf dass mir jemand die Erleuchtung bringen möge.

mfg Matthias


Zuletzt bearbeitet von Otscho am 27.01.2008, 12:52, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 27.01.2008, 12:52    Titel: Antworten mit Zitat

In C++ ist der unterschied das class per default private und struct public ist.

In C# gibt es da noch weitere deutliche unterschiede aber in C++ gibt es nur diesen unterschied, dennoch halte zumindest ich es für guten Stil wichtiges mit Methoden, etc als class zu halten und anderes wie zb nur Membervariablen in structs zu halten.

Zitat:
Nebenbei : Wenn ich jetzt ca 200 Instancen vom gleichen Object haben will. Ist es dann sinnvoller diese als structs oder als class zu definieren ?
Wie sieht es da mit dem Speicherverbrauch aus ?


Gibt keinen Unterschied.
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Otscho
Super JLI'ler


Alter: 36
Anmeldedatum: 31.08.2006
Beiträge: 338
Wohnort: Gummibären-Gasse
Medaillen: Keine

BeitragVerfasst am: 27.01.2008, 12:57    Titel: Antworten mit Zitat

Ah ok.

Dann sind die also "fast" gleich zu behandeln.

Zum Edit meiner Frage:
Wüdest du nun versuchen nur die variablen in einer struct/class zu speicher oder auhc dei ganzen methoden dazu die diese variuablen verwenden ?

Oder konkret: Wenn du ne Klasse für ein sprite hast und davon hunderte instancen in ner Managerklasse gespeichert hast. Würdest du dann z.B. die Rendermethode in der struct oder in dem Manager schreiben ?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 27.01.2008, 14:49    Titel: Antworten mit Zitat

Also ich mach das so:
Ich benutze Strukturen eigentlich, wenn ich zusammenhängende Daten bündeln will. Die kriegen dann manchmal noch Konstruktoren um Standardwerte zu setzen. Allerdings nie Methoden. Die Elemente sind daher alle public, und man kann von außen darauf zugreifen.
Bei Klassen sind Member immer privat, es sei den bei sowas wie Vectorklassen, wo man ja von außen schnell darauf zugreifen will.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 27.01.2008, 17:18    Titel: Antworten mit Zitat

Otscho hat Folgendes geschrieben:
Ah ok.

Dann sind die also "fast" gleich zu behandeln.

Zum Edit meiner Frage:
Wüdest du nun versuchen nur die variablen in einer struct/class zu speicher oder auhc dei ganzen methoden dazu die diese variuablen verwenden ?

Oder konkret: Wenn du ne Klasse für ein sprite hast und davon hunderte instancen in ner Managerklasse gespeichert hast. Würdest du dann z.B. die Rendermethode in der struct oder in dem Manager schreiben ?


Wenn du ohne VTables arbeitest sollte der Overhead an Speicherverbrauch durch die einzelnen Methoden in der Klasse/struct bei nur ein par hunderten nicht zu extrem sein, bei VTables hast du praktisch sowieso nur einmal den verbrauch für die Methoden, egal wie viele Instanzen du davon erstellst.

Das ganze ist also eher eine Entwurfsmuster Frage. Ichpersönlich würde der Managerklasse sowie den einzelnen Spriteklassen eine Rendermethode geben. so kannst du recht flexibel neue Verhaltensmuster erzeugen indem du zB eine Ableitung der Spriteklasse erstellst und die Rendermethode überlädst.

Edit:

@Jonathan: Vektorklassen?
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 27.01.2008, 17:20    Titel: Antworten mit Zitat

äh, mathematische Vektoren. Sowas mit x, y oder x, y, z.
Die Vektoren, die man mit Matrizen multipliziert (oder gings nur andersherum? naja, egal Very Happy).
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 27.01.2008, 18:20    Titel: Antworten mit Zitat

Sowas lässt sich in C# so schön abbilden aber unter C++ habe ich das auch schon gesehen das man setter und getter erstellen kann wenn man eine Membervariable ändern möchte (war unter dem Borland C++ Builder) jemand ne Idee wie das da gemacht wurde?
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Otscho
Super JLI'ler


Alter: 36
Anmeldedatum: 31.08.2006
Beiträge: 338
Wohnort: Gummibären-Gasse
Medaillen: Keine

BeitragVerfasst am: 27.01.2008, 19:17    Titel: Antworten mit Zitat

Fallen hat Folgendes geschrieben:
Wenn du ohne VTables arbeitest sollte der Overhead an Speicherverbrauch durch die einzelnen Methoden in der Klasse/struct bei nur ein par hunderten nicht zu extrem sein, bei VTables hast du praktisch sowieso nur einmal den verbrauch für die Methoden, egal wie viele Instanzen du davon erstellst.


Dann bin ich ja beruhigt Very Happy

Also einfach beim Deklarieren ein virtual vorne hinsetzen, dann muss man sich um einen unnötigen Speicherverschleiß in der Beziehung keine Sorgen machen ?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 28.01.2008, 12:29    Titel: Antworten mit Zitat

struct kommt (wie union) aus C, d.h. es ist in erster Linie aus Grund der Kompatibilität beibehalten worden. Dabei hat man sie aber noch erweitert (z.B. spart man sich jetzt das typedef davor) und gleich noch Klasseneigenschaften hinzugefügt. Für einen guten Stil solltest du sie so benutzen wie Fallen und Jona das schon gesagt haben. Das siehst du schon am default-Access:

class Arrow default: private Arrow zugriff durch Methoden
struct Arrow default: public Arrow zugriff direkt

Die Sache mit den Constructoren z.B. hat man für structs wegen der Einfachheit zugefügt, z.B.:
CPP:
// in C
typedef struct _foo1
{
     int i;
     bool b;
} foo1;
foo1 var1 = { 0, true };

// in C++
struct foo2
{
     foo2( int _i = 0, bool _b = true ) : i(_i), b(_b) {}

     int i;
     bool b;
};
foo2 var2; // automatisch mit 0 und true instanziert
var2 = foo2( 2, false ); // durch den Konstruktor lesbar neuzugewiesen
foo2 var3( 3 ); // automatisch mit 3 und (default) true erzeugen


Gruß DXer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
AFE-GmdG
JLI MVP
JLI MVP


Alter: 45
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 28.01.2008, 12:35    Titel: Antworten mit Zitat

Der Unterschied ist doch ganz klar - Er liegt im Speicherhandling:

Ein Struct ist ein WertTyp, was bedeutet, eine Instanz wird auf dem Stack abgelegt.
Eine Class ist ein VerweisTyp, was bedeutet sie wird mit new instanziiert und liegt damit im Heap.

man kann ein Struct auch als Verweistyp mit new erstellen, genauso wie man eine Klasse auf Stack legen kann - jedoch sind dies eher die Ausnahmen
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Deviloper
Junior JLI'ler



Anmeldedatum: 31.05.2006
Beiträge: 77

Medaillen: Keine

BeitragVerfasst am: 28.01.2008, 14:41    Titel: Antworten mit Zitat

? Hab nciht alles verstanden was du uns damit sagen willst. Aber es gibt defacto keinen Unterschied, mit Ausnahme der Zugriffrechte, zwischen class und struct in C++. Beide liegen auf dem Stack, solange du nicht hingehst und durch dynamische Speicheranforderung (new, new[]) sie auf den Heap legst.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 29.01.2008, 09:05    Titel: Antworten mit Zitat

AFE-GmdG hat Folgendes geschrieben:
Der Unterschied ist doch ganz klar - Er liegt im Speicherhandling:

Ein Struct ist ein WertTyp, was bedeutet, eine Instanz wird auf dem Stack abgelegt.
Eine Class ist ein VerweisTyp, was bedeutet sie wird mit new instanziiert und liegt damit im Heap.

man kann ein Struct auch als Verweistyp mit new erstellen, genauso wie man eine Klasse auf Stack legen kann - jedoch sind dies eher die Ausnahmen

Das kann man so nicht sagen, machst du z.B. sowas?
CPP:
std::map< std::string*, int>* m = new std::map<std::string, int>();
map[ new std::string() ] = 0;
Bestimmt nicht, trotzdem sind beides Klassen. Es ist auch im Grunde kein guter Stil, jede Klasse auf dem Heap auzulegen (vor allem weil man ständig mit pointern arbeiten muss). Das kommt immer auf den Verwendungszweck an. Von Grund auf gibt es nur diesen einzigen Default-Access-Unterschied zwischen public und private.

Gruß DXer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 29.01.2008, 18:36    Titel: Antworten mit Zitat

@AFE-GmdG: Bezieht sich deine Antwort nicht eher auf C#?
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
AFE-GmdG
JLI MVP
JLI MVP


Alter: 45
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 30.01.2008, 08:46    Titel: Antworten mit Zitat

Fallen hat Folgendes geschrieben:
@AFE-GmdG: Bezieht sich deine Antwort nicht eher auf C#?
Dort Trifft es noch viel deutlicher zu - ja.
Aber auch in C++ sollten imho Kassen und Strukturen wie oben beschrieben verwendet werden.
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 30.01.2008, 09:56    Titel: Antworten mit Zitat

Dort ist es aber eine Stilfrage, optimiert wird dadurch ja kaum etwas, es sei denn du hast in deiner Klasse soviel Material das dadurch der ganze Stack überfüllt wird, aber sowas sollte so gut wie nie auftreten.

Wie DirectXer auch schon anmerkte tut man das mit den ganzen STL Klassen ja auch nicht.
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum