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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.09.2013, 13:08   #11
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();

   void GetAge();

   int JetAge() const { return itsAge; }

   void SetAge(int age) { itsAge = age; }
 
  private:

    int itsAge;
  	
  };

 
  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";
     cout << "SimpleCat * Frisky = new SimpleCat;...\n";
   SimpleCat * Frisky = new SimpleCat;
  	 cout << "Frisky->SetAge(5);...\n";
   Frisky->SetAge(5);
   cout << "Frisky " << Frisky->GetAge() << " years old\n";
   // (*pRags).GetAge();
     cout << "Exiting, watch Frisky end Barsik go...\n";
     system("pause");return 0;	// При выходе из функции переменная Frisky Barsik оказывается за пределами области видимости и для нее также вызывается деструктор.

  }
Компилятор ругается на эту строку SimpleCat * Frisky = new SimpleCat;

Так 1>d:\проги\kb,thnb\kb,thnb\kb,thnb. cpp(69): error C2040: Frisky: "SimpleCat *" отличается по уровням косвенного обращения от "SimpleCat"
1>d:\проги\kb,thnb\kb,thnb\kb,thnb. cpp(71): error C2232: ->SimpleCat::SetAge: левый операнд имеет тип "class", используйте "."
1>d:\проги\kb,thnb\kb,thnb\kb,thnb. cpp(72): error C2232: ->SimpleCat::GetAge: левый операнд имеет тип "class", используйте "."

Что компилятор имел? Что такое уровням косвенного обращения?
Dimka-novitsek вне форума Ответить с цитированием
Старый 20.09.2013, 13:11   #12
Dimka-novitsek
Форумчанин
 
Аватар для Dimka-novitsek
 
Регистрация: 22.04.2013
Сообщений: 588
По умолчанию

Я правда создавал раньше SimpleCat Frisky; но я думал он разместятся в разных видах памяти и не помешают друг другу. Вернее я вобще не думал.

А как тогда убрать фриски из стека?


А чем была обусловлина ошибка в четвертом посте вверх?

Последний раз редактировалось Dimka-novitsek; 20.09.2013 в 13:13.
Dimka-novitsek вне форума Ответить с цитированием
Старый 20.09.2013, 17:38   #13
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

Код:
"SimpleCat *" отличается по уровням косвенного обращения от "SimpleCat"
SimpleCat *Frisky?

Такой идентификатор в этой области видимости уже есть и компилятор знает как его трактовать. Другой такой же идентифиактор, даже, имеющий иную сигнатуру линковщик не пропустит. У Вас, для первого из двух одинаковых идентификаторов линковщик создаст ссылку для последующего установления соответсвия между определением, предназначенным для этого идентификатора, и самим идентифактором. Встретив второй раз один и тот же идентификатор в одной и той же области видимости линковщик выдаст сообщение об ошибке, иначе была бы коллизия имен.
Очень интересная публикация про работу компоновщика: http://habrahabr.ru/post/150327/
Код:
Frisky->SetAge(5);
Frisky воспиринимается как объект, а не как указатель на объект.

Цитата:
А как тогда убрать фриски из стека?
Убрать объявление-определение SimpleCat Frisky из исходного текста модуля.

Последний раз редактировалось Igor95; 21.09.2013 в 12:42.
Igor95 вне форума Ответить с цитированием
Старый 20.09.2013, 23:26   #14
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