(C ++ Query) Доступ к экземплярам объектов глобально - PullRequest
0 голосов
/ 20 апреля 2009

Это базовая программа для получения двух 5-значных чисел в виде строки и добавления сложения к двум числам с использованием перегрузки операторов на '+'.

#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();
}

Нужно уточнить пункты (i) и (ii) в приведенном выше коде ...

(1) Что (i) на самом деле делает?

(2) (ii) -> Не компилируется .. так как появляется ошибка "obj1 не объявлено (сначала используйте эту функцию)". Это потому, что obj1 & obj2 объявляются только внутри циклов while? Как я могу получить к ним доступ по всему миру?

Ответы [ 3 ]

1 голос
/ 20 апреля 2009

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

оператор bool! () const; оценивать объект потока

Возвращает true, если один из установлены флаги ошибок (failbit или badbit) в потоке. В противном случае это возвращает ложь.

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

failbit обычно устанавливается входом операция, когда ошибка была связана с внутренней логикой сама операция, а бадбит обычно устанавливается, когда возникает ошибка потеря целостности потока, который может сохраняться, даже если другая операция выполняется на поток.

2) Два объекта не находятся в области видимости, они существуют только в предыдущих скобках.

0 голосов
/ 20 апреля 2009
  1. вызывает перегруженный оператор, который оценивает поток в логическом контексте. Это проверяет состояние потока, чтобы увидеть, не прошла ли предыдущая операция - если это так, вы не можете полагаться на то, что значение в целочисленной переменной i является допустимым, поскольку входные данные в потоке не были целыми числами. *

  2. переменные obj1 и obj2 определены в области цикла while - они не доступны за пределами области. Вы можете объявить их вне области while, и в этом случае переменная будет содержать последнее значение, которое она содержала в цикле while.

0 голосов
/ 20 апреля 2009
if (!iss) 

проверяет, находится ли поток в плохом состоянии, что будет в случае неудачного преобразования или в конце потока

obj1 определено здесь:

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();
    }

поэтому он является локальным по отношению к блоку else и недоступен за его пределами. Если вы хотите увеличить область его действия, измените его определение за пределами блока. Однако не стоит переносить его за пределы всех блоков (то есть делать его глобальным).

...