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

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

Войти
Регистрация
Восстановить пароль
 
activnaya
 Аватар для activnaya
255 / 45 / 2
Регистрация: 24.11.2012
Сообщений: 466
#1

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

29.12.2012, 05:53. Просмотров 505. Ответов 11
Метки нет (Все метки)

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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.12.2012, 05:53     насколько это соответствует стандарту?
Посмотрите здесь:

C++ Какая буква соответствует дисководу?
this это адресс объекта, а *this это сам объект. я всё правельно понял? C++
Как писать код по стандарту C++
C++ Насколько плохой код
C++ Последняя официальная документация по стандарту СРР
Инициализация по стандарту C++11 C++
Факториал! Для кого-то это легко, а кто-то вообще это не знает! C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2449 / 1621 / 238
Регистрация: 24.11.2012
Сообщений: 3,991
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
Модератор
Эксперт CЭксперт С++
 Аватар для Croessmah
12527 / 7089 / 797
Регистрация: 27.09.2012
Сообщений: 17,499
Записей в блоге: 2
Завершенные тесты: 1
29.12.2012, 06:08     насколько это соответствует стандарту? #4
не знаю как на счет стандарта, но идея ООП нарушена. Зачем Вам приватная переменная, если Вы даете к ней доступ?
0x10
2449 / 1621 / 238
Регистрация: 24.11.2012
Сообщений: 3,991
29.12.2012, 06:09     насколько это соответствует стандарту? #5
Вполне допустимо. Спецификаторы доступа всего лишь ограничвают возможность прямого обращения к полям объекта. В данном случае - вернули адрес, с помощью указателя делаем что хотим, все ок.
activnaya
 Аватар для activnaya
255 / 45 / 2
Регистрация: 24.11.2012
Сообщений: 466
29.12.2012, 06:12  [ТС]     насколько это соответствует стандарту? #6
спасибо. Я уже поняла, что поле private это защита от собственных ошибок, а не внешних угроз. Иначе говоря единицей защиты является не объект, а тип.
Croessmah
Модератор
Эксперт CЭксперт С++
 Аватар для Croessmah
12527 / 7089 / 797
Регистрация: 27.09.2012
Сообщений: 17,499
Записей в блоге: 2
Завершенные тесты: 1
29.12.2012, 06:16     насколько это соответствует стандарту? #7
Цитата Сообщение от 0x10 Посмотреть сообщение
В данном случае - вернули адрес, с помощью указателя делаем что хотим, все ок.
Тем самым нарушив инкапсуляцию. Теперь можно с этой переменной делать все что угодно, а значит можно нарушить состояние объекта
0x10
2449 / 1621 / 238
Регистрация: 24.11.2012
Сообщений: 3,991
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
400 / 281 / 8
Регистрация: 24.07.2012
Сообщений: 916
29.12.2012, 07:01     насколько это соответствует стандарту? #10
Цитата Сообщение от Croessmah Посмотреть сообщение
Тем самым нарушив инкапсуляцию. Теперь можно с этой переменной делать все что угодно, а значит можно нарушить состояние объекта
мб инкапсуляция нарушена, но я вот приват даю опасным полям, как массив, и обеспечиваю к ним доступ через get/set с проверкой индекса, по моему все логично, либо если переменной нужен обработчик какой либо, по этому вроде все нормально у ТС'а
Avazart
 Аватар для Avazart
7037 / 5214 / 259
Регистрация: 10.12.2010
Сообщений: 22,917
Записей в блоге: 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     насколько это соответствует стандарту?
Еще ссылки по теме:

Какому типу переменной соответствует HANDLE? C++
C++ Пример динамического двумерного массива по стандарту C++, располагающегося в монолитном участке памяти
Значение, возвращаемое return, не соответствует ожиданиям C++
C++ Комментирование программ. Насколько это важно?
C++ Адаптация куска кода, написанного по стандарту C++11, под стандарт C++03

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

Или воспользуйтесь поиском по форуму:
go
Эксперт C++
3584 / 1364 / 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     насколько это соответствует стандарту?
Ответ Создать тему
Опции темы

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