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

C++

Войти
Регистрация
Восстановить пароль
 
skvor
640KB мне хватило на всё.
118 / 49 / 2
Регистрация: 07.06.2009
Сообщений: 442
#1

Для поля объекта запретить запись, но оставить чтение - C++

31.05.2011, 20:32. Просмотров 810. Ответов 3
Метки нет (Все метки)

Традиционное оформление объектов заключается в том, что поля-значения помещаются в private класса, а получение значений или модификация производятся через функции-интерфейсы. Если поля представляют сложную структуру, то относительные затраты на вызовы функций достаточно малы. Для простых данных типа int, очевидно, сам вызов функции будет на порядок дороже простого копирования.

Обойти использование функций можно было бы путем использования ссылок с модификатором const.

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
class A
{ private:
    int b;
  public:
    A(int i);
    const int *bb;
};
 
A::A(int i)
{ bb=&b;
  b=i;
}
 
int main(int argc, char *argv[], char *env[])
{ system("clear");
 
  A V(123);
  std::cout<<*(V.bb)<<std::endl;
  // *(V.bb)=234; // Присваивание не комплируется, это хорошо.
 
  int Error;
  V.bb=&Error; // А вот такая зараза возможна!
 
  return 0;
}
но здесь остаётся проблема с возможностью изменения самого указателя.

Вопрос - можно ли это решить. Попытки использования const указателей или ссылок, приводят к тому, что этот указатель нельзя инициализировать в конструкторе.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.05.2011, 20:32     Для поля объекта запретить запись, но оставить чтение
Посмотрите здесь:
C++ Чтение запись в разные поля union
Файловое чтение и запись данных для решения СЛАУ C++
C++ Как лучше запретить копирование объекта?
Работа с Security_Descriptor: запретить чтение семафора C++ WinAPI
[Файлы] Запись-чтение-запись. Почему не прокатывает? C++
C++ Builder Запретить изменение ширины конкретного поля (столбца) в ListView
Сохранение и чтение объекта класса в файл/из файла C++
Visual C++ Самоудаляются поля статического объекта класса
C++ Удаление поля объекта класса - corruption of the heap
Как обратиться к функции поля объекта из private'a C++
Чтение определенного поля в строке из файла C++
C++ Как получить полный адрес по имени поля объекта класса

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
asics
Freelance
Эксперт C++
2846 / 1783 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
31.05.2011, 21:23     Для поля объекта запретить запись, но оставить чтение #2
Вроде так
C++
1
2
3
4
5
6
7
8
9
10
11
12
class A
{ private:
    int b;
  public:
    A(int i);
    const int * const bb;
};
 
A::A(int i) : bb(&i)
{
  b=i;
}
skvor
640KB мне хватило на всё.
118 / 49 / 2
Регистрация: 07.06.2009
Сообщений: 442
31.05.2011, 22:08  [ТС]     Для поля объекта запретить запись, но оставить чтение #3
Цитата Сообщение от asics Посмотреть сообщение
: bb(&i)
Спасибо, работает. Решена проблема, над которой я плющил моск, наверное, год. Теперь хочу найти описание инициализации полей в классе. В моих книжках, чето такого нет.

И вот ещё подумалось, а существуют языки, в которых кроме private и public, есть разделы или синтаксис, который прямо указывает на разрешение записи и чтения полей данных. Т.е. такое описание, которое указывает на возможность использования поля класса в операторах присваивания слева и/или справа.

Добавлено через 15 минут
Чёрт, даже неловко, что я так тупил. Теперь можно вообще упростить тот быдлокод до использования ссылок вместо указателей.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class A
{ private:
    int b;
  public:
    A(int i) : bb(b), b(i) {}
    const int &bb;
};
 
int main(int argc, char *argv[], char *env[])
{ system("clear");
 
  A V(1234);
  std::cout<<V.bb<<std::endl; //Чтение возможно
  //V.bb=666; // Ура! Невозможно!
 
  return 0;
}
rangerx
1932 / 1541 / 141
Регистрация: 31.05.2009
Сообщений: 2,908
31.05.2011, 22:52     Для поля объекта запретить запись, но оставить чтение #4
Цитата Сообщение от skvor Посмотреть сообщение
И вот ещё подумалось, а существуют языки, в которых кроме private и public, есть разделы или синтаксис, который прямо указывает на разрешение записи и чтения полей данных. Т.е. такое описание, которое указывает на возможность использования поля класса в операторах присваивания слева и/или справа.
Это называется "свойства"(property). Подобное есть в С#, Delphi.
Yandex
Объявления
31.05.2011, 22:52     Для поля объекта запретить запись, но оставить чтение
Ответ Создать тему
Опции темы

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