Форум программистов, компьютерный форум CyberForum.ru

ошибка соператором new - C++

Восстановить пароль Регистрация
 
Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
20.09.2013, 14:25     ошибка соператором new #1
Не знаю, как лучше обозвать тему. Я еще не разобраля с видами памяти, и многим прочим.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#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", используйте "."

Что компилятор имел? Что такое уровням косвенного обращения?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.09.2013, 14:25     ошибка соператором new
Посмотрите здесь:

C++ Вылетает ошибка error C2061: синтаксическая ошибка: идентификатор "_TCHAR"
C++ Глупая ошибка, но до сих пор неисправленная ошибка: ";"
Синтаксическая ошибка: Ошибка 1 error C2059 C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Cynacyn
 Аватар для Cynacyn
33 / 33 / 0
Регистрация: 02.05.2013
Сообщений: 109
20.09.2013, 14:36     ошибка соператором new #2
строка 60
C++
1
SimpleCat Frisky;
строка 69
C++
1
SimpleCat * Frisky = new SimpleCat;
- переопределение

строка 72, метод возвращает void
C++
1
cout << "Frisky " << Frisky->GetAge() << " years old\n";
возможно нужно использовать
C++
1
   int JetAge() const { return itsAge; }
monolit
179 / 179 / 21
Регистрация: 24.03.2011
Сообщений: 641
Завершенные тесты: 1
20.09.2013, 14:38     ошибка соператором new #3
Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
cout << "Frisky " << Frisky->GetAge() << " years old\n";
GetAge у тебя почему-то имеет тип void. Так что так не прокатит.
А по теме - у вас же такая переменная уже есть.
Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
SimpleCat Frisky;
Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
SimpleCat * Frisky = new SimpleCat;
По другому назови и все..
Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
20.09.2013, 14:39  [ТС]     ошибка соператором new #4
Спасибо!!!


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

Спасибо, monolit!!!
Cynacyn
 Аватар для Cynacyn
33 / 33 / 0
Регистрация: 02.05.2013
Сообщений: 109
20.09.2013, 14:40     ошибка соператором new #5
Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
Вернее я вобще не думал.

Не по теме:

Постоянно так делаю!

User409368
191 / 168 / 6
Регистрация: 09.09.2013
Сообщений: 524
20.09.2013, 14:46     ошибка соператором new #6
Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
А ведь я мог бы подумать что разместятся эти Frisky в разных видах памяти
это можно сделать если вторую переменную Frisky поместить в фигурные скобки. тогда она будет видно только в них

C++
1
2
3
4
5
SimpleCat Frisky;
 
{
    SimpleCat *Frisky = new SimpleCat;
}
получится что в main() будут две одинаковых переменных с одним именем. внутри фигурных скобок видна переменная-указатель, а когда выйдем из них, то эта переменная уже не будет видна и в область видимости попадает первый Frisky
Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
20.09.2013, 14:51  [ТС]     ошибка соператором new #7
СПАСИБО!!!!!
Cynacyn
 Аватар для Cynacyn
33 / 33 / 0
Регистрация: 02.05.2013
Сообщений: 109
20.09.2013, 14:52     ошибка соператором new #8
Dimka-novitsek, неважно в какой памяти вы размещаете, важно в какой области видимости находятся переменные с одинаковым идентификатором. если в одной области объявлены два одинаковых идентификатора - компилятор сообщит об ошибке.
гуглите области видимости
Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
20.09.2013, 15:10  [ТС]     ошибка соператором new #9
GetAge у меня не использует оператор return ; и следовательно void правомерен, я так щитаю.

Добавлено через 36 секунд
Спасибо!! Да, очень полезное сообщение!
Cynacyn
 Аватар для Cynacyn
33 / 33 / 0
Регистрация: 02.05.2013
Сообщений: 109
20.09.2013, 15:17     ошибка соператором new #10
Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
GetAge у меня не использует оператор return ; и следовательно void правомерен, я так щитаю.

Добавлено через 36 секунд
Спасибо!! Да, очень полезное сообщение!
вызов GetAge аналогичен
C++
1
cout << void << endl;
Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
20.09.2013, 17:07  [ТС]     ошибка соператором new #11
C++
1
cout << "Murchik " << Murchik->GetAge() << " years old\n";
бинарный "<<": не найден оператор, принимающий правый операнд типа "void" (или приемлемое преобразование отсутствует)

Да, вы правы. Видно функцию типа воид использовать имено таким образом не получися.

Добавлено через 1 час 49 минут
Вылазит ошибка из строки (*pRags).GetAge(); В черное окошко пишет

itsAge<< -17891602 ++itsAge а также в другие места


this CXX0017: ошибка: не найден символ ""
+ _Dest {_Failed=??? _Strbuf=??? } std::ostreambuf_iterator<char,std::char_traits<char> >
+ _Iosbase std::ios_base &
_Fill CXX0030: ошибка: невозможно вычислить выражение
_Val CXX0030: ошибка: невозможно вычислить выражение


> msvcp100d.dll!std::num_put<char,std::ostreambuf_iterator<char,std::char_traits<char> > >:ut(std::ostreambuf_iterator<char,std::char_traits<char> > _Dest, std::ios_base & _Iosbase, char _Fill, long _Val) Строка 1099 + 0x26 байт C++
User409368
191 / 168 / 6
Регистрация: 09.09.2013
Сообщений: 524
20.09.2013, 17:16     ошибка соператором new #12
Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
В черное окошко пишет
itsAge<< -17891602 ++itsAge а также в другие места
вообще то не должно этого быть. конструктор вызывается автоматически при создании объекта и в нем устанавливается возраст кота 1 год.

или может быть используется указатель после delete?

Добавлено через 55 секунд
лучше посмотреть на новую программу с изменениями. что там получилось
Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
20.09.2013, 17:21  [ТС]     ошибка соператором new #13
Щас гляну, вроде нет.Щас.

Добавлено через 1 минуту
Да, спасибо!!!!
User409368
191 / 168 / 6
Регистрация: 09.09.2013
Сообщений: 524
20.09.2013, 17:25     ошибка соператором new #14
Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
Да, спасибо!!!!
пожалуйста

Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
void SimpleCat::GetAge(){ cout << "itsAge "<<itsAge;++itsAge; cout << " ++itsAge\n"<<itsAge; };
лучше всего эту функцию переписать. она должно только возвратить возраст кота и все. больше ничего не надо в ней писать. ее смысл в том, чтобы узнать возраст:

C++
1
2
3
4
int SimpleCat::GetAge()
{
    return itsAge;
}

функция для установки нового возраста кота:
C++
1
2
3
4
void SimpleCat::SetAge(int newAge)
{
    itsAge = newAge;
}
Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
20.09.2013, 17:39  [ТС]     ошибка соператором new #15
Спасибо!!!

Добавлено через 2 минуты
Главный ее смысл- показать ме как что-либо работает. Я ведь учу си с плюсами. Хотя с одой стороны полностью верно.

Добавлено через 1 минуту
В общем, все понятно, все сложилось! все работает! Супер!!!

Добавлено через 3 минуты
Итго

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <string> 
#include <iostream> // для объекта cout
using namespace std;
 
#include<iomanip>
//Этот файл содержит большую часть манипуляторов C++. Если вы не знаете, что такое манипулятор, не беспокойтесь. Просто подключите это файл вместе с iostream, хуже не станет.
#include<fstream> 
//Подключается при работе с файлами.
 
 
 
 // Листинг 8.5.
 
 // Размещение и удаление объектов в области динамического обмена
 
 
 
class SimpleCat
 
  {
 
  public:
 
     SimpleCat();
 
   ~SimpleCat();
 
   int 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";
   }
 
 int  SimpleCat::GetAge(){ cout << "itsAge<<  "<<itsAge; ++itsAge; cout << "  ++itsAge "<<itsAge<< "  \n";return 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 << "(*pRags).GetAge();...\n";
   (*pRags).GetAge();
    cout << "delete pRags...\n";
   delete pRags;  // Деструктор класса SimpleCat вызывается как результат применения оператора delete к указателю pRags.
    cout << "SimpleCat * Murchik = new SimpleCat;...\n";
   SimpleCat * Murchik = new SimpleCat;
     cout << "Murchik->SetAge(5);...\n";
   Murchik->SetAge(5);
     cout << "Murchik " << Murchik->GetAge() << " years old\n";
     cout << "Exiting, watch Frisky end Barsik go...\n";
     system("pause");return 0;  // При выходе из функции переменная Frisky Barsik оказывается за пределами области видимости и для нее также вызывается деструктор.
 
  }
Добавлено через 2 минуты
Да, достаточно рогато, но главное-принципы. В общем, можно попробовать подправить. Но скорее я пойду читать дальше.
Yandex
Объявления
20.09.2013, 17:39     ошибка соператором new
Ответ Создать тему
Опции темы

Текущее время: 20:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru