2012-04-15 19 views
0

Ich lese Kapitel 16, damit ich meine Zuweisungen für meine C++ - Klasse beginnen kann. Dieser Abschnitt behandelt die Ausnahmebehandlung. Ich verstehe das Konzept hinter einem Versuch/Fang-Konstrukt, aber eines der Beispiele in dem Buch ist ein bisschen verwirrend für mich. Ich hoffe auf eine Erklärung, wie das funktioniert. Der Beispielcode ist unten:Werfen eines Objekts einer Klasse innerhalb einer Klasse definiert

// Includes, header guards, and namespace std... 
class IntRange 
{ 
private: 
    int intput; 
    int lower; 
    int upper; 

public: 
    // Exception class 
    class OutOfRange { }; // This is exactly how it appears in the text. 

    IntRange(int low, int high) { lower = low; upper = high; } 
    int GetInput() 
    { 
    cin >> input; 
    if (input < lower || input > upper) 
     throw OutOfRange(); // <-- This is my question in particular. What is this? 
    return input; 
    } 
}; 

// End header guard. 

// Program entry point. 

int main() 
{ 
    IntRange range(5, 10) 
    int userValue; 

    cout << "Enter a value in the range 5 - 10: "; 
    try 
    { 
    userValue = range.getInput(); 
    cout << "You entered " << userValue << endl; 
    } 
    catch (IntRange::OutOfRange) // <-- Again, what is this delcaration and how can 
           // this data type be defined when IntRange does not 
           // have a default constructor? 
    { 
    cout << "That value is out of range.\n"; 
    } 

    return 0; 
} 

Der Code genau ist, wie es im Lehrbuch erscheint, außer ich auf der gleichen Linie, um ein paar Sachen stellte die Frage, um zu verhindern wirklich lange becomming.

Wenn Sie Fehler bemerken, ist es wahrscheinlich ein Tippfehler, aber die wichtigsten Punkte wurden doppelt überprüft.

+2

Kapitel 16 von _what_? –

+0

Starten mit frühen C++ - Objekten - 7. Ausgabe –

Antwort

1
throw OutOfRange(); // <-- This is my question in particular. What is this? 

Dieser Standard konstruiert ein Objekt von OutOfRange wirft sie dann.
Auch wenn Sie keine Methoden in einer Klasse definieren, generiert der Compiler automatisch ein Paar für Sie. Einer davon ist der Standardkonstruktor. Auch wenn Sie keinen Konstruktor angeben, wird es einen geben (Führen Sie eine Google-Regel auf 3/5 durch, um zu erklären, welche Methoden vom Compiler generiert werden).

Hier fangen wir ein Objekt vom Typ IntRange::OutOfRange.Hinweis: Wir sind nicht ein Objekt von IntRange zu kontrollieren. Wir fangen die Klasse OutOfRange, die innerhalb der Klasse IntRange (abgesehen von wo sie definiert ist es keine andere Beziehung ist) definiert werden, geschieht.

Beachten Sie auch: Wenn Sie es der Compiler deaktiviert wird automatisch eine Kopie Konstruktor für alle Klassen generieren. Daher werden Ausnahmen normalerweise vom Wurfpunkt zum Fangpunkt konstruiert (es ist ein bisschen komplexer). Also muss Ihr Ausnahmeobjekt kopierbar sein.

Beachten Sie auch, ist es am besten Ausnahmen durch konstante Referenz zu fangen:

catch (IntRange::OutOfRange const& e) 

Die Probleme im Zusammenhang mit dem Schneiden Objekten vermeidet, die Teil Ausnahme Hierarchien sind.

+0

OK, ich sehe. scheint es wie ein Objekt von OutOfRange kann nicht, ohne vorher eine Instanz eines IntRange Objekt instanziert werden. Also, wenn ich Sie zu verstehen, wäre es vollkommen legal sein delecare ein Objekt als solches: IntRange :: OutOfRange Boden, und wenn es Mitglieder hat, konnte ich mit ihnen interagieren, ohne jemals ein Objekt von IntRange geschaffen zu haben –

+0

@ fhaddad78: Richtig es gibt keine explizite Beziehung zwischen Objekt dieser Art OutOfRange?.. ist ein vollständiger Typ an sich und hat keine impliziten Referenzen zu IntRange –

2
throw OutOfRange(); 

Dies schafft eine neue Instanz der Klasse OutOfRange und throw s es. Denken Sie daran, dass Sie auch eine Instanz wie folgt erstellen:

my_method(MyClass()); 

statt:

MyClass obj; 
my_method(obj); 

Jetzt:

catch (IntRange::OutOfRange) 

OutOfRange ist ein innere oder verschachtelte Klasse von IntRange. Siehe here

+1

Ich habe gerade dieses Beispiel auf der IBM Website gelesen. Vielen Dank! Unser Buch führt neue Ideen ein und liefert keine Erklärung. (= –

+0

siehe [hier] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list) für einige bessere Bücher. – ApprenticeHacker

0

Sie erstellen eine benutzerdefinierte Ausnahme (als Klasse) namens OutOfRange und werfen es.

Auf diese Weise können Sie gezielt eine OutOfRange Ausnahme, auf diese Weise fangen:

try 
{ 
    //do something 
} 
catch (OutOfRange o) 
{ 
    //you know the input was out of range 
} 
catch (Exception e) 
{ 
    //something else went wrong 
} 
0

Ihre OutOfRange Klasse gehört die IntRange Klasse als Ganzes - es zu einem bestimmten Objekt gehört nicht, dass der Klasse.

Um OutOfRange zu verwenden gibt es keine Anforderung auch für IntRange tatsächlich als eine konkrete Klasse verwendbar sein, da IntRange::OutOfRange einfach die vollständig qualifizierten Typnamen angibt und kein Objekt.

in C++, Typnamen sind nur zur Kompilierzeit wichtig; Datentypinformationen (zusammen mit Variablennamen und allen möglichen anderen Dingen wie dem in Ihrem Code) werden in der Regel vom Compiler vollständig entfernt - Datentypen gibt es nur, um Ihnen beim Schreiben von Code und bei der Fehlersuche zu helfen.

+0

Dank. Ihre Erklärung sowie ein paar andere für mich erklärt, was sehr deutlich los ist. –

Verwandte Themen