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

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

Восстановить пароль Регистрация
 
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
23.08.2012, 17:21     Метод для изменения защищенного поля #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
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++ Производный класс: метод возведения в произвольную степень, и метод для вычисления логарифма числа
Класс vector (поля: координаты, 2 конструктора, метод нахождения длины вектора и метод вывода координат на экран) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Andsteadur
152 / 136 / 3
Регистрация: 23.05.2009
Сообщений: 275
23.08.2012, 17:25     Метод для изменения защищенного поля #2
Не понял о какой безопасности говорится, но с точки зрения ООП принципов это жесткое попрание принципа инкапсуляции.

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

Добавлено через 3 минуты
Цитата Сообщение от I.M. Посмотреть сообщение
никаких ссылок или указателей
Ясненько... Но не понятно, почему они должны иметь один спецификатор доступа?
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
23.08.2012, 18:11     Метод для изменения защищенного поля #7
это опасно. первое -
C++
1
MYCLASS tmp;
имя класса воспринимается в данном контексте интуитивно как какая-нибудь системная или библиотечная структура. существует некий "программистский жаргон", и его лучше придерживаться, если нет особых причин отклоняться.
второе - такое выделывать - коллеги могут морду набить (а вместе с первым - так вообще).
так что перепиши побезопаснее.
I.M.
 Аватар для 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
Модератор
 Аватар для cmath
2415 / 1634 / 132
Регистрация: 11.08.2012
Сообщений: 3,252
Завершенные тесты: 5
23.08.2012, 18:22     Метод для изменения защищенного поля #9
Цитата Сообщение от novi4ok Посмотреть сообщение
tmp
Т. е. использование в качестве идентификатора tmp приводит к тому, что класс может быть воспринят как системная (библиотечная) структура? Каким образом? Кем или чем воспринят?
P.S. да есть "жаргон" выражающийся в использовании определенных например имен переменных (для int начинать писать с h (hWnd)), разве его придумали не для того, чтобы проще было читать чужой (впрочем и собственный) код?
Andsteadur
152 / 136 / 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
Модератор
 Аватар для cmath
2415 / 1634 / 132
Регистрация: 11.08.2012
Сообщений: 3,252
Завершенные тесты: 5
23.08.2012, 18:24     Метод для изменения защищенного поля #11
Цитата Сообщение от I.M. Посмотреть сообщение
Hydrogen, не очень понял последний вопрос. В коде это выглядит примерно так:
Я имел ввиду, почему переменная и метод, изменяющий ее значение, должны иметь один и тот же спецификатор доступа.
Andsteadur
152 / 136 / 3
Регистрация: 23.05.2009
Сообщений: 275
23.08.2012, 18:25     Метод для изменения защищенного поля #12
Цитата Сообщение от Hydrogen Посмотреть сообщение
Т. е. использование в качестве идентификатора tmp приводит к тому, что класс может быть воспринят как системная (библиотечная) структура? Каким образом? Кем или чем воспринят?
P.S. да есть "жаргон" выражающийся в использовании определенных например имен переменных (для int начинать писать с h (hWnd)), разве его придумали не для того, чтобы проще было читать чужой (впрочем и собственный) код?
Собственно novi4ok и имел ввиду, то что писать так просто "не принято". Читать такой код потом трудно.
I.M.
 Аватар для 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
Модератор
 Аватар для cmath
2415 / 1634 / 132
Регистрация: 11.08.2012
Сообщений: 3,252
Завершенные тесты: 5
23.08.2012, 18:34     Метод для изменения защищенного поля #14
Цитата Сообщение от Andsteadur Посмотреть сообщение
Собственно novi4ok и имел ввиду, то что писать так просто "не принято". Читать такой код потом трудно.
т.е. опасность в отлове ошибок при отладке. Если я понял правильно, то речь идет о другой безопасности (т.е. чтобы пользователь не имел возможности ошибку совершить, которая может привести к сбою)
novi4ok
549 / 502 / 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
cmath
Модератор
 Аватар для cmath
2415 / 1634 / 132
Регистрация: 11.08.2012
Сообщений: 3,252
Завершенные тесты: 5
23.08.2012, 18:44     Метод для изменения защищенного поля #16
Цитата Сообщение от novi4ok Посмотреть сообщение
с hWnd не потому, что int, а потому, что HANDLE
hWnd согласен неудачно (хотя HANDLE по сути целое число собой представляет), а про класс мне уже разъяснили. Про безопасность у нас с вами разночтение получается.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.08.2012, 19:55     Метод для изменения защищенного поля
Еще ссылки по теме:

C++ Разработка простейшего защищенного хранилища файлов
Классы. Метод изменения длинны массива C++
C++ Как правильно составить условие для изменения?

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

Или воспользуйтесь поиском по форуму:
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
23.08.2012, 19:55     Метод для изменения защищенного поля #17
Цитата Сообщение от Hydrogen Посмотреть сообщение
hWnd согласен неудачно (хотя HANDLE по сути целое число собой представляет), а про класс мне уже разъяснили. Про безопасность у нас с вами разночтение получается.
никакого разночтения. чем гибче возможности языка, тем больше соблазн использовать какие-нибудь фокусы, при этом уговаривая себя, что это есть хорошо.
просто пойми смысл в этом private: это вещи, которые снаружи недоступные. не потому, что кто-то с нехорошей целью возьмет и изменит (возможности языка позволяют и это сделать. грохнуть можно что угодно), а в том, чтоб и самому было понятно, что относится к интерфейсу, а что - к "внутренним органам", в которые снаружи нечего лазить даже хирургам.
не знаю, чего ты в книжках начитался, но вот такое вот:
C++
1
2
3
4
5
private:
 int m_BolshojSekret;
public:
 int getBolshojSekret() { return BolshojSekret; }
 void setBolshojSekret(int bs) { BolshojSekret = bs; }
не есть "объектно-ориентированность", "инкапсуляция" или что-нибудь подобное. это - профанация концепции.
смысл более понятет здесь:
C++
1
2
3
4
5
6
7
8
9
private:
 int m_PolSekreta;
 int m_Esh4oPolSekreta;
 int m_AHerTebe;
public:
 int getBolshojSekret() { return m_AHerTebe; }
 int getBolshojSekret(char *pParol) { return ::strcmp (pParol, "parol") == 0 ? 
                       m_PolSekreta | m_Esh4oPolSekreta : m_AHerTebe; }
 void setSekret(int s) { m_PolSekreta = s & 0xffff0000; m_Esh4oPolSekreta = s & 0x0000ffff;}
Yandex
Объявления
23.08.2012, 19:55     Метод для изменения защищенного поля
Ответ Создать тему
Опции темы

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