Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
8 / 9 / 1
Регистрация: 30.06.2011
Сообщений: 250
1

объяснить функцию

09.10.2011, 17:44. Показов 2251. Ответов 26
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет!
Есть код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<conio.h>
#include<iostream.h>
 
class integer1
{
  int val;
    public:
  integer1(int v0 ) {val=v0;}
  friend integer1 INC(integer1);
  integer1 INC(integer1 scr) {scr.val++; return scr;}
 
};
 
void main()
{
 integer1 x(5),y=(0),z=(0);
 y=INC(x);
 z=INC(INC(x));
 
 getch();
}
Необходимо подсчитать количество объектов и изобразить схему их взаимодействия (копирование, отображение).

Объектов 3, помогите понять что твориться в этих строках
C++
1
2
friend integer1 INC(integer1);
integer1 INC(integer1 scr) {scr.val++; return scr;}
Заранее спасибо
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.10.2011, 17:44
Ответы с готовыми решениями:

Объяснить функцию
Добрый вечер всем. Хотел бы разузнать поподробнее что делает эта функция. Заранее прошу объясните...

Объяснить функцию проверки степени
int proverkastepeni(int n) { return !(n&amp;(n-1)); } Нашел вот такую функцию проверки степени, не...

Объяснить функцию perevod
Определить функцию преобразования десятичного числа n в СС( двоичную, восьмеричную,...

Объяснить функцию арксинус
Пришла на ум одна задачка , кто может помочь разобраться в тригонометрии ? Условия и вопрос на...

26
448 / 211 / 21
Регистрация: 07.10.2011
Сообщений: 462
09.10.2011, 19:22 21
Author24 — интернет-сервис помощи студентам
Подозреваю, что это какой-то задачник, с задачами типа "что напечатает программа". А вместо реализации конкретных функций (в последнем примере - конструкторов), там стоят ... (типа оно есть, работает, но на результат вывода не влияет)

Добавлено через 1 минуту
Цитата Сообщение от Сыроежка Посмотреть сообщение
Что касается Майкрософт VC++ 2010, то, даже убрав из класса предварительное объявление, код не компилируется. То есть имеет место очевидный баг. Например, на старом Borland Builder 5.0 этот код компилируется.
У меня компилируется такой код. Возможно, у меня другая версия студии
1
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
09.10.2011, 19:23 22
Цитата Сообщение от Сыроежка Посмотреть сообщение
Правильно ли я понял, что вы проверили использование определения этой дружественной функции внутри класса, убрав из класса предварительное ее объявление, и у вас с помощью gcc все скомпилировалось?
C++
1
2
3
4
5
6
7
class integer1
{
    int val;
public:
    integer1(int v0 ) {val=v0;}
    friend integer1 INC(integer1 scr) {scr.val++; return scr;}
};
0
Заблокирован
09.10.2011, 19:26 23
Цитата Сообщение от Nameless One Посмотреть сообщение
C++
1
2
3
4
5
6
7
class integer1
{
    int val;
public:
    integer1(int v0 ) {val=v0;}
    friend integer1 INC(integer1 scr) {scr.val++; return scr;}
};
Значит gcc в отличии от Майкрософт VC++ 2010 в этом вопросе следует стандарту. Лично я уже в VC++ 2010 нашел четыре бага.

Добавлено через 1 минуту
Цитата Сообщение от aeshes Посмотреть сообщение
Подозреваю, что это какой-то задачник, с задачами типа "что напечатает программа". А вместо реализации конкретных функций (в последнем примере - конструкторов), там стоят ... (типа оно есть, работает, но на результат вывода не влияет)

Добавлено через 1 минуту


У меня компилируется такой код. Возможно, у меня другая версия студии
Может быть у вас уже с обновлением компилятор. Как я уже сказал, я не поставил себе SP1, который появился сразу же после выхода компилятора.

Но тоже интересный вопрос: у вас компилируется код, когда предварительное объявление присутствует в классе, или же вы убрали предварительное объявление этой функции, оставив лишь ее определение?
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
09.10.2011, 19:29 24
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class integer1
{
  int val;
    public:
  integer1(int v0 ) {val=v0;}
  friend integer1 INC(integer1);
  integer1 INC(integer1 scr) {scr.val++; return scr;}
 
};
 
void main()
{
 integer1 x(5),y=(0),z=(0);
 y=INC(x);
 z=INC(INC(x));
 
 getch();
}
Предположу, что компилятор воспринимает это как 2 разные ф-ции. Чтоб код компилировался, нужно добавить (не переместить из тела класса, а добавить) определение INC() за пределом класса, либо убрать строку с friend..., а в мэйне сделать так:
C++
1
y=x.INC(x);
бред конечно, но похоже что получаются ф-ция INC() - член класса и ф-ция INC() (в данном случае без реализации) - дружественная, не член класса.
Вроде понятно объяснил...
0
Заблокирован
09.10.2011, 19:32 25
Цитата Сообщение от Kastaneda Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class integer1
{
  int val;
    public:
  integer1(int v0 ) {val=v0;}
  friend integer1 INC(integer1);
  integer1 INC(integer1 scr) {scr.val++; return scr;}
 
};
 
void main()
{
 integer1 x(5),y=(0),z=(0);
 y=INC(x);
 z=INC(INC(x));
 
 getch();
}
Предположу, что компилятор воспринимает это как 2 разные ф-ции. Чтоб код компилировался, нужно добавить (не переместить из тела класса, а добавить) определение INC() за пределом класса, либо в мэйне сделать так:
C++
1
y=x.INC(x);
бред конечно, но похоже что получаются ф-ция INC() - член класса и ф-ция INC() (в данном случае без реализации) - дружественная, не член класса.
Вроде понятно объяснил...
Вполне возможно, что ваше объяснение близко к истине. То есть опять-таки проблема заключается в связывании, внешнем и внутреннем. То есть когда компилятор видет объявление, то он считает, что эта функция имеет внешнее связывание, а встраиваемые функции имеют внутреннее связывание. Поэтому компилятор не считает, что объявление друга имеет отношение к этой встроенной функции.

Надо просто убрать предварительное объявление, оставив определение, естественно, добавив к нему ключевое слово friend, и проблем не должно быть, если компилятор следует стандарту.
0
448 / 211 / 21
Регистрация: 07.10.2011
Сообщений: 462
09.10.2011, 19:39 26
Сыроежка, убрала прототип (предварительное объявление) и все компилируется. С прототипом - нет.
Честно сказать, я даже не знаю, где посмотреть, какая у меня версия компилятора в студии, только версию самой студии могу сказать 10.0.30319.1 RTMRel

В стандарте вроде что-то было про то, что дружественные функции в классе, впервые предварительно объявленные, имеют внешнюю линковку или как-то так с поправкой на мой английский
0
Заблокирован
09.10.2011, 19:46 27
Цитата Сообщение от aeshes Посмотреть сообщение
Сыроежка, убрала прототип (предварительное объявление) и все компилируется. С прототипом - нет.
Честно сказать, я даже не знаю, где посмотреть, какая у меня версия компилятора в студии, только версию самой студии могу сказать 10.0.30319.1 RTMRel

В стандарте вроде что-то было про то, что дружественные функции в классе, впервые предварительно объявленные, имеют внешнюю линковку или как-то так с поправкой на мой английский
Да, в стандарте есть подобная фраза "11.4 #3 A friend first declared in a friend declaration has external linkage."
На это я и ссылался.
Что касается моего компилятора VC++ 2010, то я его по глупости купил в первых рядах, а обновление, которое вышло уже затем следом, еще не установил. Может быть этот баг уже исправлен.
1
09.10.2011, 19:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.10.2011, 19:46
Помогаю со студенческими работами здесь

Объяснить функцию двухмерного массива
for n in range(1,5): for k in range(n,5): A = A + 1 A = A + 1 //Остального кода...

Объяснить пожалуйста мне эту функцию
На просторах интернета нашел один из методов адаптивного меню и все по CSS ясно и понятно, но вот в...

Объяснить $(this)
Есть скрипт с Stack Overflow &lt;script&gt; $(document).on(&quot;submit&quot;, &quot;#login-form&quot;,...

Объяснить
Напишите,пожалуйста построчный коментарий,к каждой строке что она делает,и что за функция,и зачем...


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

Или воспользуйтесь поиском по форуму:
27
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru