Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Konstruktor -> null

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
14.12.2006, 16:49 Uhr
Lensflare



Hallo.

Ich will einen Pointer auf ein Objekt haben:

C++:
int i = -1;
Klassenname *p = new Klassenname(i);


aber wenn im Konstruktor etwas schief läuft (nach Überprüfung des Parameters), will ich, dass NULL zurückgegeben wird.
Wie kann ich das machen?
Im Konstruktor ist ja return nicht erlaubt.
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
14.12.2006, 16:54 Uhr
virtual
Sexiest Bit alive
(Operator)


Wenn im Konstruktor was schief läuft, dann sollte normalerweise eine Exception geworfen werden. Um sich zu stellen, daß p jedenfalls initialisiert ist, muß man also mit null vorinitialisieren:

C++:
Klassenname *p = NULL;
p = new Klassenanme(i); // Wenn ctor throwt, dann bleibt p NULL


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
14.12.2006, 17:01 Uhr
Lensflare



mit schief laufen meine ich, dass ich zum Beispiel den Parameter "int i" überprüfe ob er größer als 0 ist. Wenn i <= 0 ist, dann kann ich mit dem Objekt nichts anfangen, also soll null zurückgegeben werden.
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)

Dieser Post wurde am 14.12.2006 um 17:02 Uhr von Lensflare editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
14.12.2006, 17:22 Uhr
Lensflare



Ich wollte gerade ein Beispiel dafür finden, wo man irgend eine Überprüfung unbedingt im Konstruktor machen muss, aber mir ist nichts eingefallen.
Das hat wohl keinen praktischen Nutzen wie ich gemerkt habe.
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
15.12.2006, 14:53 Uhr
0xdeadbeef
Gott
(Operator)



C++:
#include <new>

// ...

Klassenname *p = new(std::nothrow) Klassenname(i);

// Wenns schiefgeht, ist p jetzt NULL



Nachtrag: Ach so, jetzt blick ich das erst. Wie wärs damit:

C++:
struct A {
  A() { throw 1; }
};

int main() {
  A *p;

  try {
    p = new A;
  } catch(...) {
    p = 0;
  }

  delete p;
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 15.12.2006 um 14:58 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
15.12.2006, 15:01 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Oder halt genauer:

C++:
struct A {
  A(int i) {
     if (i <= 0)
         throw 1;
      ...
  }
};

int main() {
  A *p = NULL;

  try {
    p = new A(-40);
  } catch(...) {
  }

  delete p;
}


--
class God : public ChuckNorris { };

Dieser Post wurde am 15.12.2006 um 15:01 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
15.12.2006, 16:09 Uhr
Lensflare



Ich habe mich leider noch nicht mit Exceptions beschäftigt (habe erst vor einigen Wochen erfahren, dass die in C++ überhaupt gibt).
Deswegen weiss ich nicht so genau was throw, try, catch usw. bedeutet.

Aber ich denke ich habe verstanden, was ihr meint:
Statt einen Pointer/NULL nach einer Bedingung zuzuweisen, muss man erst NULL zuweisen und dann entweder den Pointer zuweisen oder gar keine Zuweisung durchführen.
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
15.12.2006, 16:18 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


Na ja, Exceptionhandling ist ganz einfach.
In dem try block kann eine Exception geworfen werden. Wenn eine geworfen wurde (mit throw) gehst du einfach in den catch block.

In dem Beispiel von oben:

C++:
struct A {
  A(int i) {
     if (i <= 0)
         throw 1;
      ...
  }
};
Hier wird eine Exception geworfen, wenn i kleiner oder gleich 0 ist.

C++:
try {
    p = new A(-40);
  } catch(...) {
  }

Hier musst du den try {} block setzen, da im Konstruktor von A eine Exception geworfen werden kann. Wenn eine geworfen wurde, gehst du in den catch Block. Daher, das in dem aber nichts passiert, behält *p seinen vorinitialisierten Wert (NULL) und du hast dein Ergebniss.

Ein kleines (meiner Meinung nach ganz brauchbares Tutorial) findest du hier
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
15.12.2006, 18:42 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


catch(...) ist aber normalerweise schlechter stil, evtl solltest du von std::exception eine "Invalid Constructor Initialiser"-Exception-Klasse ableiten und die werfen, und dann auch abfangen.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
15.12.2006, 19:34 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


Das ist vllt etwas heftig, wenn er gerade eben erst erfahren hat, das es Exceptions in C++ gibt
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: