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

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

Восстановить пароль Регистрация
 
skvor
640KB мне хватило на всё.
118 / 49 / 2
Регистрация: 07.06.2009
Сообщений: 442
31.05.2011, 20:32     Для поля объекта запретить запись, но оставить чтение. #1
Традиционное оформление объектов заключается в том, что поля-значения помещаются в 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++
Запись содержимого объекта в файл C++
Visual C++ Самоудаляются поля статического объекта класса
C++ Как получить полный адрес по имени поля объекта класса
C++ Удаление поля объекта класса - corruption of the heap
C++ Как лучше запретить копирование объекта?
C++ Builder Запретить изменение ширины конкретного поля (столбца) в ListView
Работа с Security_Descriptor: запретить чтение семафора C++ WinAPI
Как обратиться к функции поля объекта из private'a C++
C++ Чтение запись в разные поля union
Файловое чтение и запись данных для решения СЛАУ C++
Чтение определенного поля в строке из файла C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
asics
Freelance
Эксперт C++
 Аватар для asics
2841 / 1778 / 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
1918 / 1527 / 139
Регистрация: 31.05.2009
Сообщений: 2,886
31.05.2011, 22:52     Для поля объекта запретить запись, но оставить чтение. #4
Цитата Сообщение от skvor Посмотреть сообщение
И вот ещё подумалось, а существуют языки, в которых кроме private и public, есть разделы или синтаксис, который прямо указывает на разрешение записи и чтения полей данных. Т.е. такое описание, которое указывает на возможность использования поля класса в операторах присваивания слева и/или справа.
Это называется "свойства"(property). Подобное есть в С#, Delphi.
Yandex
Объявления
31.05.2011, 22:52     Для поля объекта запретить запись, но оставить чтение.
Ответ Создать тему
Опции темы

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