digitalmars.D - design question - class vs. struct
- clayasaurus (21/21) May 24 2004 Hi, recently I've been trying to design a 3d game engine, and I was
- Norbert Nemec (14/41) May 24 2004 class objects are generally stored on the heap. A class variable actuall...
-
Arcane Jill
(8/12)
May 25 2004
In article
, clayasaurus says... - Ilya Minkov (22/34) May 25 2004 Better so:
Hi, recently I've been trying to design a 3d game engine, and I was thinking about using a bunch of different classes that work together to handle various different things I want to do (input, window, player, box). However, I've been having some trouble with classes in D (read: "The delete that never ends the program" posting), and was wondering if I should just use structs instead, like so... struct playerData {...} playerInitialize(playerData pd) playerMouseLook(playerData pd, etc..) The question I have is this. Why do I need to use the new operator to create a new class (cClass class = new cClass) and not to create a new stuct? When should I use a class, and when should I use structs with functions that modify that struct? and is it ok to imbed a class within a class like cPlayer { cVector vector; } ? I am a bit confused, and would appreciate help. thanks.
May 24 2004
class objects are generally stored on the heap. A class variable actually always is a reference to the object data on the heap. struct are stored inline, i.e. directly on the stack, directly within the object data or with an enveloping struct that contains the inner struct. You may, of course allocate a struct on the heap, but then you have to handle it using a pointer. In general, you can view structs as "lightweight classes" - there are no inheritance, no interfaces and no constructor/destructor. For small data sets, structs perform better, since they have less overhead (allocation, dereferenciation) Once the data gets bigger, the copying of the data may weigh in heavier. If you need polymorphism, structs are no option anyway. Last argument in favor of structs may be their value-semantics, which would probably be what you expect of stuff like you cVector. clayasaurus wrote:Hi, recently I've been trying to design a 3d game engine, and I was thinking about using a bunch of different classes that work together to handle various different things I want to do (input, window, player, box). However, I've been having some trouble with classes in D (read: "The delete that never ends the program" posting), and was wondering if I should just use structs instead, like so... struct playerData {...} playerInitialize(playerData pd) playerMouseLook(playerData pd, etc..) The question I have is this. Why do I need to use the new operator to create a new class (cClass class = new cClass) and not to create a new stuct? When should I use a class, and when should I use structs with functions that modify that struct? and is it ok to imbed a class within a class like cPlayer { cVector vector; } ? I am a bit confused, and would appreciate help. thanks.
May 24 2004
In article <c8u159$132i$1 digitaldaemon.com>, clayasaurus says... Norbert answered this very well, but I should just like to add: re:(cClass class = new cClass)andcVector vector;From the D style guide: Class, Struct, Union, Enum names are capitalized.class Foo; class FooAndBar;Hungarian Notation Just say no.
May 25 2004
clayasaurus schrieb:struct playerData {...} playerInitialize(playerData pd) playerMouseLook(playerData pd, etc..)Better so: struct PlayerData{ initialize(); mouseLook(etc..); ... } then (if you don't forget to define the functions) you can do: PlayerData player; player.initialize(); ... just as you would in C++. All non-static functions get a hidden parameter "PlayerData * this". :)When should I use a class, and when should I use structs with functions that modify that struct?My intuition would be, you make vector a struct - since it needs no inheritance, and player a class - since you would want to share the *same* player in different parts of a program, and there are different types of players (inheritance/polymorhism!), and players may get pretty large since they have state, AI, and geometry associated with them.and is it ok to imbed a class within a class like cPlayer { cVector vector; } ?Yes, but don't forget to new or assign the vector before you use it. However, you really hardly want vector to be a class, as seen from your previous thread. -eye
May 25 2004