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

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

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

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

23.08.2012, 17:21. Просмотров 735. Ответов 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();
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.08.2012, 17:21
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Метод для изменения защищенного поля (C++):

Один метод для изменения нескольких атрибутов в зависимости от параметра - C++
Всем привет. Хочу написать метод в классе, который в качестве параметра принимает 2 аргумента. Один соответствует атрибуту, другой...

Класс vector (поля: координаты, 2 конструктора, метод нахождения длины вектора и метод вывода координат на экран) - C++
Здравствуйте , помогите пожалуйста с заданием. Организовать класс Вектор на плоскости – поля: координаты, 2 конструктора, метод...

Классы. Метод изменения длинны массива - C++
Начал изучать классы. Захотел сделать массив с изменяющимся размером. если я ставлю размер меньше 5, то в ячейках оказывается мусор. ...

Перегрузка класса - после изменения кода перегрузить метод - C++
class DrawPoint : public QWidget { public: DrawPoint(QWidget *p = 0) : QWidget(p){} protected: virtual void...

Разработка простейшего защищенного хранилища файлов - C++
Добрый день. У меня курсовая работа, а тема: создание защищенного хранилища файлов. Ничего сверхсложного быть не должно:...

Исследовать итерационный метод- метод касательных для решения нелинейных уравнений - C++
прочитал много всего , но сам пример реализовать никак не могу , кто может помогите F(x) = x5+5x+1=0 с...

16
Andsteadur
153 / 137 / 3
Регистрация: 23.05.2009
Сообщений: 275
23.08.2012, 17:25 #2
Не понял о какой безопасности говорится, но с точки зрения ООП принципов это жесткое попрание принципа инкапсуляции.

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

Добавлено через 3 минуты
Цитата Сообщение от I.M. Посмотреть сообщение
никаких ссылок или указателей
Ясненько... Но не понятно, почему они должны иметь один спецификатор доступа?
1
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
23.08.2012, 18:11 #7
это опасно. первое -
C++
1
MYCLASS tmp;
имя класса воспринимается в данном контексте интуитивно как какая-нибудь системная или библиотечная структура. существует некий "программистский жаргон", и его лучше придерживаться, если нет особых причин отклоняться.
второе - такое выделывать - коллеги могут морду набить (а вместе с первым - так вообще).
так что перепиши побезопаснее.
1
I.M.
565 / 548 / 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_;
};
0
cmath
Модератор
2439 / 1679 / 133
Регистрация: 11.08.2012
Сообщений: 3,335
Завершенные тесты: 6
23.08.2012, 18:22 #9
Цитата Сообщение от novi4ok Посмотреть сообщение
tmp
Т. е. использование в качестве идентификатора tmp приводит к тому, что класс может быть воспринят как системная (библиотечная) структура? Каким образом? Кем или чем воспринят?
P.S. да есть "жаргон" выражающийся в использовании определенных например имен переменных (для int начинать писать с h (hWnd)), разве его придумали не для того, чтобы проще было читать чужой (впрочем и собственный) код?
0
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. Такого быть не должно, ибо пользователь может таким образом ввести некорректные данные, и никакой обработки данных не будет.
Поэтому же не рекомендуется возвращать ссылку на закрытый член класса.
1
cmath
Модератор
2439 / 1679 / 133
Регистрация: 11.08.2012
Сообщений: 3,335
Завершенные тесты: 6
23.08.2012, 18:24 #11
Цитата Сообщение от I.M. Посмотреть сообщение
Hydrogen, не очень понял последний вопрос. В коде это выглядит примерно так:
Я имел ввиду, почему переменная и метод, изменяющий ее значение, должны иметь один и тот же спецификатор доступа.
0
Andsteadur
153 / 137 / 3
Регистрация: 23.05.2009
Сообщений: 275
23.08.2012, 18:25 #12
Цитата Сообщение от Hydrogen Посмотреть сообщение
Т. е. использование в качестве идентификатора tmp приводит к тому, что класс может быть воспринят как системная (библиотечная) структура? Каким образом? Кем или чем воспринят?
P.S. да есть "жаргон" выражающийся в использовании определенных например имен переменных (для int начинать писать с h (hWnd)), разве его придумали не для того, чтобы проще было читать чужой (впрочем и собственный) код?
Собственно novi4ok и имел ввиду, то что писать так просто "не принято". Читать такой код потом трудно.
0
I.M.
565 / 548 / 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
0
cmath
Модератор
2439 / 1679 / 133
Регистрация: 11.08.2012
Сообщений: 3,335
Завершенные тесты: 6
23.08.2012, 18:34 #14
Цитата Сообщение от Andsteadur Посмотреть сообщение
Собственно novi4ok и имел ввиду, то что писать так просто "не принято". Читать такой код потом трудно.
т.е. опасность в отлове ошибок при отладке. Если я понял правильно, то речь идет о другой безопасности (т.е. чтобы пользователь не имел возможности ошибку совершить, которая может привести к сбою)
0
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
0
23.08.2012, 18:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.08.2012, 18:38
Привет! Вот еще темы с ответами:

Метод деления отрезка пополам для решения нелинейных уравнений (метод дихотомии) - C++
Здравствуйте. Помогите пожалуйста дописать программу. Вот что вымучал, но на сдаче завалили, типо нет вывода корней, не рассмотрены...

Производный класс: метод возведения в произвольную степень, и метод для вычисления логарифма числа - C++
Реализовать класс-оболочку Number для числового типа float. Реализовать методы сложения и деления. Создать производный класс Real, в...

Описать класс, содержщий два целочисленных поля, метод возвращающий сумму полей - C++
помогите пожалуйсто....осень надо((((((((((((( Описать класс содержщий два целочисленных поля, метод возвращающий сумму этих...

СЛАУ. Метод обратной матрицы, метод Гаусса, метод Крамера, метод Зейделя - C++
Помогите ребят. Не могу построить алгоритмы для этих методов Язык C++


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

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

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