Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Anonymous

unregistriert

1

06.02.2004, 13:40

union Vs. struct Vs. class

Wo ist genau der Unterschied zwischen einem
uinon und einem struct ?

Und wann soll man diese, anstatt einer Klasse, anwenden?

???

2

06.02.2004, 14:16

Bei einer Union teilen sich die Variablen einen Speicherbereich. Schau dir da mal die ganzen Vektordefinitionen an. In einer Struktur teilen sich die Variablen nicht den Speicherbereich.

Zitat

Und wann soll man diese, anstatt einer Klasse, anwenden?
Wenn sowieso alles public sein soll, kann man auch Strukturen verwenden, statt einer Klasse. Allerdings war eine Struktur immer nur ein Pack für Daten. Dabei sollte man es auch belassen. Eine Union sollte man immer dann verwenden wenn es Sinnvoll ist dass sich mehrer Daten einen Speicherbereich teilen sollen. Siehe dazu auch die Vektorklassen.

Kleines Beispiel:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
struct _vec3
{
  union {
    float x;
    float u;
  };
  union {
    float y;
    float v;
  };
  union {
    float z;
    float w;
  };
};

class Vector3D
{
  _vec3  m_Data;

public:
  // Konstruktoren
  // Operatoren
  // Funktionen
};
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Anonymous

unregistriert

3

06.02.2004, 14:29

Ok danke, das einzigste was ich nicht so ganz verstehe ist das mit dem Speicherbereich teilen.
Wie genau ist das zu verstehen und woran erkenne ich, dass ich die Technik nutzen soll!?

4

06.02.2004, 15:06

Ist doch ganz einfach. Du solltest dich einfach Fragen, was ist denn eine Variable. Eine Variable ist nur ein Platzhalter für eine Adresse. Denn Variablen kennt die CPU nicht. Bei einer Union kann man also mehrere Variablen Definieren die auf den selben Speicherbereich zugreifen.

Im obigen Beispiel greifen die Varialben "x" und "u" also auf den selben Speicherbereich zu. Das macht sehr viel Sinn weil, erstens ist damit unsere _vec3 Struktur nur 12 Byte groß statt 24 Byte und zweitens verwenden Texturkoordinaten andere Bezeichnungen als die Koordinaten im Koordinatensystem.

Ein anderes gutes Anwendungsbeispiel ist die Konvertierung von "float" in "DWORD".

Quellcode

1
2
3
4
5
union _conv
{
  float        f;
  DWORD  dw;
};
Der Datentype _conv ist damit nur 32Bit Breite und wird einmal als Floatingpoint und einmal als Ganzzahl dargestellt. Anwendung würde das z.B. bei den Render States von D3D finden. Einige wollen ein Float-Wert haben. Aber der Parameter ist ein DWORD. mit unserem Typ kein Problem.

Quellcode

1
2
3
_conv state;
state.f = 0.2f;
pD3DDevi->SetRenderState(D3DRS_FOGSTART, state.dw);
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Anonymous

unregistriert

5

06.02.2004, 15:41

ok, jetzt habe ichs auch verstanden.

Vielen Dank für deine Hilfe :wink:

6

06.02.2004, 17:42

ach ja
da du C++ programmierst, ist es egal ob du struct oder class schreibst
beide haben die selbe bedeutung, der einzige unterschied ist, das der standard zugriff auf eine struct public ist, auf eine class aber private

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
class TestClass
{
    protected:
                 int m_x;
};

//hat die selbe bedeutung wie:
struct TestClass
{
      protected:
               int m_x;
};
Do, ut des!
Ceterum censeo, carthaginem delendam esse

7

21.02.2004, 12:01

Hi,
@Hauptmann:

Zitat

du schreibst
.., ist es egal ob du struct oder class schreibst
beide haben die selbe bedeutung, der einzige unterschied ist, das der standard zugriff auf eine struct public ist, auf eine class aber private

Es gibt erhebliche Unterschiede zw. struct und class:
Strukturen(struct) sind einfach und ihre Größe via sizeof() gut bestimmbar, daher kann man sie aus Dateien leicht lesen und in solche schreiben, das ist ihr Vorteil.
Klassen(class) haben, so man will, neben Variablen(Members) wie in einer Struktur auch eigene Funktionen(Memberfunctions) usw.

Eine Klasse kann erben von anderen,
Eine Variable oder Funktion in einer class A definiert, braucht man in einer class B nicht nochmal zu definieren, es reicht A als Vorfahr zu erklären via

Quellcode

1
class B : A {...}
auch C kennt sie wenn es via

Quellcode

1
class C : B {...} 
deklariert wurde. Zumindest bei public oder protected deklarierten Variablen oder Funktionen.
Hierachien von Klassen sind so erst denkbar - Beispiel MFC.
Ein wichtiger Aspekt ist die Kapselung: Man braucht nicht alle Memberfunktionen eines Projektes zu kennen...

nofi

Osram

Alter Hase

Beiträge: 889

Wohnort: Weissenthurm

Beruf: SW Entwickler

  • Private Nachricht senden

8

21.02.2004, 14:59

nofi, Du hast recht, wenn es um C programmierung geht.

In C++ kann man die von Dir genannten Sachen mit structs machen.

Dazu aus dem Kapitel "structs" dieses Textes:
http://www.osborne.com/products/0072227222/0072227222_ch01.pdf

"The only difference between class and struct is that, by
default, all members of a structure are public."

und

"In C, several restrictions apply to structures. First, they may contain only
data members; member functions are not allowed. C structures do not
support inheritance. Also, all members are public and the keywords public,
protected, and private are not allowed."

9

21.02.2004, 15:19

Zitat von »"nofi"«

Hi,
@Hauptmann:

Zitat

du schreibst
.., ist es egal ob du struct oder class schreibst
beide haben die selbe bedeutung, der einzige unterschied ist, das der standard zugriff auf eine struct public ist, auf eine class aber private

Es gibt erhebliche Unterschiede zw. struct und class:
Strukturen(struct) sind einfach und ihre Größe via sizeof() gut bestimmbar, daher kann man sie aus Dateien leicht lesen und in solche schreiben, das ist ihr Vorteil.
Klassen(class) haben, so man will, neben Variablen(Members) wie in einer Struktur auch eigene Funktionen(Memberfunctions) usw.




es gibt überhaupt keinen unterschied

sonst würde im ANSI Standard Draft nicht folgendes stehen:

Zitat


A structure is a class defined with the class-key struct; its members
and base classes are public by default
.


übrigens:
In C kann man auch in strukturen Funktionen haben. Das ganze geht über Funktionszeiger, also Zeiger auf eine Funktion.
Do, ut des!
Ceterum censeo, carthaginem delendam esse

10

23.02.2004, 17:46

Zitat

übrigens:
In C kann man auch in strukturen Funktionen haben. Das ganze geht über Funktionszeiger, also Zeiger auf eine Funktion.
Das ist richtig. Aber die Struktur wird dann immer 4Byte größer mit jeder Funktion. Das ist unter C++ nicht so. Wenn man auf Virtuelle Methoden und virtuelle Vererbung absieht, bestimmen ausschließlich die Member Variablen (Eigenschaften) die Größe einer Klasse oder auch einer Struktur.

Man sollte jedoch immer dann Klassen verwenden wenn klar ist das man auch Methoden dazu packt. Strukturen sollten nur im Sinne von C verwendet werden. Auch wenn es in C++ bis auf die Zugriffsrechte keine Unterschiede gibt.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Werbeanzeige