Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
activnaya
256 / 46 / 4
Регистрация: 24.11.2012
Сообщений: 466
#1

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

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

Комментирование программ. Насколько это важно?
Поделитесь собственным опытом.

Соответствует ли код стандарту?
Привет! Имеется следующий код (в очень урощенном виде) struct foo {}; int...

Инициализация по стандарту C++11
Здравствуйте ув. форумчане. Читаю Прата С. Язык программирования С++ Лекции...

Книга по стандарту с++ 11 для начинающих
Здравствуйте. В таможенной академии нам преподавали довольно древний язык...

Как писать код по стандарту
Извините, что создал тему скорей всего в неподходящей ветке. Но все же. Где-то...

11
0x10
2569 / 1749 / 287
Регистрация: 24.11.2012
Сообщений: 4,373
29.12.2012, 06:02 #2
Давайте для тупых: при чем тут стандарт и что конкретно смущает в коде?
0
activnaya
256 / 46 / 4
Регистрация: 24.11.2012
Сообщений: 466
29.12.2012, 06:06  [ТС] #3
поправочка
C++
1
void set (int* y) { *y = x; }
Добавлено через 1 минуту
Цитата Сообщение от 0x10 Посмотреть сообщение
Давайте для тупых: при чем тут стандарт и что конкретно смущает в коде?
изменение поля private одного объекта, методом вызова другого объекта.
0
Croessmah
++Ͻ
14376 / 8158 / 1534
Регистрация: 27.09.2012
Сообщений: 20,103
Записей в блоге: 3
Завершенные тесты: 1
29.12.2012, 06:08 #4
не знаю как на счет стандарта, но идея ООП нарушена. Зачем Вам приватная переменная, если Вы даете к ней доступ?
1
0x10
2569 / 1749 / 287
Регистрация: 24.11.2012
Сообщений: 4,373
29.12.2012, 06:09 #5
Вполне допустимо. Спецификаторы доступа всего лишь ограничвают возможность прямого обращения к полям объекта. В данном случае - вернули адрес, с помощью указателя делаем что хотим, все ок.
1
activnaya
256 / 46 / 4
Регистрация: 24.11.2012
Сообщений: 466
29.12.2012, 06:12  [ТС] #6
спасибо. Я уже поняла, что поле private это защита от собственных ошибок, а не внешних угроз. Иначе говоря единицей защиты является не объект, а тип.
0
Croessmah
++Ͻ
14376 / 8158 / 1534
Регистрация: 27.09.2012
Сообщений: 20,103
Записей в блоге: 3
Завершенные тесты: 1
29.12.2012, 06:16 #7
Цитата Сообщение от 0x10 Посмотреть сообщение
В данном случае - вернули адрес, с помощью указателя делаем что хотим, все ок.
Тем самым нарушив инкапсуляцию. Теперь можно с этой переменной делать все что угодно, а значит можно нарушить состояние объекта
0
0x10
2569 / 1749 / 287
Регистрация: 24.11.2012
Сообщений: 4,373
29.12.2012, 06:20 #8
activnaya, если хотите защититься в данном случае, используйте указатели на константу.

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

Добавлено через 2 минуты
а вообще все глобальней, ну как я в #6 писала.
0
Nixy
ComfyMobile
400 / 281 / 34
Регистрация: 24.07.2012
Сообщений: 916
29.12.2012, 07:01 #10
Цитата Сообщение от Croessmah Посмотреть сообщение
Тем самым нарушив инкапсуляцию. Теперь можно с этой переменной делать все что угодно, а значит можно нарушить состояние объекта
мб инкапсуляция нарушена, но я вот приват даю опасным полям, как массив, и обеспечиваю к ним доступ через get/set с проверкой индекса, по моему все логично, либо если переменной нужен обработчик какой либо, по этому вроде все нормально у ТС'а
0
Avazart
Эксперт С++
7706 / 5615 / 545
Регистрация: 10.12.2010
Сообщений: 25,215
Записей в блоге: 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 а не структура так что быстрее не будет...
0
go
Эксперт С++
3636 / 1368 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
16.01.2013, 00:38 #12
activnaya, вообще возвращая указатель стоит задуматься о добавлении спецификатора const.
Цитата Сообщение от activnaya Посмотреть сообщение
насколько это соответствует стандарту?
Лень лезть в стандарт. Но по моему ничего такого нет. Указатель валидный. int x; не объявлено как const.
Просто объект это что. Это как набор полей. Мы имеем указатель на объект. Как правиль зачастую первое поле это скрытый член указатель на vtable. Поэтому обычный метод в машинном представлении - это его адрес и при вызове мы просто делаем call(не jmp). У поля тоже есть адрес.

Добавлено через 3 минуты
Даже такой код прокатит. Но здесь все очевидно.http://ideone.com/5i96VN
0
16.01.2013, 00:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.01.2013, 00:38

Последняя официальная документация по стандарту СРР
Кто знает, где обитает последняя официальная документация по стандарту СРР ?

Адаптация куска кода, написанного по стандарту C++11, под стандарт C++03
есть код namespace cmd { inline auto get_size(const char *path)...

Пример динамического двумерного массива по стандарту C++, располагающегося в монолитном участке памяти
Помогите пожалуйста привести пример динамического двумерного массива n на m в...


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

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

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