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

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

11

22.10.2014, 06:36

An wen war die Frage gerichtet?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

buggypixels

Treue Seele

Beiträge: 125

Wohnort: Meerbusch

Beruf: Programmierer

  • Private Nachricht senden

12

22.10.2014, 09:45

Einfach ohne viel Worte:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct SomeStuff {
  int value;
  SomeStuff() : value(0) {}
  explicit SomeStuff(int v) : value(v) {}
};

int main() {
  int iZahl = 0;
  cin >> iZahl;
  SomeStuff* array = new SomeStuff[iZahl]; // alle Einträge haben den value = 0
  for ( int i = 0; i < iZahl; ++i ) {
    array[i]->value = i;
  }
  //...
  delete[] array;
}

Statt einem Struct geht natürlich auch eine Klasse. Aber warum so kompliziert?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

13

22.10.2014, 09:55

Was ist denn Deiner Meinung nach komplizierter an einer Klasse statt an einem Struct?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

buggypixels

Treue Seele

Beiträge: 125

Wohnort: Meerbusch

Beruf: Programmierer

  • Private Nachricht senden

14

22.10.2014, 12:34

Generell gibt es groß keinen Unterschied. Aber in diesem Fall hätte ich value als "private" Member definieren müssen, dann eine getter/setter Methode.
Das wäre manchen übel aufgestoßen, weil ist ja dann nicht OOP.
Darum nehme ich in solchen einfachen Fällen immer als erstes einen Struct und mache dann bei Bedarf erst ein Klasse daraus.
Das kompliziert bezieht nur auf dieses Beispiel

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

15

22.10.2014, 14:20

Und wo genau siehst Du da jetzt den Unterschied zwischen einem struct mit public-Membern und einer class mit Zugriffsmethoden für das Attribut? Deine Logik kann ich nicht ganz nachvollziehen. Du triffst da eine Wahl zwischen Pest und Cholera und erklärst, eins davon sei besser. ;)

Allerdings bestreite ich auch nicht, dass C++ eindeutig eine Möglichkeit fehlt Objekte ohne Standard-Konstruktor als Array anzulegen.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

buggypixels

Treue Seele

Beiträge: 125

Wohnort: Meerbusch

Beruf: Programmierer

  • Private Nachricht senden

16

22.10.2014, 15:59

Reine Bequemlichkeit.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

17

22.10.2014, 17:59

Allerdings bestreite ich auch nicht, dass C++ eindeutig eine Möglichkeit fehlt Objekte ohne Standard-Konstruktor als Array anzulegen.

Das stimmt zwar, mit placement new lässt sich das gewünschte Ergebnis aber zumindest theoretisch erreichen:

C-/C++-Quelltext

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
26
27
28
29
30
#include <memory>

class Blub
{
public:
    Blub(int i) {}

    Blub(const Blub&) = delete;
    Blub& operator =(const Blub&) = delete;
};


int main()
{
    static const size_t N = 1000;

    auto my_array_buffer = std::make_unique<alignas(Blub) char[]>(N);

    Blub* my_array = reinterpret_cast<Blub*>(&my_array_buffer[0]);

    // Objekte konstruieren
    for (Blub* p = my_array; p < my_array + N; ++p)
        new (p) Blub(42);

    // ...

    // Destructor muss manuell aufgerufen werden! :(
    for (Blub* p = my_array + N; p != my_array;)
        (--p)->~Blub();
}


Wobei ich mir natürlich sehr gut überlegen würde, ob std::vector mit emplace_back() nicht die bessere Idee ist. Wenn, sollte man das Ganze auf jeden Fall in einer entsprechenden Klasse kapseln...

Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von »dot« (22.10.2014, 21:02)


TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

18

23.10.2014, 17:41

Man sollte aber hier mal ganz kurz erwaehnen, das dies in neuen Sprachen, z.b. mit GC noch viel schlimmer ist. Hier kann man solche Konzepte gar nicht oder nur ueber grosse Umwege umsetzen, das hier alles darauf ausgelegt ist, dass man nur noch ein Array aus Pointern hat, welches dann irgendwo wild verteilt im Speicher die Daten ablegen koennte. Von daher ist z.b. std::vector mit seinen Moeglichkeiten richtiger Luxus, hier steht einem mit recht geringen Aufwand alles offen.

Werbeanzeige