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

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

Войти
Регистрация
Восстановить пароль
 
 
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
#1

Метод для изменения защищенного поля - C++

23.08.2012, 17:21. Просмотров 720. Ответов 16
Метки нет (Все метки)

Насколько безопастно данное издевательство решение?
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
25
26
#include <stdio.h>
 
class MYCLASS
{
private :
    int x;
public :
    MYCLASS() : x(23) {}
    int* Get()
    {
        return &x;
    }
    void Print()
    {
        printf("%d ", x);
    }
};
 
void main()
{
    MYCLASS tmp;
    int *b = tmp.Get();
    printf("%d ", *b);
    *b = 42;
    tmp.Print();
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.08.2012, 17:21     Метод для изменения защищенного поля
Посмотрите здесь:
C++ Один метод для изменения нескольких атрибутов в зависимости от параметра
Классы. Метод изменения длинны массива C++
C++ Перегрузка класса - после изменения кода перегрузить метод
C++ Разработка простейшего защищенного хранилища файлов
C++ Описать класс, содержщий два целочисленных поля, метод возвращающий сумму полей
C++ Выражение должно быть допустимым для изменения
C++ Как правильно составить условие для изменения?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Andsteadur
153 / 137 / 3
Регистрация: 23.05.2009
Сообщений: 275
23.08.2012, 17:25     Метод для изменения защищенного поля #2
Не понял о какой безопасности говорится, но с точки зрения ООП принципов это жесткое попрание принципа инкапсуляции.

Какой смысл вообще делать такой метод? Уж лучше сразу объявить член класса с public модификатором.
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
23.08.2012, 17:26     Метод для изменения защищенного поля #3
Именно издевательство. Работать будет, но... раз уж сделали переменную private, то делайте к ней get и set. И get по значению, а не по ссылке.
cmath
Модератор
2432 / 1651 / 133
Регистрация: 11.08.2012
Сообщений: 3,289
Завершенные тесты: 5
23.08.2012, 18:00     Метод для изменения защищенного поля #4
Цитата Сообщение от I.M. Посмотреть сообщение
раз уж сделали переменную private, то делайте к ней get и set
Цитирую из справочного руководства по C++:
Методы класса имют неограниченный доступ ко всем элементам класса независимо ни от порядка объявления элементов класса, ни от спецификатор доступа.
Не понял это
get по значению, а не по ссылке
а какая разница?
nexen если я правильно помню, спецификаторы доступа говорят компиллятору, где может быть использована переменная или метод. Спецификаторы private и protected ограничивают использование только внутри класса, public позволяет использовать методы и переменные вне класса. И если я правильно понял, методы public здесь использованы для доступа к элементу со спецификатором private. Я новичок конечно, но я не понял, чем такой способ доступа может быть не безопасен.
инкапсуляции
мне , как новичку, это интересно. Из того же справочника:
Инкапсуляция - прием ООП, заключающийся в сокрытии информации во внутренней структуре класса
Повторюсь, я новичок. Подскажите пожалуйста, в чем здесь попрание этого принципа? А то я не заметил
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
23.08.2012, 18:06     Метод для изменения защищенного поля #5
Hydrogen, ну как же - переменная объявлена внутри класса как private. Свободный доступ к ней должен быть только внутри класса. Чтобы был к ней доступ извне нужны соответствующие методы get и set. Более того, get должен возвращать только ее значение (никаких ссылок или указателей), чтобы изменять значение переменной извне можно было только через set.
cmath
Модератор
2432 / 1651 / 133
Регистрация: 11.08.2012
Сообщений: 3,289
Завершенные тесты: 5
23.08.2012, 18:11     Метод для изменения защищенного поля #6
Кстати в теме указано, что есть метод, изменяющий переменную (защищенную). Так вот, он где??? Ваши методы переменную не изменяют. Просто извлекают её значение.

Добавлено через 3 минуты
Цитата Сообщение от I.M. Посмотреть сообщение
никаких ссылок или указателей
Ясненько... Но не понятно, почему они должны иметь один спецификатор доступа?
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
23.08.2012, 18:11     Метод для изменения защищенного поля #7
это опасно. первое -
C++
1
MYCLASS tmp;
имя класса воспринимается в данном контексте интуитивно как какая-нибудь системная или библиотечная структура. существует некий "программистский жаргон", и его лучше придерживаться, если нет особых причин отклоняться.
второе - такое выделывать - коллеги могут морду набить (а вместе с первым - так вообще).
так что перепиши побезопаснее.
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
23.08.2012, 18:16     Метод для изменения защищенного поля #8
Hydrogen, не очень понял последний вопрос. В коде это выглядит примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class test
{
public:
    test():data_(42){}
    int get()
    {
        return data_;
    }
    void set(int data)
    {
        data_ = data;
    }
    void print()
    {
        std::cout << data_ << std::endl;//здесь доступ идет внутри класса, поэтому никаких get и set
    }
 
private:
    int data_;
};
cmath
Модератор
2432 / 1651 / 133
Регистрация: 11.08.2012
Сообщений: 3,289
Завершенные тесты: 5
23.08.2012, 18:22     Метод для изменения защищенного поля #9
Цитата Сообщение от novi4ok Посмотреть сообщение
tmp
Т. е. использование в качестве идентификатора tmp приводит к тому, что класс может быть воспринят как системная (библиотечная) структура? Каким образом? Кем или чем воспринят?
P.S. да есть "жаргон" выражающийся в использовании определенных например имен переменных (для int начинать писать с h (hWnd)), разве его придумали не для того, чтобы проще было читать чужой (впрочем и собственный) код?
Andsteadur
153 / 137 / 3
Регистрация: 23.05.2009
Сообщений: 275
23.08.2012, 18:23     Метод для изменения защищенного поля #10
Hydrogen,
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
25
26
#include <stdio.h>
 
class MYCLASS
{
private :
    int x;
public :
    MYCLASS() : x(23) {}
    int* Get()
    {
        return &x;
    }
    void Print()
    {
        printf("%d ", x);
    }
};
 
void main()
{
    MYCLASS tmp;
    int *b = tmp.Get();
    printf("%d ", *b);
    *b = 42;
    tmp.Print();
}
Здесь get возвращает указатель на участок памяти, поэтому мы можем изменить значение, которое хранится по адресу, на который указывает указатель. Собственно это и делается в строке 24. Такого быть не должно, ибо пользователь может таким образом ввести некорректные данные, и никакой обработки данных не будет.
Поэтому же не рекомендуется возвращать ссылку на закрытый член класса.
cmath
Модератор
2432 / 1651 / 133
Регистрация: 11.08.2012
Сообщений: 3,289
Завершенные тесты: 5
23.08.2012, 18:24     Метод для изменения защищенного поля #11
Цитата Сообщение от I.M. Посмотреть сообщение
Hydrogen, не очень понял последний вопрос. В коде это выглядит примерно так:
Я имел ввиду, почему переменная и метод, изменяющий ее значение, должны иметь один и тот же спецификатор доступа.
Andsteadur
153 / 137 / 3
Регистрация: 23.05.2009
Сообщений: 275
23.08.2012, 18:25     Метод для изменения защищенного поля #12
Цитата Сообщение от Hydrogen Посмотреть сообщение
Т. е. использование в качестве идентификатора tmp приводит к тому, что класс может быть воспринят как системная (библиотечная) структура? Каким образом? Кем или чем воспринят?
P.S. да есть "жаргон" выражающийся в использовании определенных например имен переменных (для int начинать писать с h (hWnd)), разве его придумали не для того, чтобы проще было читать чужой (впрочем и собственный) код?
Собственно novi4ok и имел ввиду, то что писать так просто "не принято". Читать такой код потом трудно.
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
23.08.2012, 18:28     Метод для изменения защищенного поля #13
Цитата Сообщение от Hydrogen Посмотреть сообщение
Т. е. использование в качестве идентификатора tmp приводит к тому, что класс может быть воспринят как системная (библиотечная) структура? Каким образом? Кем или чем воспринят?
P.S. да есть "жаргон" выражающийся в использовании определенных например имен переменных (для int начинать писать с h (hWnd)), разве его придумали не для того, чтобы проще было читать чужой (впрочем и собственный) код?
Вы не поняли, он говорил не про tmp, а про MYCLASS.

Цитата Сообщение от Hydrogen Посмотреть сообщение
Я имел ввиду, почему переменная и метод, изменяющий ее значение, должны иметь один и тот же спецификатор доступа.
Я такого не говорил, более того, из моего примера видно, что это не так. set заявлен как public, а data_ как private
cmath
Модератор
2432 / 1651 / 133
Регистрация: 11.08.2012
Сообщений: 3,289
Завершенные тесты: 5
23.08.2012, 18:34     Метод для изменения защищенного поля #14
Цитата Сообщение от Andsteadur Посмотреть сообщение
Собственно novi4ok и имел ввиду, то что писать так просто "не принято". Читать такой код потом трудно.
т.е. опасность в отлове ошибок при отладке. Если я понял правильно, то речь идет о другой безопасности (т.е. чтобы пользователь не имел возможности ошибку совершить, которая может привести к сбою)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.08.2012, 18:38     Метод для изменения защищенного поля
Еще ссылки по теме:
C++ Как выделить четные строки матрицы для изменения?
Выражение должно быть допустимым для изменения левосторонним значением C++
Выражение должно быть допустимым для изменения левосторонним значением C++
C++ Использование условий для изменения элементов массива и вывода их на экран

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

Или воспользуйтесь поиском по форуму:
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
23.08.2012, 18:38     Метод для изменения защищенного поля #15
Цитата Сообщение от Hydrogen Посмотреть сообщение
Т. е. использование в качестве идентификатора tmp приводит к тому, что класс может быть воспринят как системная (библиотечная) структура? Каким образом? Кем или чем воспринят?
P.S. да есть "жаргон" выражающийся в использовании определенных например имен переменных (для int начинать писать с h (hWnd)), разве его придумали не для того, чтобы проще было читать чужой (впрочем и собственный) код?
я написал "имя класса воспринимается", а не "имя переменной воспринимается".
с hWnd не потому, что int, а потому, что HANDLE
полностью заглавными буквами пишутся как правило или константы (определенные через #define, например), макро, системные/библиотечные структуры (например SYSTEMTIME). классы называются как правило похоже на это:
MyClass
CMyClass
Myclass
Yandex
Объявления
23.08.2012, 18:38     Метод для изменения защищенного поля
Ответ Создать тему
Опции темы

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