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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
thick_int
Заблокирован
#1

Возвращение ссылки или указателя на закрытый элемент класса. - C++

02.01.2012, 17:13. Просмотров 1405. Ответов 8
Метки нет (Все метки)

Всех уважаемых форуман. поздравляю с наступившим новым годом и прошу ответить на такой вопрос.
Почему до сих пор современный C++ не избавился от такой зияющей бреши, как воззвращение открытой членом-функцией ссылки или указателя на закрытый член данного класса?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.01.2012, 17:13
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Возвращение ссылки или указателя на закрытый элемент класса. (C++):

Возврат ссылки на закрытый элемент данных с++ - C++
Я не могу понять как устроена проблема с возвратом ссылки на закрытый элемент данных.class Time{ public: int &badSetHour(int hh){ ...

Возвращение функцией массива (или указателя на массив) - C++
Вопрос опытным. Имеется массив картинок TImage, который создается одной функцией. Как вызвать этот же массив из другой функции? void...

Получение указателя из производного класса на элемент одного из базовых классов - C++
Как все же получить указатель или пускай ссылку на элемент Coef базового класса A. Если так делать нельзя, то по какой причине? Обратите...

Возвращение указателя на соответствующую строку - C++
Доброго времени суток. Есть задача: по номеру дня недели вывести его название Есть код: #include <iostream> #include <conio.h> ...

Возвращение указателя на начало первой строки - C++
Программа отказывается выполнять второй цикл. #include "stdafx.h" #include <iostream> #include <string> #include <fstream> ...

Возвращение ссылки из функции - C++
Привет, я немного не понимаю, почему в следующем коде в строках 16-17 надо возвращать именно ссылку: #include <iostream> #include...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
02.01.2012, 17:45 #2
В С++ всегда было много узких мест, за которыми надо тщательно следить. Но простите, а что в том, о чём вы говорите, такого? И в C#, и в Java тоже можно возвращать ссылку на закрытое или защищённое поле.
1
thick_int
Заблокирован
02.01.2012, 18:26  [ТС] #3
Ну тех языков, которые Вы упомянули, я просто не знаю.
Ну теперь буду знать, что это общая беда.
0
Razzeeyy
30 / 7 / 2
Регистрация: 01.03.2011
Сообщений: 95
02.01.2012, 18:53 #4
Концепция классов и инкапсуляции данных придумана отнюдь не для "действительной" безопасности программы, а всего-лишь для удобства поиска ошибок в больших программах (компилятор помогает программисту быстрее локализовать ошибку).
Отсюда выходит, что нету ничего зазорного в том, чтобы предоставить программисту возможность вернуть ссылку на закрытый член если он того сознательно захотел.
К тому же это помогает избежать создания лишнего объекта внутри класса, затем копирование в него содержимого объекта из закрытой части класса, затем возвращение указателя(!) из функции, и еще это же надо проследить, чтобы объект был своевременно уничтожен во избежание утечек памяти.
Ну и теперь подумайте, нужен ли вам "100% безопасный код"?
0
Gepar
1177 / 533 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
02.01.2012, 19:04 #5
Ну вернуть ссылку на закрытое поле незаметно для себя не получиться, а уж вернуть, забыть об этом и случайно изменить ещё сложнее. Не думаю что если такое проделать то это можно будет назвать недоработкой языка, это скорее недоработка мышления программиста или злой умысел какой-то.
2
thick_int
Заблокирован
02.01.2012, 19:20  [ТС] #6
Цитата Сообщение от Gepar Посмотреть сообщение
Ну вернуть ссылку на закрытое поле незаметно для себя не получиться, а уж вернуть, забыть об этом и случайно изменить ещё сложнее. Не думаю что если такое проделать то это можно будет назвать недоработкой языка, это скорее недоработка мышления программиста или злой умысел какой-то.
Все это, конечно верно, но если посмотреть на кипишь, который в C++ развернут вокруг, например, ключевого слова const, то волей-неволей, задаешь себе вопрос, а кто тогда программисту мешает помнить, что данный объект является константным и модификации не подлежит.
Наверно, просто если принята концепция разумного запрета модификации, то тогда она должна быть реализована до конца.
0
Razzeeyy
30 / 7 / 2
Регистрация: 01.03.2011
Сообщений: 95
02.01.2012, 19:49 #7
const не для программиста в первую очередь, оно для компилятора, большинство const выражений вычисляются во время компиляции.
ах да, еще const в аргументах функции служит другим программистам гарантией того, что данное значение не изменят в функции.
Одно значение очень легко изменить, забыв при этом о его "константности", а вот классы уже проектируются более вдумчиво и там шансы, что "по забывчивости" будет создана ужасная ошибка очень ничтожны
1
thick_int
Заблокирован
02.01.2012, 19:57  [ТС] #8
Хорошо, ну давайте сойдемся на том, что неплохо было бы, чтобы в будущих версиях компилятора хотя бы выдавалось предупреждение о том, что открытая функция возвращает левотороннюю ссылку или указатель на неконстанту, объектами которых являются закрытые члены класса.
0
Razzeeyy
30 / 7 / 2
Регистрация: 01.03.2011
Сообщений: 95
02.01.2012, 20:03 #9
Цитата Сообщение от thick_int Посмотреть сообщение
Хорошо, ну давайте сойдемся на том, что неплохо было бы, чтобы в будущих версиях компилятора хотя бы выдавалось предупреждение о том, что открытая функция возвращает левотороннюю ссылку или указатель на неконстанту, объектами которых являются закрытые члены класса.
Теперь вам осталось отослать данный suggestion Страуструпу

Не по теме:

Вот какие действительно проблемы в языке C++ и достаточно острые (сейчас полетят камни но..), так это препроцессор и эта канитель с include... Недавно собирал с виду безобидную по виду "архитектуру" этих самых "файлов-модулей" приложения, так компилятор на прочь твердил мне о переопределении некоторых переменных... Даже при живых инклуд гвардах! Кароче я так толком и не разобрался, но думаю, косяк был из-за непонятной мне логики обработки едениц трансляции и почему-то "перекрытия" объявлений в одной еденице трансляции объявлений в другой.. Бардак одним словом, я плюнул и стал пихать весь код "файлов модулей" в заголовочные файлы (каждый в свой, следуя здравой логике), и всё! При использовании инклуд гвардов всё компилиться без проблем! Правда не по стандарту сделано, да и пёс с ним))

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.01.2012, 20:03
Привет! Вот еще темы с ответами:

Создание указателя типа базового класса на экземпляр производного класса - C++
Добрый день! Иногда видел коды, где создавался указатель типа базового класса на объект класса - наследника, для чего это может применяться?

Определить обработчик исключений на преобразование указателя базового класса на указатель производного класса - C++
Класс В является производным от класса А. Определить обработчик исключительной ситуации на преобразование указателя базового класса А на...

Вызов методов класса из двойного указателя на экземпляр класса - C++
Добрый день! Как можно вызвать метод класса по двойному указателя на его экземпляр? struct Point { void getPoint(){}; ...

Возвращение ссылки на локальный объект - C++
В каком-то коде мельком видел что-то вроде: char& char_stub() { char c; return c; }; int main() {


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
02.01.2012, 20:03
Ответ Создать тему
Опции темы

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