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

насколько это соответствует стандарту? - C++

Восстановить пароль Регистрация
 
activnaya
 Аватар для activnaya
255 / 45 / 2
Регистрация: 24.11.2012
Сообщений: 466
29.12.2012, 05:53     насколько это соответствует стандарту? #1
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
#include <iostream>
 
class shit
{
private:
    int x;
public:
    shit(){}
    shit(int p) { x = p; }
    void set (int* y) { x = *y; }
    int* get() { return &x; }
};
 
 
int main ()
{
    shit a(0), b(1);
 
    a.set (b.get());
 
    std::cout << *a.get () << *b.get () << '\n';
 
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
29.12.2012, 06:02     насколько это соответствует стандарту? #2
Давайте для тупых: при чем тут стандарт и что конкретно смущает в коде?
activnaya
 Аватар для activnaya
255 / 45 / 2
Регистрация: 24.11.2012
Сообщений: 466
29.12.2012, 06:06  [ТС]     насколько это соответствует стандарту? #3
поправочка
C++
1
void set (int* y) { *y = x; }
Добавлено через 1 минуту
Цитата Сообщение от 0x10 Посмотреть сообщение
Давайте для тупых: при чем тут стандарт и что конкретно смущает в коде?
изменение поля private одного объекта, методом вызова другого объекта.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11811 / 6790 / 767
Регистрация: 27.09.2012
Сообщений: 16,840
Записей в блоге: 2
Завершенные тесты: 1
29.12.2012, 06:08     насколько это соответствует стандарту? #4
не знаю как на счет стандарта, но идея ООП нарушена. Зачем Вам приватная переменная, если Вы даете к ней доступ?
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
29.12.2012, 06:09     насколько это соответствует стандарту? #5
Вполне допустимо. Спецификаторы доступа всего лишь ограничвают возможность прямого обращения к полям объекта. В данном случае - вернули адрес, с помощью указателя делаем что хотим, все ок.
activnaya
 Аватар для activnaya
255 / 45 / 2
Регистрация: 24.11.2012
Сообщений: 466
29.12.2012, 06:12  [ТС]     насколько это соответствует стандарту? #6
спасибо. Я уже поняла, что поле private это защита от собственных ошибок, а не внешних угроз. Иначе говоря единицей защиты является не объект, а тип.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11811 / 6790 / 767
Регистрация: 27.09.2012
Сообщений: 16,840
Записей в блоге: 2
Завершенные тесты: 1
29.12.2012, 06:16     насколько это соответствует стандарту? #7
Цитата Сообщение от 0x10 Посмотреть сообщение
В данном случае - вернули адрес, с помощью указателя делаем что хотим, все ок.
Тем самым нарушив инкапсуляцию. Теперь можно с этой переменной делать все что угодно, а значит можно нарушить состояние объекта
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
29.12.2012, 06:20     насколько это соответствует стандарту? #8
activnaya, если хотите защититься в данном случае, используйте указатели на константу.

Добавлено через 49 секунд
Цитата Сообщение от Croessmah Посмотреть сообщение
Тем самым нарушив инкапсуляцию. Теперь можно с этой переменной делать все что угодно, а значит можно нарушить состояние объекта
Конечно. Но тут вопрос не в том, правильно ли так делать, а в том, должен ли вообще данный код работать так, как работает.
activnaya
 Аватар для activnaya
255 / 45 / 2
Регистрация: 24.11.2012
Сообщений: 466
29.12.2012, 06:31  [ТС]     насколько это соответствует стандарту? #9
Цитата Сообщение от 0x10 Посмотреть сообщение
а в том, должен ли вообще данный код работать так, как работает
ну моя логика такова: поле private изменяется с помощью метода класса, а метод класса имеет доступ к полю private, следовательно не имеет значения из какого именно объекта был вызван метод и это совершенно "законно".

Добавлено через 2 минуты
а вообще все глобальней, ну как я в #6 писала.
Nixy
ComfyMobile
 Аватар для Nixy
399 / 280 / 8
Регистрация: 24.07.2012
Сообщений: 916
29.12.2012, 07:01     насколько это соответствует стандарту? #10
Цитата Сообщение от Croessmah Посмотреть сообщение
Тем самым нарушив инкапсуляцию. Теперь можно с этой переменной делать все что угодно, а значит можно нарушить состояние объекта
мб инкапсуляция нарушена, но я вот приват даю опасным полям, как массив, и обеспечиваю к ним доступ через get/set с проверкой индекса, по моему все логично, либо если переменной нужен обработчик какой либо, по этому вроде все нормально у ТС'а
Avazart
 Аватар для Avazart
6896 / 5136 / 251
Регистрация: 10.12.2010
Сообщений: 22,568
Записей в блоге: 17
29.12.2012, 14:53     насколько это соответствует стандарту? #11
Цитата Сообщение от Croessmah Посмотреть сообщение
не знаю как на счет стандарта, но идея ООП нарушена.
Ну во первых так можно писать только для поддержания общего интерфейса кода
Во вторых, не нарушена если get() и set() сделать виртуальными, а в производных классах добавить обработку последействий и проверок.

Единственное что смущает: почему через указатели ?

Добавлено через 4 минуты
C++
1
2
void set(int y) { x = y; } 
int& get() {  return x; }
Тут тип int а не структура так что быстрее не будет...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.01.2013, 00:38     насколько это соответствует стандарту?
Еще ссылки по теме:

Инициализация по стандарту C++11 C++
Факториал! Для кого-то это легко, а кто-то вообще это не знает! C++
Какому типу переменной соответствует HANDLE? C++

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

Или воспользуйтесь поиском по форуму:
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
16.01.2013, 00:38     насколько это соответствует стандарту? #12
activnaya, вообще возвращая указатель стоит задуматься о добавлении спецификатора const.
Цитата Сообщение от activnaya Посмотреть сообщение
насколько это соответствует стандарту?
Лень лезть в стандарт. Но по моему ничего такого нет. Указатель валидный. int x; не объявлено как const.
Просто объект это что. Это как набор полей. Мы имеем указатель на объект. Как правиль зачастую первое поле это скрытый член указатель на vtable. Поэтому обычный метод в машинном представлении - это его адрес и при вызове мы просто делаем call(не jmp). У поля тоже есть адрес.

Добавлено через 3 минуты
Даже такой код прокатит. Но здесь все очевидно.http://ideone.com/5i96VN
Yandex
Объявления
16.01.2013, 00:38     насколько это соответствует стандарту?
Ответ Создать тему
Опции темы

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