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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Mr. Pyatachok
 Аватар для Mr. Pyatachok
8 / 8 / 0
Регистрация: 30.06.2011
Сообщений: 250
09.10.2011, 17:44     объяснить функцию #1
Всем привет!
Есть код:
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;}
Заранее спасибо
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.10.2011, 17:44     объяснить функцию
Посмотрите здесь:

Объяснить программу C++
Функция (объяснить) C++
Объяснить строку C++
Объяснить прогграму C++
Объяснить код на С++ C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
aeshes
 Аватар для aeshes
437 / 200 / 13
Регистрация: 07.10.2011
Сообщений: 462
09.10.2011, 19:22     объяснить функцию #21
Подозреваю, что это какой-то задачник, с задачами типа "что напечатает программа". А вместо реализации конкретных функций (в последнем примере - конструкторов), там стоят ... (типа оно есть, работает, но на результат вывода не влияет)

Добавлено через 1 минуту
Цитата Сообщение от Сыроежка Посмотреть сообщение
Что касается Майкрософт VC++ 2010, то, даже убрав из класса предварительное объявление, код не компилируется. То есть имеет место очевидный баг. Например, на старом Borland Builder 5.0 этот код компилируется.
У меня компилируется такой код. Возможно, у меня другая версия студии
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,390
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;}
};
Сыроежка
Заблокирован
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, который появился сразу же после выхода компилятора.

Но тоже интересный вопрос: у вас компилируется код, когда предварительное объявление присутствует в классе, или же вы убрали предварительное объявление этой функции, оставив лишь ее определение?
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
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() (в данном случае без реализации) - дружественная, не член класса.
Вроде понятно объяснил...
Сыроежка
Заблокирован
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, и проблем не должно быть, если компилятор следует стандарту.
aeshes
 Аватар для aeshes
437 / 200 / 13
Регистрация: 07.10.2011
Сообщений: 462
09.10.2011, 19:39     объяснить функцию #26
Сыроежка, убрала прототип (предварительное объявление) и все компилируется. С прототипом - нет.
Честно сказать, я даже не знаю, где посмотреть, какая у меня версия компилятора в студии, только версию самой студии могу сказать 10.0.30319.1 RTMRel

В стандарте вроде что-то было про то, что дружественные функции в классе, впервые предварительно объявленные, имеют внешнюю линковку или как-то так с поправкой на мой английский
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.10.2011, 19:46     объяснить функцию
Еще ссылки по теме:

C++ Объяснить задание
Объяснить выражение C++
C++ Объяснить функцию проверки степени

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

Или воспользуйтесь поиском по форуму:
Сыроежка
Заблокирован
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, то я его по глупости купил в первых рядах, а обновление, которое вышло уже затем следом, еще не установил. Может быть этот баг уже исправлен.
Yandex
Объявления
09.10.2011, 19:46     объяснить функцию
Ответ Создать тему
Опции темы

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