2009-06-18 8 views
1

Mögliche Duplizieren:
Detect dynamically allocated object?Wie kann ich feststellen, ob ein Objekt im Konstruktor statisch oder dynamisch zugeordnet ist?

Ich habe ein Objekt, das eine etwas andere Konstruktion erfordert, ob es Instanz ist staticly oder dynamisch zugewiesen. Das Objekt sollte nur einen einzelnen Standardkonstruktor haben. Es ist daher nicht möglich, zwei Konstruktoren zu haben, einen für jeden Fall, und den Benutzer explizit den richtigen Konstruktor auswählen zu lassen.

Gibt es einen geeigneten Weg dies zu erreichen?

So mache ich das im Moment: Ich überladen den neuen Operator für dieses Objekt, malloc den Speicher und verwenden Sie den zurückgegebenen Zeiger als Zeiger auf die (noch nicht initialisierte) Instanz, und legen Sie eine bestimmte Daten Mitglied des Objekts zu einem magischen Wert. Dann überprüfe ich innerhalb des Verbrauchers den Wert des Mitglieds. Wenn es sich um den magischen Wert handelt, wird das Objekt zu 99,9% dynamisch zugewiesen.

Diese Methode ist für mich weder im Relase- noch im Debug-Modus fehlgeschlagen, es scheint jedoch ein schrecklicher Hack zu sein.

+1

Nein, Sie müssen sich mit Ihrem Hack zufrieden geben. Der einzige "richtige" Weg, dies zu tun, ist, dein Design zu reparieren. – jalf

Antwort

0

Jeder Konstruktor kann für statische oder dynamische Zuweisung verwendet werden. Es gibt keine Möglichkeit für Sie, den Benutzer des Objekts zu zwingen, einen bestimmten Konstruktor zu verwenden, unabhängig davon, wie er das Objekt zuweist.

2

Sie sollten in der Lage sein, zu erreichen, was Sie wollen, während Sie einen einzelnen benutzerzugänglichen Standardkonstruktor lassen (der für statische und auto Objekte verwendet wird - Sie scheinen die Existenz von automatischen Objekten zu ignorieren, zB lokale Variablen, so stelle ich mir vor du willst diese fälle gleich behandeln).

Make operator new und ein separater Konstruktor privater und eine öffentliche statische Methode machen (es ist ein Fall der „Factory-Methode“ Entwurfsmuster), das nur funktioniert ein return new TheClass(123); (die separate Konstruktor unter der Annahme zum Beispiel nimmt eine ganze Zahl, sondern von Natürlich können Sie jede Art von Argument auswählen, da das Argument sowieso nicht verwendet wird.

Sie wissen, Sie sagten, das Objekt sollte einen einzelnen Konstruktor haben, aber vom Standpunkt des Benutzers ist genau das der Klasse verhält, und es gibt keine "explizite Auswahl des Konstruktors" auf Seiten des Benutzers (er kann einfach nicht Rufen Sie new explizit an, aber müssen Sie die von Ihnen zur Verfügung gestellte Fabrikmethode durchlaufen, das ist alles).

+0

Ich bin mir nicht sicher, ob ich das verstanden habe. Meinst du, dass der Benutzer die statische Funktion aufrufen müsste, um eine neue Instanz zu vergeben, anstatt neue zu verwenden? Wenn du das meinst, warum übertreibst du überhaupt neu? Wie auch immer, das geht nicht, weil die Klasse vererbt werden muss, und nach Ihrer Methode sollte jede Unterklasse auch ihre eigene statische Funktion definieren.* Wie Sie bereits erwähnt haben, werden automatische Objekte als statisch behandelt. –

+0

Wenn Sie neue private Blöcke erstellen, kann der Benutzer einfach 'new Foo()' aufrufen, wie es sonst der Fall wäre. Und ja, wenn _alle_ Foo-Objekte, die in dynamischem Speicher leben (einschließlich als Basisklassen oder Mitglieder), spezielle Behandlung benötigen, dann erfordert mein Vorschlag andere Klassen, dies ebenfalls zu tun - aber Ihre vorgeschlagene Lösung funktioniert dann nicht besser! -) –

0

Ich glaube nicht, dass Sie im Konstruktor sagen können.

Ich weiß nicht, ob das hilft, aber man kann das Objekt verhindern die destructor privat von zu werden, indem sie statisch erstellt. Sie müssten auch eine öffentliche "Delete" -Methode haben, die eine delete this für Code ausführt, der Objekte dieser Klasse dynamisch zuweist - sie müssten eine obj->Delete() statt delete obj machen.

+0

Dies funktioniert überhaupt nicht in einer Basisklasse. Ein privater Destruktor würde verhindern, dass das Unterklassenobjekt jemals existiert. Ein geschützter Basisklassen-Destruktor kann von seinen Kindern aufgerufen werden, was bedeutet, dass die Unterklasse auf dem Stack erstellt werden kann. Es sei denn, die Unterklasse beschränkt auch ihre Sichtbarkeit. In beiden Fällen ist ein geschütztes dtor in der Basisklasse nutzlos. –