Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452

Выводятся непонятные сообщения в процессе выполнения программы

25.05.2015, 16:25. Показов 2328. Ответов 39
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго дня !

Подскажите пожалуйста , почему при выводе строки (160)

C++
1
cout<<"\n******* "<<EmptyClass["Bill"].GetName()<<" is "<<EmptyClass["Bill"].GetAge();
выводятся эти сообщения ?

какие то левые обьекты создаются (((

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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
#include <iostream>
#include <string>
#include <map>
#include <conio.h>
 
 
using namespace std;
 
class Student
 
{
 
public:
 
    Student();
 
    Student(const string & name, const int age);
 
    Student(const Student & rhs);
 
    ~Student();
 
    void SetName(const string & name);
 
    string GetName() const;
 
    void SetAge(const int age);
 
    int GetAge() const;
 
    Student & operator = (const Student & rhs);
 
private:
 
    string itsName;
 
    int itsAge;
};
 
 
Student :: Student()
 
: itsName("New Student"), itsAge(16)
 
{printf("\nKONST 1 %p\n",this);}
 
Student :: Student(const string & name, const int age)
 
: itsName(name), itsAge(age)
 
{printf("\nKONST 2 %p\n",this);}
 
Student :: Student(const Student & rhs)
 
: itsName(rhs.GetName()), itsAge(rhs.GetAge())
 
{printf("\nKONST copy %p %p\n",this,& rhs);}
 
Student ::  ~Student()
 
{printf("\nDES  %p\n",this);}
 
void Student :: SetName(const string & name)
 
{ 
    itsName = name;
}
 
string Student :: GetName() const
 
{
    //printf("\nGetName() %p\n",this);
 
    return  itsName;
}
 
void Student :: SetAge(const int age)
 
{
    itsAge = age;
}
 
int Student :: GetAge() const
 
{
    //printf("\nGetAge() %p\n",this);
 
    return  itsAge;
}
 
 
Student & Student :: operator = (const Student & rhs)
 
{
    printf("\noperator = %p %p\n",this,& rhs);
 
    itsName = rhs.GetName();
 
    itsAge = rhs.GetAge();
 
    return *this;
}
 
ostream & operator << (ostream & os, const Student & rhs)
 
{
    printf("\noperator << = %p \n\n",& rhs);
 
    os << rhs.GetName() <<" is "<<rhs.GetAge() <<" yeare old";
 
    return os;
}
 
template <class T,class A>
 
void ShowVector(const map <T,A> & v);
 
typedef map <string, Student> SchoolClass;
 
int main()
 
{
    Student Harry("Harry",18);
 
    printf("\nHarry = %p \n",& Harry);
 
    Student Sally("Sally",15);
 
    printf("\nSally = %p \n",& Sally);
 
    Student Bill("Bill",17);
 
    printf("\nBill = %p \n",& Bill);
 
    Student Peter("Peter",17);
 
    printf("\nPeter = %p \n",& Peter);
 
    printf("\n**************************\n");
 
    SchoolClass EmptyClass;
 
    printf("\n**************************\n");
 
    EmptyClass[Harry.GetName()] = Harry;
 
    EmptyClass[Sally.GetName()] = Sally;
 
    EmptyClass[Bill.GetName()] = Bill;
 
    EmptyClass[Peter.GetName()] = Peter;
 
    printf("\n++++++++++++++++++++++++++\n");
 
    
    ShowVector(EmptyClass);
 
    printf("\n++++++++++++++++++++++++++\n");
 
    cout<<"\n******* "<<EmptyClass["Bill"].GetName()<<" is "<<EmptyClass["Bill"].GetAge();
    
    getch();
 
    return 0;
}
 
template <class T,class A>
 
void ShowVector(const map <T,A> & v)
 
{
    
 
    for(map <T,A> :: const_iterator c1 = v.begin(); c1 != v.end(); ++c1)
 
    cout<<c1->first<<": "<<c1->second<<"\n";
 
    cout<<endl;
}
Миниатюры
Выводятся непонятные сообщения в процессе выполнения программы  
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.05.2015, 16:25
Ответы с готовыми решениями:

Прерывание программы в процессе выполнения
Доброго времени суток! Подскажите, есть ли возможность прерывать программу во время выполнения? Т.е. у меня в программе есть цикл,...

Ошибка в процессе выполнения программы
Здравствуйте, не могу понять, почему выводится ошибка, что команда не найдена в 4 строке, где if, как я понимаю он ругается на -lt, что...

Изменение PE-заголовка в процессе выполнения программы
Доброго времени суток! Задался задачей изменить часть PE-заголовка в процессе выполнения программы (сразу хочу оговориться, что это не...

39
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
26.05.2015, 13:44  [ТС]
Студворк — интернет-сервис помощи студентам
скопировал.
Миниатюры
Выводятся непонятные сообщения в процессе выполнения программы  
0
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
26.05.2015, 13:47
RAFA91, похоже действительно какая-то особенность реализации map в VS6.
Приду домой - откопаю и посмотрю своими глазами на реализацию.
А пока могу только посоветовать обновить все-таки студию себе.
0
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
26.05.2015, 14:19  [ТС]
в институте мне никто не позволит ее обновлять. всетаки лицензионная.

мне самому интересна эта реализация .

но как гласит с++. меньше знаешь как реализованны методы класса - - крепьче спишь.

мне же не надо знать как работает к примеру самолет.

достаточно знать его функции. но это я так.

___________________


в борланде STL нету ?
0
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
26.05.2015, 14:32
Цитата Сообщение от RAFA91 Посмотреть сообщение
но как гласит с++. меньше знаешь как реализованны методы класса - - крепьче спишь.
мне же не надо знать как работает к примеру самолет.
достаточно знать его функции. но это я так.
Не помню таких провозглашений. С другим каким языком не перепутал? Зато С++ точно гласит вот что:
мы не платим за то, что не используем
Здесь налицо нарушение этого. И, я боюсь, нарушение стандарта языка. Но я это я еще уточню, после того, как посмотрю реализацию.
Не торопись пока с выводами.

Добавлено через 3 минуты
Цитата Сообщение от RAFA91 Посмотреть сообщение
мне же не надо знать как работает к примеру самолет.
В данном случае аналогия не верна.
Ты не пилот здесь, а разработчик самолета, который хочет использовать у себя некую деталь (например готовый двигатель). Для того, что бы самолет не упал, ты должен понимать как он работает (если не в мельчайших деталях, то хотя бы в рамках технической документации).
А пилот в нашем случае - это пользователь готовой программы.

Добавлено через 5 минут
Цитата Сообщение от RAFA91 Посмотреть сообщение
в борланде STL нету ?
Смотря что имеется в виду под борландом. Если какой-нибудь Borland 3.1, то это очень старый компилятор, примерно 1991 года. Там есть какая-никакая библиотека, но она сильно отличается от того, что есть в современном языке.
0
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
26.05.2015, 14:43  [ТС]
спасибо большое - понял.

буду ждать ответа по поводу этих временных обьектов.

ещё не понятен двойной вызов копировщика.
Миниатюры
Выводятся непонятные сообщения в процессе выполнения программы  
0
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
26.05.2015, 19:08
Лучший ответ Сообщение было отмечено RAFA91 как решение

Решение

Цитата Сообщение от DrOffset Посмотреть сообщение
И, я боюсь, нарушение стандарта языка.
Нарушения нет. Наоборот, все крайне близко букве стандарта (наверное даже слишком).
Процитирую целиком.
23.3.1.2
map element access
T& operator[](const key_type& x);
Returns: (*((insert(make_pair(x, T()))).first)).second.
Я не уверен, что это требование реализации. Скорее - это описание поведения. Но. Именно так и реализован в VS6 operator[] у std::map. Это объясняет все "лишние" вызовы конструкторов. Это лишний раз подтверждает причину популярности в свое время STLPort, которой традиционно заменяли в крупных проектах "родную" STL. В STLPort реализация, кстати, без лишних вызовов (через lower_bound). Я в те времена на VS не писал (поэтому про особенность эту не знал), но использовал по долгу службы ровесника VS тех времен - компилятор GCC 2.95. Так вот, там такого безобразия тоже нет.

Цитата Сообщение от RAFA91 Посмотреть сообщение
буду ждать ответа по поводу этих временных обьектов.
ещё не понятен двойной вызов копировщика.
Итак, по порядку на примере из поста номер 20.
C++
1
Student Bill("Bill",17);
Сперва объект создается конструктором с параметрами. Тут все понятно.
C++
1
EmptyClass["Bill"] = Bill;
В этой строке происходит следующее. Вызывается функция (копирую прямо из исходников стандартной библиотеки VS6)
C++
1
iterator _P = insert(value_type(_Kv, _Ty())).first
_Ty - Это Student. Перед вставкой он создается конструктором без параметров. Затем копируется в value_type (value_type - это std :: pair<std::string, Student>). Получаем два вызова конструкторов (без параметров и копирования), которые всегда будут происходить при вызове оператора [] у map, независимо от исхода операции.
Теперь представим, что объекта в map еще не было. Если так, то далее идет вставка в дерево. Инициализация элемента в дереве происходит посредством placement new, с использованием конструктора копирования. Для этого используется вот такая функция:
C++
1
2
3
4
template<class _T1, class _T2> 
inline
void _Construct(_T1 _FARQ *_P, const _T2& _V)
{ new ((void _FARQ *)_P) _T1(_V); }
_P - это имеет тип Student _FARQ *
_V - это ссылка на second элемент (Student) пары (pair), сконструированной в функции operator[] (см. описание выше).
То есть то, что лежало в value_type еще раз копируется при инициализации элемента дерева. Это объясняет двойной вызов конструктора копии при вставке.
И завершает все это вызов оператора присваивания, который в созданный в дереве объект и возвращенный нам по ссылке, копирует данные из объекта Bill.
2
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
27.05.2015, 12:11  [ТС]
Большое Вам спасибо за проделанный анализ !!!
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
27.05.2015, 13:11
Цитата Сообщение от DrOffset Посмотреть сообщение
которые всегда будут происходить при вызове оператора []
А если оптимизацию включить? Или из-за древности компилятора всё равно чуда не произойдет?
0
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
27.05.2015, 13:15
Цитата Сообщение от Tulosba Посмотреть сообщение
А если оптимизацию включить? Или из-за древности компилятора всё равно чуда не произойдет?
Честно говоря, я код этот на VS6 не компилировал. Я ориентировался только на исходники std и на скрины автора темы.
Даже если оптимизация в действительности у автора не применялась, то ее включение максимум уберет первый вызов конструктора копии. Но объект все рано будет создаваться при каждом обращении к элементу map. Тут уже сам подход играет роль.
0
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
27.05.2015, 14:25  [ТС]
может проще самому написать библиотеку ?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
27.05.2015, 14:28
Цитата Сообщение от RAFA91 Посмотреть сообщение
может проще самому написать библиотеку ?
Какую? Аналог STL? Проще компилятор обновить.
0
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
27.05.2015, 14:55  [ТС]
какой посоветуете по хр sp3?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
27.05.2015, 15:18
Цитата Сообщение от RAFA91 Посмотреть сообщение
какой посоветуете по хр sp3?
Какие из современных будут работать на XP - хз. Но рекомендую глянуть в тему.
0
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
27.05.2015, 15:59  [ТС]
а как на счет онлайн компилятора.

можна ли проверить этот код в онлайне ?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
27.05.2015, 16:07
Цитата Сообщение от RAFA91 Посмотреть сообщение
можна ли проверить этот код в онлайне ?
Можно. Но из-за "студийных" функций, наверное только тут.
0
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
27.05.2015, 16:21  [ТС]
не работает она тут.

не увидел
C++
1
cout<<"\n******* "<<EmptyClass["Bill"].GetName()<<" is "<<EmptyClass["Bill"].GetAge();
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
27.05.2015, 16:32
Цитата Сообщение от RAFA91 Посмотреть сообщение
не увидел
Добавь endl в строку или убери getch (а лучше, и то, и другое сделай) и увидишь:
C++
1
cout<<"\n******* "<<EmptyClass["Bill"].GetName()<<" is "<<EmptyClass["Bill"].GetAge() << endl;
http://rextester.com/NWRF63394
0
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
27.05.2015, 17:00  [ТС]
тут я не увидел этих временных обьектов .
0
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
27.05.2015, 17:13
Цитата Сообщение от RAFA91 Посмотреть сообщение
может проще самому написать библиотеку ?
Можно скомпилировать STLPort для 6й студии. Но это если только никак от нее не отвязаться. В остальных случаях дешевле компилятор обновить. Последние студии сейчас все есть в бесплатном исполнении.
Если же библиотеку не подменять (это ведь нужно уметь делать), то можно сделать workaround через собственную функцию, в которой применить способ поиска через lower_bound + insert. Примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
template <typename Key, typename Value>
Value & get(std::map<Key, Value> & mobj, typename std::map<Key, Value>::key_type const & key)
{
    typedef std::map<Key, Value> map_type;
 
    typename map_type::iterator i = mobj.lower_bound(key);
    // i->first is greater than or equivalent to key
    if(i == mobj.end() || mobj.key_comp()(key, i->first))
    {
        i = mobj.insert(i, std::make_pair(key, Value()));
    }
    return i->second;
}
И пользоваться везде ей, вместо оператора[].
C++
1
2
3
4
5
////.....
 
std::map<std::string, Student> m;
 
get(m, "Bill") = Bill;
0
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452
27.05.2015, 17:33  [ТС]
спасибо за замечания.

буду наверное менять студию.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.05.2015, 17:33

Создание объекта в процессе выполнения программы
Допустим нужно в процессе выполнения программы показать на форме компонент TImage(который ранее не создан), а затем вывести из памяти. ...

Консоль закрывается в процессе выполнения программы - С++
В Visual Studio в процессе выполнения программы и в процессе работы закрывается через какое- то время консоль, сразу же открывается как...

В процессе выполнения программы открыть ехешник
Доброго времени суток! Необходимо открыть ехешный файл во время выполнения программы. Вот как я хотел сделать: Var x: text; ...

Создание массива в процессе выполнения программы
К примеру нужно в процессе выполнения программы создать массив. Т.е. этот массив не определен заранее. Ситуация - таких массивов может быть...

Создание массивов в процессе выполнения программы
Здравствуйте. Передо мной постала задача такого рода: Есть массив строк определенного размера, который заполняется и когда наполняется...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

Новые блоги и статьи
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru