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

21

04.09.2012, 13:00

Wie das? Wie behandelst Du das Löschen denn dann, wenn die Handhabung der Objekte polymorph erfolgt, deren Zerstörung aber nicht?
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]

stef

Treue Seele

Beiträge: 246

Wohnort: Kassel

Beruf: Softwareentwickler

  • Private Nachricht senden

22

04.09.2012, 13:03

Darunter fällt unter anderem auch das Verhalten beim Zerstören.


Aber nur unter anderem. Aber da du ohnehin virtuelle Methoden verwendest, könntest du den Destruktor vermutlich auch virtuell machen.

Zitat


Fehler 1 error C2248: "Base::~Base": Kein Zugriff auf protected Member, dessen Deklaration in der Base-Klasse erfolgte. d:\entwicklung\test_console_2008\test_console_2008\test.cpp 27 Test_Console_2008


Genau, das will man durch einen geschützten Destruktor haben.


Kann mir mal einer einen Anwendungsfall nennen. Ich verstehe den Sinn eines protected destructors offenbar noch nicht.
"In C++ it's harder to shoot yourself in the foot, but when you do, you blow off your whole leg." — Bjarne Stroustrup.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

23

04.09.2012, 13:05

Der Sinn ist offenbar eine polymorphe Zerstörung zu unterbinden. Der Anwendungsfall ist mir aber auch nicht ganz klar, bzw. die Absicht dahinter, wieso man so etwas wollen würde oder wozu man es braucht.
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]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

24

04.09.2012, 13:07

In der Regel ist der konkrete Typ der Objekte bei deren Erzeugung sowieso bekannt. Wenn ich Objekte nicht polymoph erzeuge (z.B. über eine Factory), gibt es in normalerweise keinen Grund, sie polymoph zu zerstören:

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>


class MyInterface
{
protected:
  // Boilerplate
  MyInterface() {}
  MyInterface(const MyInterface&) {}
  MyInterface& operator =(const MyInterface&) { return *this; }
  ~MyInterface()
  {
    std::cout << "MyInterface::~MyInterface\n";
  }

public:
  virtual void shakeItBaby() = 0;
};

class ImplementationA : public virtual MyInterface
{
public:
  ~ImplementationA ()
  {
    std::cout << "ImplementationA::~ImplementationA \n";
  }

  void shakeItBaby()
  {
    std::cout << "D I S C O\n";
  }
};


void genericAlgorithm(MyInterface& stuff)
{
  stuff.shakeItBaby();
}

int main()
{
  ImplementationA a;
  genericAlgorithm(a);
}

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »dot« (04.09.2012, 13:13)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

25

04.09.2012, 13:10

Hmm, ich erzeuge meine so gut wie immer polymorph über eine Factory, weil ich sie aus Files de-serialisiere und nur im Editor erstelle und dann dort in Files serialisiere.
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]

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

26

04.09.2012, 13:14

Kann mir mal einer einen Anwendungsfall nennen. Ich verstehe den Sinn eines protected destructors offenbar noch nicht.


Wenn du Objekte hast die sich per Design nicht polymorph verhalten sollen, aber die trotzdem spezialisiert werden dürfen (die STL Implementierung von VS ist voll mit Beispielen). In diesem Fall ist es praktisch den Destruktor der Basis zu schützen um defensiv zu bleiben und etwaige Fehler zu vermeiden.

Herb Sutter hat sogar folgende Guideline verfasst:

Guideline #4: A base class destructor should be either public and virtual, or protected and nonvirtual.

Weitere Infos hier: Virtual Question #2: What About Base Class Destructors?
@D13_Dreinig

stef

Treue Seele

Beiträge: 246

Wohnort: Kassel

Beruf: Softwareentwickler

  • Private Nachricht senden

27

04.09.2012, 13:19

Letzten Endes ist es doch eine Frage welche Resourcen die Basis- und die Abgeleitete Klasse benutzen und wo diese wieder freigegeben werden müssen / sollen.
Wenn die Basisklasse z.B. einen protected Zeiger enthält und für diesen Speicher allokiert, dann kann man das frei geben im Destruktor der Basis- als auch der
abgeleiteten Klasse erledigen.
Für polymorphe Strukturen würde ich hier virtuelle Konstruktoren bevorzugen die jeweils hinter ihrer eigenen Klasse sauber machen.
"In C++ it's harder to shoot yourself in the foot, but when you do, you blow off your whole leg." — Bjarne Stroustrup.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

28

04.09.2012, 13:24

Die Möglichkeit Objekte zu deleten, betrachte ich als Teil des Interface eines Typs und wird durch einen public virtual Destruktor im Interface ausgedrückt. Ich persönlich find sowas aber eigentlich eher unsauber, da es massive Einschränkungen an die Implementierungen des Interface impliziert.
Z.B. muss nun sichergestellt sein, dass sämtliche Instanzen aller jemals abgeleiteten Typen ausschließlich nur mit new erzeugt werden, Stackallokation, selbst placement new, ein eigener Allocator etc. ist plötzlich keine Option mehr, Typen mit Wertsemantik können das Interface überhaupt rein prinzipiell nichtmehr implementieren...

Wenn du mein Beispiel oben betrachtest, fällt auf, dass ImplementationA sogar einen funktionierenden Kopierkonstruktor hat. Wieso nicht, vielleicht macht es für Objekte vom Typ ImplementationA Sinn, sie zu kopieren!? Das Interface ist in der Regel völlig unabhängig von solchen Dingen, denn es ist ja gerade der Sinn von Polymorphie, Objekte unabhängig ihrer genauen Gestalt und Herkunft auf abstrakterer Ebene gleich zu behandeln...

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »dot« (04.09.2012, 13:31)


stef

Treue Seele

Beiträge: 246

Wohnort: Kassel

Beruf: Softwareentwickler

  • Private Nachricht senden

29

04.09.2012, 13:31

Die Möglichkeit Objekte zu deleten, betrachte ich als Teil des Interface eines Typs und wird durch einen public virtual Destruktor im Interface ausgedrückt. Ich persönlich find sowas aber eigentlich eher unsauber, da es massive Einschränkungen an die Implementierungen des Interface impliziert.
Z.B. muss nun sichergestellt sein, dass sämtliche Instanzen aller jemals abgeleiteter Typen ausschließlich nur mit new erzeugt werden, Stackallokation, selbst placement new, ein eigener Allocator etc. ist plötzlich keine Option mehr, Typen mit Wertsemantik können das Interface überhaupt rein prinzipiell nichtmehr implementieren...

Wenn du mein Beispiel oben betrachtest, fällt auf, dass ImplementationA sogar einen funktionierenden Kopierkonstruktor hat. Und das macht ja nichts, vielleicht macht es für Objekte vom Typ ImplementationA Sinn, sie zu kopieren. Das Interface ist in der Regel völlig unabhängig von solchen Dingen...



Ich verstehe kein Wort !
Kannst du das auch in verständlichem Deutsch beschreiben. :hmm:
"In C++ it's harder to shoot yourself in the foot, but when you do, you blow off your whole leg." — Bjarne Stroustrup.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

30

04.09.2012, 14:17

Z.B. muss nun sichergestellt sein, dass sämtliche Instanzen aller jemals abgeleiteten Typen ausschließlich nur mit new erzeugt werden, Stackallokation (...) ist plötzlich keine Option mehr

OK, also scheinbar sind meine C++ Tage doch eindeutig zu lange her. Wieso ist das keine Option mehr, nur weil das Interface einen virtuellen Destruktor vorschreibt?
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]

Werbeanzeige