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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
ramybozy
8 / 8 / 0
Регистрация: 01.07.2012
Сообщений: 138
#1

Может ли вообще на практике возникнуть ситуация, когда определенный класс следует указывать как друго самого себя? - C++

09.09.2012, 08:17. Просмотров 704. Ответов 15
Метки нет (Все метки)

Может ли вообще на практике возникнуть ситуация, когда определенный класс следует указывать как друго самого себя?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.09.2012, 08:17
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Может ли вообще на практике возникнуть ситуация, когда определенный класс следует указывать как друго самого себя? (C++):

Как скрипт может сохранить массив, в случае если ему нужнон вызвать самого себя? - C# ASP.NET
Итак проблема: Скрипт (поисковый движок) вызывает сам себя для того, чтобы отобразить последующие страницы с найдеными линками (не более...

Тег p, может ли самого себя передать методу? - jQuery
тег p может ли самого себя передать методу? Вот, например, есть такая строчка кода <p ...

bindingsource не может быть источником данных для самого себя - C#
Здравствуйте друзья. Я цыклом пропинговываю ip адреса, беру ip из базы (access). Выскакивают ошибки: 1) 20.04.2010 14:57:51В...

Запутался в пакетах. (Класс не нахолит самого себя) - Java
Уважаемые коллеги! Проблема такая: Решил всё разместить по пакетам. Структура такая: С:Ontcbrsystem cbr ...

Класс который можно вложить в самого себя - C#
Как можно создать класс, который может вкладываться в самогосебя? Класс может быть дюбого типа, но вкладываться должны все. Через...

Деструктор для класс, имеющий указатель на самого себя - C++
Здравствуйте. Дан класс, для него нужно написать деструктор. using namespace std; class List{ private: int myValue; List...

15
Kastaneda
Нарушитель
Эксперт С++
4676 / 2880 / 234
Регистрация: 12.12.2009
Сообщений: 7,314
Записей в блоге: 2
Завершенные тесты: 1
09.09.2012, 08:19 #2
Может, для этого нам понадобиться 2 пакетика травы, 75 ампул мескалина, 5 пакетиков диэтиламида д-лизергиновой кислоты или ЛСД, солонка наполовину заполненгая кокаином, и целое море разноцветных амфетаминов, барбитуратов и транквилизаторов.

(с) страх и ненависть в лас-вегасе
1
PSIAlt
87 / 87 / 8
Регистрация: 19.06.2012
Сообщений: 245
09.09.2012, 10:12 #3
Класс и так сам себе друг всегда
0
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
09.09.2012, 12:29 #4
PSIAlt, Не совсем верно, если говорить о шаблонных классах.

http://liveworkspace.org/code/e316ff54e0cfde3a4952491f206d72fd

Чтобы решить достаточно http://liveworkspace.org/code/a30a0b13c71a1974e4b33da0997cb9e4

Добавлено через 18 минут
Конечно, такое вряд ли может пригодится + разные инстанцирования шаблонных классов все же являются разными классами, однако...
1
Kastaneda
Нарушитель
Эксперт С++
4676 / 2880 / 234
Регистрация: 12.12.2009
Сообщений: 7,314
Записей в блоге: 2
Завершенные тесты: 1
09.09.2012, 12:40 #5
Цитата Сообщение от ForEveR Посмотреть сообщение
Конечно, такое вряд ли может пригодится
Да, полностью надуманная ситуация, однако она демонстрирует богатство С++.

Не по теме:

Раньше думал что об С++ можно мозги сломать, сейчас думаю:"бл..., как я все это выучил?"
С++ такой С++

0
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
09.09.2012, 14:13 #6
Kastaneda, Я бы вообщем-то не сказал, что пример такой уж надуманный...

http://liveworkspace.org/code/019848842016c410680937b5e9f0fc50

Собственно у boost::shared_ptr есть конструктор

C++
1
2
template<typename U>
shared_ptr(const shared_ptr<U>&);
Чтобы сделать так, чтобы метод работал в классе юзается такая фича:

C++
1
template<class Y> friend class shared_ptr;
Мы соответственно можем разрешить это так же.

http://liveworkspace.org/code/fc360c2d3288fd8dc487c96a08e523a7

Не по теме:

(Я что-то совсем забыл синтаксис объявления френдом всех конкретизаций шаблонного класса, кроме той в которой мы находимся. Полез в буст - вспомнил).

0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
09.09.2012, 14:21 #7
Цитата Сообщение от ForEveR Посмотреть сообщение
Я бы вообщем-то не сказал, что пример такой уж надуманный...
Только вот за такой код по рукам надо бить.) Т.е. не за этот пример, а если в реальных приложениях такое пишут. Всё таки, даже сделав все члены public, возможностей нанесения вреда объекту этого класса будет меньше, чем делать его другом.
Ну и если придираться, то C<int> и C<double> это разные классы и "задруживание" самого себя просто побочным эффектом кривой реализации оказывается.
0
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
09.09.2012, 14:24 #8
Deviaphan, За конкретно тот пример - согласен. За пример, который используется в бусте/STL - не согласен)
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
09.09.2012, 14:35 #9
Про буст согласен. А в STL разве тоже аналогичное есть?
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
09.09.2012, 14:37 #10
Цитата Сообщение от Deviaphan Посмотреть сообщение
Ну и если придираться, то C<int> и C<double> это разные классы и "задруживание" самого себя просто побочным эффектом кривой реализации оказывается.
Если придираться по полной с точки зрения ООП головного мозга, то сама возможность задруживания кого бы то ни было с кем бы то ни было — это уже кривая реализация и жуткое нарушение инкапсуляции.

Но конкретно у буста — это ради возможности сделать shared_ptr слаботипизированным, что тоже, в общем-то, не совсем хорошо, но да ладно, раз уж язык такой.
0
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
09.09.2012, 14:42 #11
Deviaphan, Зависит от реализации конечно, но что-то мне подсказывает что в этих случаях используется та же фича (в основном).
C++
1
2
template<class Y> shared_ptr(const shared_ptr<Y>& r, T *p) noexcept;
template<class Y> shared_ptr(const shared_ptr<Y>& r) noexcept;
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
09.09.2012, 14:43 #12
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
это ради возможности сделать shared_ptr слаботипизированным
А я про сериализацию сразу подумал.)
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
09.09.2012, 14:47 #13
Цитата Сообщение от Deviaphan Посмотреть сообщение
А я про сериализацию сразу подумал.)
Ради того, чтобы сериализация занимала меньше строк. Типа быстро чётко кастуем какой-нибудь указатель на Foo в указатель на char и херачим sizeof(Foo) байт куда надо. Вместо Ъ-решения: нормального метода serialize() в Foo, который сам создаст новый массив, сам уложит туда в определённом порядке байтики нужных полей и вернёт этот массив. И deserialize(), который знает, в каком порядке serialize() кладёт байтики.

А потом внезапно оказывается, что при сериализации надо выполнять deep-copy и тупо копировать память не работает. Или там есть поля, которые должны быть сброшены у десериализованного на начальные, а не взяты у оригинала.
0
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
09.09.2012, 14:48 #14
это ради возможности сделать shared_ptr слаботипизированным
Не понял несколько этой фразы. Где тут слаботипизированность, если используется enable_if?
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
09.09.2012, 14:56 #15
* перечитал исходники примеров

Я всегда буду внимательно читать. Я всегда буду внимательно читать.
Я всегда буду внимательно читать. Я всегда буду внимательно читать.
Я всегда буду внимательно читать. Я всегда буду внимательно читать.
Я всегда буду внимательно читать. Я всегда буду внимательно читать.

И писать более чётко. Я то про ваш class C говорил, и мне чего-то показалось, что там кастуются друг к другу ссылки на int и double О_О

Так что до слов «жуткое нарушение инкапсуляции» от меня шёл бред.

И да, задруживание самого с собой — это последствие того, что шаблонные классы это разные классы.
0
09.09.2012, 14:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.09.2012, 14:56
Привет! Вот еще темы с ответами:

создать класс способный возвращать копию самого себя - C#
Надо создать класс способный возвращать копию самого себя, за счет применения метода GetCopy, который должен использовать метод...

Можно ли заставить класс записывать самого себя в файл? - C++
то есть class A{ int q,w,e; bool Write(); }; main(){ A a1; a1.write();// и он записывает сам себя в файл, не...

Как пропустить часть кода, в которой может возникнуть ошибка? - C#
Здравствуйте! При запуске программы всё работает нормально - никаких ошибок нету. Однако в некоторых случаях, если вводить в TextBox...

Где, когда и как правильно указывать заголовки? - C++/CLI
Использую MS Visual Studio 2012 Есть программа написанная по видеоуроку: (в видеоуроке он использует iostream, видимо это приложение...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru