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

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

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

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

29.12.2012, 05:53. Просмотров 532. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос насколько это соответствует стандарту? (C++):

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

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

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

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

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

Адаптация куска кода, написанного по стандарту C++11, под стандарт C++03 - C++
есть код namespace cmd { inline auto get_size(const char *path) -&gt; decltype( std::declval&lt;struct dSTATE64&gt;().st_size ) ...

11
0x10
2479 / 1654 / 248
Регистрация: 24.11.2012
Сообщений: 4,097
29.12.2012, 06:02 #2
Давайте для тупых: при чем тут стандарт и что конкретно смущает в коде?
0
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 одного объекта, методом вызова другого объекта.
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
29.12.2012, 06:08 #4
не знаю как на счет стандарта, но идея ООП нарушена. Зачем Вам приватная переменная, если Вы даете к ней доступ?
1
0x10
2479 / 1654 / 248
Регистрация: 24.11.2012
Сообщений: 4,097
29.12.2012, 06:09 #5
Вполне допустимо. Спецификаторы доступа всего лишь ограничвают возможность прямого обращения к полям объекта. В данном случае - вернули адрес, с помощью указателя делаем что хотим, все ок.
1
activnaya
255 / 45 / 2
Регистрация: 24.11.2012
Сообщений: 466
29.12.2012, 06:12  [ТС] #6
спасибо. Я уже поняла, что поле private это защита от собственных ошибок, а не внешних угроз. Иначе говоря единицей защиты является не объект, а тип.
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
29.12.2012, 06:16 #7
Цитата Сообщение от 0x10 Посмотреть сообщение
В данном случае - вернули адрес, с помощью указателя делаем что хотим, все ок.
Тем самым нарушив инкапсуляцию. Теперь можно с этой переменной делать все что угодно, а значит можно нарушить состояние объекта
0
0x10
2479 / 1654 / 248
Регистрация: 24.11.2012
Сообщений: 4,097
29.12.2012, 06:20 #8
activnaya, если хотите защититься в данном случае, используйте указатели на константу.

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

Добавлено через 2 минуты
а вообще все глобальней, ну как я в #6 писала.
0
Nixy
ComfyMobile
400 / 281 / 8
Регистрация: 24.07.2012
Сообщений: 916
29.12.2012, 07:01 #10
Цитата Сообщение от Croessmah Посмотреть сообщение
Тем самым нарушив инкапсуляцию. Теперь можно с этой переменной делать все что угодно, а значит можно нарушить состояние объекта
мб инкапсуляция нарушена, но я вот приват даю опасным полям, как массив, и обеспечиваю к ним доступ через get/set с проверкой индекса, по моему все логично, либо если переменной нужен обработчик какой либо, по этому вроде все нормально у ТС'а
0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,048
Записей в блоге: 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
Эксперт С++
3586 / 1366 / 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
0
16.01.2013, 00:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.01.2013, 00:38
Привет! Вот еще темы с ответами:

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

как соединить b и с в число, если а это число, б это десятки перевернутого числа, с это единицы перевернутого числа вот в это строчке c=a+b,c; - C++
как соединить b и с в число, если а это число, б это десятки перевернутого числа, с это единицы перевернутого числа вот в это строчке...

Число 65,41 представлено у форматі чисел із плаваючою крапкою стандарту IEEE 754 з одинарною точністю - C++
Число 65,41 представлено у форматі чисел із плаваючою крапкою стандарту IEEE 754 з одинарною точністю. Наведіть двійкове подання експоненти...

Зачем биты нужны это меньше байтов но int 32 бита но я не допер зачем это нужно это 4 байта то есть int не может больше 4 байт весить? - C++
Вот еще один вопрос зачем биты нужны это меньше байтов но int 32 бита но я не допер зачем это нужно это 4 байта то есть int не может...


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

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

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