Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.09.2013, 20:51   #1
Dimka-novitsek
Форумчанин
 
Аватар для Dimka-novitsek
 
Регистрация: 22.04.2013
Сообщений: 588
По умолчанию Еще раз про область видимости.

Код:
#include <string> 
#include <iostream> // для объекта cout
using namespace std;
 
#include<iomanip>
//Этот файл содержит большую часть манипуляторов C++. Если вы не знаете, что такое манипулятор, не беспокойтесь. Просто подключите это файл вместе с iostream, хуже не станет.
#include<fstream> 
//Подключается при работе с файлами.



 // Листинг 8.5.

 // Размещение и удаление объектов в области динамического обмена



class SimpleCat

  {

  public:

     SimpleCat();

   ~SimpleCat();

  private:

    int itsAge;

	void GetAge();

  };

 
  SimpleCat::SimpleCat()

 {
  cout << "Constructor called.\n";
   itsAge = 1;
 }


  SimpleCat::~SimpleCat()

  {
   cout << "Destructor called.\n";
   }

  void GetAge(){ cout << "itsAge  "<<itsAge; ++itsAge; cout << "  ++itsAge\n"<<itsAge; };

  int main()
  {
     cout << "SimpleCat Frisky...\n";
      SimpleCat Frisky;	 //создается экземпляр описанного класса, который размешается в стеке. При этом происходит неявный вызов конструктора класса SimpleCat.
	  cout << "SimpleCat Barsik...\n";
      SimpleCat Barsik;	 //создается экземпляр описанного класса, который размешается в стеке. При этом происходит неявный вызов конструктора класса SimpleCat.
    cout << "SimpleCat *pRags = new SimpleCat...\n";
    SimpleCat * pRags = new SimpleCat; //Для его хранения динамически выделяется память и адрес записывается в указатель pRags. В этом случае также вызывается конструктор.
    cout << "delete pRags...\n";
   delete pRags;  // Деструктор класса SimpleCat вызывается как результат применения оператора delete к указателю pRags.
   cout << "Exiting, watch Frisky end Barsik go...\n";
     system("pause");return 0;	// При выходе из функции переменная Frisky Barsik оказывается за пределами области видимости и для нее также вызывается деструктор.

  }

cpp(51): error C2065: itsAge: необъявленный идентификатор
cpp(51): error C2065: itsAge: необъявленный идентификатор
cpp(51): error C2065: itsAge: необъявленный идентификатор

Как необьявленный?????
Dimka-novitsek вне форума Ответить с цитированием
Старый 19.09.2013, 20:55   #2
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

у тебя функция GetAge() - сама по себе, и она не знает ни про какой itsAge
Rififi вне форума Ответить с цитированием
Старый 19.09.2013, 20:56   #3
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
Как необьявленный?????
Беда в том, что никак не объявленный.

Код:
 void GetAge(){ cout << "itsAge  "<<itsAge; ++itsAge; cout << "  ++itsAge\n"<<itsAge; };
Это функция, никоим образом с твоим классом не связанная ) - обычная функция, которая ищет itsAge среди глобальных переменных.
rrrFer вне форума Ответить с цитированием
Старый 19.09.2013, 20:57   #4
Dimka-novitsek
Форумчанин
 
Аватар для Dimka-novitsek
 
Регистрация: 22.04.2013
Сообщений: 588
По умолчанию

Спасибо!!!!
Dimka-novitsek вне форума Ответить с цитированием
Старый 19.09.2013, 22:42   #5
Dimka-novitsek
Форумчанин
 
Аватар для Dimka-novitsek
 
Регистрация: 22.04.2013
Сообщений: 588
По умолчанию

Я порядком забыл, все-таки эти области видимости.

Я же обращаюсь к переменной функцией, принадлежащей классу??

Код:
#include <iostream> // для объекта cout
using namespace std;
 
#include<iomanip>
//Этот файл содержит большую часть манипуляторов C++. Если вы не знаете, что такое манипулятор, не беспокойтесь. Просто подключите это файл вместе с iostream, хуже не станет.
#include<fstream> 
//Подключается при работе с файлами.



 // Листинг 8.5.

 // Размещение и удаление объектов в области динамического обмена



class SimpleCat

  {

  public:

     SimpleCat();

   ~SimpleCat();

  private:

    int itsAge;

	void GetAge();

  };

 
  SimpleCat::SimpleCat()

 {
  cout << "Constructor called.\n";
   itsAge = 1;
 }


  SimpleCat::~SimpleCat()

  {
   cout << "Destructor called.\n";
   }

 void  SimpleCat::GetAge(){ cout << "itsAge  "<<itsAge;++itsAge; cout << "  ++itsAge\n"<<itsAge; };

  int main()
  {
     cout << "SimpleCat Frisky...\n";
      SimpleCat Frisky;	 //создается экземпляр описанного класса, который размешается в стеке. При этом происходит неявный вызов конструктора класса SimpleCat.
	  cout << "SimpleCat Barsik...\n";
      SimpleCat Barsik;	 //создается экземпляр описанного класса, который размешается в стеке. При этом происходит неявный вызов конструктора класса SimpleCat.
    cout << "SimpleCat *pRags = new SimpleCat...\n";
    SimpleCat * pRags = new SimpleCat; //Для его хранения динамически выделяется память и адрес записывается в указатель pRags. В этом случае также вызывается конструктор.
    cout << "delete pRags...\n";
   delete pRags;  // Деструктор класса SimpleCat вызывается как результат применения оператора delete к указателю pRags.
   cout << "(*pRags).GetAge();...\n";
   (*pRags).GetAge();
     cout << "Exiting, watch Frisky end Barsik go...\n";
     system("pause");return 0;	// При выходе из функции переменная Frisky Barsik оказывается за пределами области видимости и для нее также вызывается деструктор.

  }
1>d:\проги\kb,thnb\kb,thnb\kb,thnb. cpp(64): error C2248: SimpleCat::GetAge: невозможно обратиться к private член, объявленному в классе "SimpleCat"

Это к (*pRags).GetAge();
Dimka-novitsek вне форума Ответить с цитированием
Старый 19.09.2013, 22:52   #6
Dimka-novitsek
Форумчанин
 
Аватар для Dimka-novitsek
 
Регистрация: 22.04.2013
Сообщений: 588
По умолчанию

Дело в том что вот с ниделю назад, скомпилированая и рабочая программа обращается к такой же переменной щитай как угодно. Вот. И я не вижу собствено разницы.

Cat.hpp
Код:
class Cat
{
public:
  Cat( int initialAge = 5 );
  ~Cat();
  int GetAge() const;
  void SetAge( int age );
  void Meow();
  int Bgsamm();
  void Metod( int );
  int GetWeight();
private:
  int itsAge;
};


inline int Cat::GetWeight()

{	   int itsweight=0;
 cout << "Cat itsweight" << endl;
return itsweight; // возвращает переменную-член Weight


}

"Проверим.cpp"
Код:
#include <iostream>
 
using namespace std;
 
  #include "Cat.hpp"

 
Cat::Cat(int initialAge)
  {
  itsAge = initialAge;
  cout << "Completed construction of a Cat" << endl;
  }
 
Cat::~Cat()
  {
  cout << "Cat destroyed. To death" << endl;
  }
 
int Cat::Bgsamm()      // Метод дня рождения?
  {
  return (itsAge++);
  }
 
void Cat::SetAge( int age )
  {
  itsAge = age;
  }
 
int Cat::GetAge()const
  {
  return itsAge;
  }
 
void Cat::Meow()
  {
  cout << "Meow." << endl;
  }
 
void Cat::Metod( int tselaya = 100 ) //// Метод выводит возраст кота
  {                                    //   с прибавкой по умолчанию ста лет (за каким-то чертом)
  tselaya = tselaya + GetAge();        //   (из раздела сколько бы было
  cout << tselaya << endl;             //      ему лет, через сто лет)
  }                                  ////    При чем сам возраст от этого не изменится
 
Cat obyekt; // Какой-то глобальный кот
 
int main()
{
  {
  Cat Frisky; // Кот, живущий только в main-е. (рождается по умолчанию пятилетним)
  Cat Barsik(666); // Барсик сразу рождается шестьсот шестьдесят шестидесяти летним
 
  Frisky.Meow(); // Фриски мяукает
  Barsik.Meow(); // Барсик мяукает
  obyekt.Meow(); // Объект мяукает
 
  cout << "obyekt age: " << obyekt.GetAge() << endl;; // Получить и вывести на экран возраст объекта
  int BarsikAge = Barsik.GetAge();                    // Получить и запомнить возраст Барсика (просто так)
 
  obyekt.Bgsamm(); // Состарить объект на один год
  Barsik.Bgsamm(); // День рождения Барсика
 
  cout << "obyekt age: " << obyekt.GetAge() << endl;; // Вывести текущий
  cout << "Barsik age: " << Barsik.GetAge() << endl;; //     возраст обоих
 
  Barsik.SetAge(1000);                               // Состарить Барсика до тысячелетнего возраста
  cout << "Barsik age: " << Barsik.GetAge() << endl; // Отобразить это
  
  obyekt.Metod();    // Выведет возраст объекта + 100
  Barsik.Metod(999); // Выведет возраст Барсика + 999

  obyekt.GetWeight() ;
  }
 
system("pause");
 
bool DogEaster = false;
while(!DogEaster)       // Заставить объект мяукать
  obyekt.Meow();        //       до собачьей пасхи
 
return 0;
}
Dimka-novitsek вне форума Ответить с цитированием
Старый 19.09.2013, 23:01   #7
Dimka-novitsek
Форумчанин
 
Аватар для Dimka-novitsek
 
Регистрация: 22.04.2013
Сообщений: 588
По умолчанию

Перенес предобьявление функции в публичный раздел, скомпилировалось.
Dimka-novitsek вне форума Ответить с цитированием
Старый 19.09.2013, 23:02   #8
Dimka-novitsek
Форумчанин
 
Аватар для Dimka-novitsek
 
Регистрация: 22.04.2013
Сообщений: 588
По умолчанию

Вот так я лучше все это запоминаю.

Однако, вылезает ошибка.

Первый этап обработки исключения в "0x60104a00" в "Kb,thnb.exe": 0xC0000005: Нарушение прав доступа при чтении "0x60104a00".
Необработанное исключение в "0x60104a00" в "Kb,thnb.exe": 0xC0000005: Нарушение прав доступа при чтении "0x60104a00".
Программа "[3584] Kb,thnb.exe: Машинный код" завершилась с кодом 0 (0x0).

Во, как!!
Dimka-novitsek вне форума Ответить с цитированием
Старый 19.09.2013, 23:16   #9
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

Код:
return itsweight; // возвращает переменную-член Weight
Нет у Вас такой переменной-члена класса.
Igor95 вне форума Ответить с цитированием
Старый 20.09.2013, 10:48   #10
Dimka-novitsek
Форумчанин
 
Аватар для Dimka-novitsek
 
Регистрация: 22.04.2013
Сообщений: 588
По умолчанию

Спасибо!!!
Dimka-novitsek вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Еще раз про UTF(-8) denis76560 Общие вопросы Delphi 4 21.10.2012 14:31
еще раз про копирование листов из другой книги Acina Microsoft Office Excel 5 03.06.2011 17:50
Еще раз про lookup HashDiler БД в Delphi 2 08.02.2011 21:00
И еще раз про libtorrent hotcooler17 C/C++ Сетевое программирование 5 29.01.2011 21:52
Еще раз про адресацию tae1980 Microsoft Office Excel 2 25.02.2009 07:56