"new" manipulation
-
Hallo an alle,
ist es möglich, den Operator "new" auf eine class "xy" so aus dem ctor der class "xy" heraus zu füttern, dass "new" aus dem ctor von xy heraus 0 zurück liefert? Das würde mir eine Abfrage wie if ( xy::valid() == 0 ) { delete xy } ersparen.
Danke vorab,
Lars
-
Nachdem ich nach dem 2. mal Lesen jetzt fast sicher bin deinen etwas krumm formulierten Satz verstanden zu haben...
Nein, das ist nicht möglich. Im Konstruktor hast du keine Möglichkeit mehr die Adresse des Objekts, die dann ja von "new" zurückgegeben wird, zu ändern.
Mit bekannte Optionen, von "mag ich" nach "mag ich nicht" sortiert:
- Im Ctor eine Exception werfen
- Named-Ctor aka. Factory-Funktion ("xy::create()")
- In der Klasse xy einen eigenen "operator new" definieren, der dann erst checkt ob das Objekt erzeugt werden kann, und falls nicht einfach NULL zurückgibt
- Two-Phase Construction ("if (!xy.initialize()) ...")
-
Gottseidank gibt es Profis wie euch.
Deine Variante liefe also so?
try
{
XY xy = new XY();
}
catch ( xy.exception )
{
xy = 0;
}
-
Optimalerweise kann man mehrere Klassen und Funktionen zu einer gedachten Gruppe zusammenfassen, die alle die gleiche Exception werfen. Oder man baut sich Exceptions für das aktuelle Projekt. Jedenfalls würde ich nicht für jedes Objekt eine eigene Exceptionklasse anlegen, das wird doch ein heilloses gefange. Der Sinn sollte doch eigentlich sein, relativ weit "oben" zu fangen, und sich dann in den niedrigeren Funktionen gar nicht mehr um die Fehlerbehandlung kümmern zu müssen.
-
chezz schrieb:
Deine Variante liefe also so? [...]
Wohl eher so:
std::unique_ptr<XY> xy(new XY());
-
chezz schrieb:
Deine Variante liefe also so?
try
{
XY xy = new XY();
}Ganz sicher nicht, das wäre nichtmal gültiges C++. Gib uns mal bitte dein konkretes Beispiel, was du hast und was du erreichen willst. Das klingt mir irgendwie nach "von hinten durch die Brust ins Auge", was du da anstellst.
-
bottom up...
@pumuckl: das sollte nur pseudocode sein.
@dot: völlig neu für mich. Werde ich mir morgen mal ansehen.
@cooky451: hab mir erstmalnur eine exception-class gemacht, die ints wirft.
@hustbaer: ich komme zwar sauber raus aus dem ctor, aber im catch knallts bei "delete xy". Morgen mehr, muss ins bett.XY::XY( char* arg ) { ... if ( arg == 0 ) { throw myException( 1 ); // return; } ... } //----------------------------------- #include "myException.h" class myException; XY* xy = 0; try { xy = new XY( 0 ); } catch ( myException & e ) { delete xy; // <- xy != 0 aber trotzdem crash xy = 0; }Danke an euch!
/edit pumuckl: cpp-Tags spendiert. Bitte künftig selber machen!
-
wenn du im catch landest, wurde kein Objekt erzeugt, also kannst du auch nichts zerstören... xy sollte außerdem weiterhin 0 sein.
greetz KN4CK3R
-
Die letzten Tage hab' ich viel geproggt.
Man lernt ja nie aus ...
@pumuckl: Danke für's Editieren.
@knacker: Wer Zeile 21 vergisst, ist selber Schuld!
@dot: Da könnten noch Frage meinerseits kommen...
@cookie451:static_cast<OffTopic*>( OtherThread )Menschen mit zwei Augen sind nach reichlicher Reisetätigkeit in alle Kontinente definitiv "normal".
Nochmals ein herzliches "Danke" an euch und eure Denkanstösse.
Lars