Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.07.2015, 13:24   #1
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию Нарушение инкапсуляции

Всем доброго дня !

Столкнулся с такой бедой.

В классе Vita есть метод void hgh(int a) со спецификатором const

Код:
class Vita

{

private:

	int *x;

public:

	Vita() : x(new int(0)) {}

	Vita(int a) : x(new int(a)) {}

	Vita(const Vita &rhs) : x(new int(rhs.fvf())) {}

	~Vita()  {delete x;}

	int fvf() const { return *x;}

	void hgh(int a) const {*x = a;}
	
};
почему при выполнении операции *x = a; я не получаю ошибку ?

Ведь я же фактически меняю данные
RAFA91 вне форума Ответить с цитированием
Старый 14.07.2015, 13:31   #2
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

потому что, констом будет х (указатель), а не данные на которые он указывает.

ошибкой будет x = &a
f.hump вне форума Ответить с цитированием
Старый 14.07.2015, 13:36   #3
Helloween
Форумчанин
 
Регистрация: 24.04.2012
Сообщений: 300
По умолчанию

Проблема в том, что не понимаете разницу между
const int* x;
int const* x;
const int const* x;

В том то и дело, что меняете данные, указатель остается тот же.
Помог? Оставляем отзыв =)
Helloween вне форума Ответить с цитированием
Старый 14.07.2015, 14:27   #4
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

const int* x; - это указатель на константу
int const* x; - это константный указатель (в данном случае выполняется)
const int const* x; - это константный указатель на константу
RAFA91 вне форума Ответить с цитированием
Старый 16.07.2015, 12:48   #5
Helloween
Форумчанин
 
Регистрация: 24.04.2012
Сообщений: 300
По умолчанию

Садись, два! =)

const int* x;
int const* x;
const int const* x;
Это разные вариации записи одного и того же - указателя на const int.

константный указатель int* const int
константный указатель на константу:
int const* const x;
const int* const x;
const int const* const x;


все поля класса рассматриваются как const, а поле - указатель

в вашем случае будет int* const x - константный указатель, а не const int* x;
Помог? Оставляем отзыв =)
Helloween вне форума Ответить с цитированием
Старый 16.07.2015, 18:29   #6
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Цитата:
Сообщение от RAFA91 Посмотреть сообщение
Всем доброго дня !

Столкнулся с такой бедой.

В классе Vita есть метод void hgh(int a) со спецификатором const

Код:
class Vita

{

private:

	int *x;

public:

	Vita() : x(new int(0)) {}

	Vita(int a) : x(new int(a)) {}

	Vita(const Vita &rhs) : x(new int(rhs.fvf())) {}

	~Vita()  {delete x;}

	int fvf() const { return *x;}

	void hgh(int a) const {*x = a;}
	
};
почему при выполнении операции *x = a; я не получаю ошибку ?

Ведь я же фактически меняю данные
Вы фактически - изменили содержимое указателя класса на первый элемент, каким-то значением.., не указатель, содержимое указателя - не данные класса
Упадёт - если вызвать конструктор по умолчанию или если установите в конструкторе 0
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Старый 18.07.2015, 15:37   #7
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

Цитата:
Сообщение от Helloween Посмотреть сообщение
Садись, два! =)

const int* x;
int const* x;
const int const* x;
Это разные вариации записи одного и того же - указателя на const int.

константный указатель int* const int
константный указатель на константу:
int const* const x;
const int* const x;
const int const* const x;
и на какой так много записей ?

в практике достаточно 3

const int *p - указатель на константу

int *const p - конст. указатель

const int *const p - конст. указатель на конст.

___________________

если я напишу

Код:
class Vita

{

private:

	const int *x;
, то в методе

Код:
void hgh(int a) const {*x = a;}
получу ошибку
RAFA91 вне форума Ответить с цитированием
Старый 18.07.2015, 16:00   #8
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

У Вас пробелы в знании С++, функции тоже бывают const, тем самым изменении содержимого класса запрещено, хорошо помогает и стимулирует, при функциях get.

Код:
const type& getAt() const {  }
        type& getAt() {  }
эти функции совершено разные и компил не ругается.

одна используется
Код:
type i = getAt();
другая
Код:
getAt() = <значение>;
данные указателя не данные класса и функция даёт добро.

ЗЫ:

Можете посмотреть копирование типо strcpy()
Удевитесь, там одни консты, и никому не страшно от этого,
инкременируют как хотят
Если помог, тут весы есть , Вам не сложно, а мне приятно.

Последний раз редактировалось Perchik71; 18.07.2015 в 16:02.
Perchik71 вне форума Ответить с цитированием
Старый 19.07.2015, 16:24   #9
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

Код:
const type& getAt() const {  }
        type& getAt() {  }
напомнила оператор индексирования
RAFA91 вне форума Ответить с цитированием
Старый 19.07.2015, 19:11   #10
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Цитата:
Сообщение от RAFA91 Посмотреть сообщение
напомнила оператор индексирования
Кстати их тоже может быть 2 Вообще, чем больше в объекте инструментов для его использования, тем лучше, ещё лучше если это обвёрнуто в операторы.
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нарушение параллелизма: DELETECOMMAND fisher79ru C# (си шарп) 0 01.06.2015 01:13
Нарушение прав доступа Negent Общие вопросы C/C++ 2 19.07.2014 01:44
Нарушение профиля HellMercenariess О форуме и сайтах клуба 6 25.08.2012 11:43
Проявление инкапсуляции ddr9225 Общие вопросы C/C++ 9 28.01.2010 00:06
Нарушение доступа Perception Помощь студентам 9 11.07.2008 14:44