2009-04-20 7 views
0

Il s'agit d'un programme de base pour obtenir deux nombres à 5 chiffres sous forme de chaîne et utiliser l'addition sur les 2 chiffres en utilisant la surcharge de l'opérateur sur '+'.(Requête C++) Accès global aux objets instanciés

#include <iostream> 
#include <limits> 
#include <cstdlib> 
#include <cstring> 
#include <sstream> 

using namespace std; 


class IntStr 
{ 
    int InputNum; 
    public: 
    //IntStr(); 
    IntStr::IntStr(int num); 
    IntStr operator+ (const IntStr &); 
    //~IntStr(); 
    void Display(); 
}; 

IntStr::IntStr(int num) 
{ 
    InputNum = num; 
} 

void IntStr::Display() 
{ 
    cout << "Number is (via Display) : " << InputNum <<endl; 
} 


IntStr IntStr::operator+ (const IntStr & second) { 
     int add_result = InputNum + second.InputNum; 
     return IntStr(add_result); 
     } 



int main() 
{ 
    string str; 
    bool option = true; 
    bool option2 = true; 
    while (option) 
    { 
    cout << "Enter the number : " ; 
    if (!getline(cin, str)) 
    { 
     cerr << "Something went seriously wrong...\n"; 
    } 

    istringstream iss(str); 
    int i; 
    iss >> i; // Extract an integer value from the stream that wraps str 

    if (!iss) 
    { 
     // Extraction failed (or a more serious problem like EOF reached) 
     cerr << "Enter a number dammit!\n"; 
    } 
    else if (i < 10000 || i > 99999) 
    { 
    cerr << "Out of range!\n"; 
    } 
    else 
    { 
     // Process i 
     //cout << "Stream is: " << iss << endl; //For debugging purposesc only 
     cout << "Number is : " << i << endl; 
     option = false; 
     IntStr obj1 = IntStr(i); 
     obj1.Display(); 
    } 
    }//while 


    while (option2) 
    { 
    cout << "Enter the second number : " ; 
    if (!getline(cin, str)) 
    { 
     cerr << "Something went seriously wrong...\n"; 
    } 

    istringstream iss(str); 
    int i; 
    iss >> i; // Extract an integer value from the stream that wraps str 

    if (!iss) //------------------------------------------> (i) 
    { 
     // Extraction failed (or a more serious problem like EOF reached) 
     cerr << "Enter a number dammit!\n"; 
    } 
    else if (i < 10000 || i > 99999) 
    { 
    cerr << "Out of range!\n"; 
    } 
    else 
    { 
     // Process i 
     //cout << "Stream is: " << iss << endl; //For debugging purposes only 
     cout << "Number is : " << i << endl; 
     option2 = false; 
     IntStr obj2 = IntStr(i); 
     obj2.Display(); 
     //obj1->Display(); 
    } 
    }//while 

    //IntStr Result = obj1 + obj2; // --------------------> (ii) 
    //Result.Display(); 

    cin.get(); 
} 

Besoin d'éclaircissements sur les points (i) & (ii) dans le code ci-dessus ...

(1) Qu'est-ce que (i) en réalité?

(2) (ii) -> Ne compile pas .. comme l'erreur "obj1 non déclaré (première utilisation de cette fonction)" se lève. Est-ce parce que obj1 & obj2 sont déclarés seulement dans les boucles while? Comment puis-je y accéder globalement?

Répondre

0
if (!iss) 

teste si le flux est en mauvais état, ce qui sera le cas si une conversion a échoué ou si vous êtes à la fin du flux

obj1 est défini ici:

else 
    { 
     // Process i 
     //cout << "Stream is: " << iss << endl; //For debugging purposesc only 
     cout << "Number is : " << i << endl; 
     option = false; 
     IntStr obj1 = IntStr(i); 
     obj1.Display(); 
    } 

il est donc local à l'autre bloc & ne peut pas être accessible à l'extérieur. Si vous voulez augmenter sa portée, modifiez sa définition en dehors du bloc. Ce n'est pas une bonne idée de le déplacer en dehors de tous les blocs (c'est-à-dire le rendre global), cependant.

0
  1. appelle l'opérateur surchargé qui évalue le flux dans un contexte booléen. Cela vérifie l'état du flux pour voir si l'opération précédente a échoué - si c'est le cas, vous ne pouvez pas compter sur la valeur dans la variable entière i étant valide car l'entrée sur le flux n'était pas un nombre entier. Les variables obj1 et obj2 sont définies dans le cadre de la boucle while - elles ne sont pas disponibles en dehors de la portée. Vous pouvez les déclarer en dehors de la période de validité, auquel cas la variable conservera la dernière valeur conservée dans la boucle while.

1

1) De http://www.cplusplus.com/reference/iostream/ios/operatornot/:

bool operator!() const; Évaluer objet flux

Renvoie true si l'un des drapeaux d'erreur (ou de failbit badbit) est réglé sur le flux. Sinon, il renvoie false.

De http://www.cplusplus.com/reference/iostream/ios/fail/:

failbit est définie généralement par une opération d'entrée lorsque l'erreur est liée avec la logique interne de la même opération , tandis que badbit est définie généralement lorsque l'erreur implique la perte d'intégrité du flux, qui est susceptible de persister même si une opération différente est effectuée sur le flux.

2) Les deux objets ne sont pas dans la portée, ils existent seulement dans les parenthèses précédentes.

+0

Wow ne savait pas à propos de l'opérateur!() Surcharge, merci! –

+0

Eh bien, je n'ai pas non plus, mais dans ce genre de cas, il est facile de vérifier la documentation ... – Klaim

+0

Compris la partie 'échouer'. Mais ne devrions-nous pas vérifier quelque chose sur ces lignes: Soit 'abc' l'opération "iss >> i;" Maintenant, ne devrions-nous pas vérifier si (! Abc), puis dire 'cerr << "Entrez un nombre dammit! \ N";' ??? Comment justifions-nous de vérifier si (! Iss), parce que, de toute façon, iss existe. C'est juste que l'extraction de la stringstream à integer que nous devons vérifier .. Suis-je clair? – halluc1nati0n