Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
 Аватар для RAFA91
-28 / 35 / 25
Регистрация: 14.06.2013
Сообщений: 1,452

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

25.05.2015, 16:25. Показов 2252. Ответов 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
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
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
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
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
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
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
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
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
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
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
Ответ Создать тему
Новые блоги и статьи
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru