powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Пятничные get-ы
25 сообщений из 40, страница 1 из 2
Пятничные get-ы
    #39652155
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у MS была такая неудобная штука, declspec(property), которая позволяла заводить псевдоним для переменной, к которому были привязаны set и get.

Так как get обычно штука простая, то я нашёл для себя делать так:

Код: plaintext
1.
2.
3.
4.
5.
publuc:
const CType& Type = m_type;

private:
CType m_type = 0;


Кто что думает по этому?
...
Рейтинг: 0 / 0
Пятничные get-ы
    #39652194
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMb,

показал бы как это работает, а то без поллитры тут явно не разберёшься
...
Рейтинг: 0 / 0
Пятничные get-ы
    #39652198
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)показал бы как это работает, а то без поллитры тут явно не разберёшься
Я так понимаю речь про readonly доступ к Type
Код: plaintext
1.
2.
publuc:
const CType& Type = m_type;
...
Рейтинг: 0 / 0
Пятничные get-ы
    #39652206
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMb,

const_cast'ом можно обойти read-only защиту.
Если сильно хочется, можно завести шаблонный класс Property и переопределить у него operator=() и operator T(), которому в конструкторе можно передавать лямбды-аксессоры, которые будут вызываться в этих операторах. До пропертей сисярпа/питона далеко.
...
Рейтинг: 0 / 0
Пятничные get-ы
    #39652222
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,
теперь понял, старею видимо

NekZ,
Ему просто нужна абстракция, что бы "не налететь". Обходы понятно всегда есть, главное что бы они были "видимые"
...
Рейтинг: 0 / 0
Пятничные get-ы
    #39652226
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NekZconst_cast'ом можно обойти read-only защиту.дело не в защите, дело в автоматике и удобстве, чтобы я по ошибке не написал в коде:
Код: plaintext
1.
Type = sometype;

и при это не надо было бы писать:
Код: plaintext
1.
sometype = GetType();

NekZЕсли сильно хочется, можно завести шаблонный класс PropertyИ так я тоже делаю, но у этой конструкции немного другой смысл.
NekZДо пропертей сисярпа/питона далеко.а чем они так уникальны?
...
Рейтинг: 0 / 0
Пятничные get-ы
    #39652237
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMb, я так и не понял - чего ты хочешь.
...
Рейтинг: 0 / 0
Пятничные get-ы
    #39652277
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev, я хочу переменную, которую:

1. можно писать-читать в классе и/или иерархии классов
2. можно только читать вне класса и/или иерархии классов

Т.е. более простой (синтаксически и по коду) аналог get-a. Read-only-представитель переменной наружу.

Ну и это, как бы, топик про исследование подходов к решению таких или подобных задач
...
Рейтинг: 0 / 0
Пятничные get-ы
    #39652283
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbдело не в защите, дело в автоматике и удобстве, чтобы я по ошибке не написал в коде:
Код: plaintext
1.
Type = sometype;

и при это не надо было бы писать:
Код: plaintext
1.
sometype = GetType();



Сложно, не распарсил.

CEMbNekZДо пропертей сисярпа/питона далеко.а чем они так уникальны?
Уникальны тем, что они уже есть в самой грамматике языка out-of-the-box, а также они имеют больше возможностей для создания DSL.
...
Рейтинг: 0 / 0
Пятничные get-ы
    #39652321
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMb, мне кацца, будто я уже показывал тебе подобный способ:
Код: plaintext
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.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
struct CType
{
  struct SET;

private:
  DWORD m;

  friend struct SET;

public:

  operator long ()
  {return *reinterpret_cast<long*>(&this->m);}
  
  operator unsigned long ()
  {return *reinterpret_cast<unsigned long*>(&this->m);}

  struct SET
  {
  private:
    
    operator CType& ();

  public:
    CType& operator = (long src)
    {
      CType & t = (CType&)(*this);
      *reinterpret_cast<long*>(&t.m) = src;
      return t;
    }
    
    CType& operator = (unsigned long src)
    {
      CType & t = (CType&)(*this);
      *reinterpret_cast<unsigned long*>(&t.m) = src;
      return t;
    }
  }
  set;

};

CType::SET::operator CType& ()
{
  constexpr size_t set_offset = (size_t)&reinterpret_cast<CType*>(0)->set;
  return *reinterpret_cast<CType*>((size_t)this - set_offset);
}

#pragma argsused
int __cdecl main(int argc, char* argv[])
{
  CType c;
  c.set = 0xFFFFFFFFUL;
  
  printf("c = %i", (long)c);
  return 0;
}
...
Рейтинг: 0 / 0
Пятничные get-ы
    #39652336
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Естественно, можно и так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
#pragma argsused
int __cdecl main(int argc, char* argv[])
{
  CType c;

  printf("c = %i", (long)(c.set = 0xFFFFFFFFUL));
  return 0;
}
...
Рейтинг: 0 / 0
Пятничные get-ы
    #39652971
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NekZУникальны тем, что они уже есть в самой грамматике языка out-of-the-box, а также они имеют больше возможностей для создания DSL.а что они конкретно умеют, в чём преимущество перед C++?

rdb_devCEMb, мне кацца, будто я уже показывал тебе подобный способ:Интересный вариант, но это немного перпендикулярно к тому, о чём я говорил. И вдобавок, это set, а не get. А ещё у тебя там пара кастов, которые можно было бы заменить шаблонной функцией? А вот последний оператор мне не понятен. Ну, т.е. понятно, что указатель на родительскую структуру вычисляется по смещению. А это надёжно? Не проще ли как-то в конструкторе в SET передать указатель/ссылку сразу?
...
Рейтинг: 0 / 0
Пятничные get-ы
    #39652999
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbа что они конкретно умеют, в чём преимущество перед C++?

Да хотя бы та же интроспекция в рантайме и создание новых типов "на лету".
...
Рейтинг: 0 / 0
Пятничные get-ы
    #39653036
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbИнтересный вариант, но это немного перпендикулярно к тому, о чём я говорил. И вдобавок, это set, а не get.Там и set есть... Приглядись повнимательней! Он в отдельной инкапсулированной структуре.

CEMbА ещё у тебя там пара кастов, которые можно было бы заменить шаблонной функцией?Да, конечно можно.

CEMbА вот последний оператор мне не понятен. Ну, т.е. понятно, что указатель на родительскую структуру вычисляется по смещению. А это надёжно?Конечно надёжно! Обычное взятие адреса и арифметика указателей... Никакого доступа к памяти по разыменованию указателя, приводившего бы к т.н. "неопределённому поведению" тут нет.
...
Рейтинг: 0 / 0
Пятничные get-ы
    #39653272
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devТам и set есть... Приглядись повнимательней! Он в отдельной инкапсулированной структуре.Нене, вот именно, я говорил про get только. И я говорил про отдельную переменную в классе, а у тебя пример про работу с самим классом через set.
...
Рейтинг: 0 / 0
Пятничные get-ы
    #39653299
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbНене, вот именно, я говорил про get только. И я говорил про отдельную переменную в классе, а у тебя пример про работу с самим классом через set.Так адаптируй пример под свою задачу. Делов-то... Просто я так точно и не понял, что именно, в итоге, ты хочешь получить и не сделал так, как ты хочешь. :)
...
Рейтинг: 0 / 0
Пятничные get-ы
    #39653659
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devТак адаптируй пример под свою задачу. Делов-то...так моё решение в одну строчку...

rdb_devПросто я так точно и не понял, что именно, в итоге, ты хочешь получить и не сделал так, как ты хочешь. :)я хотел сделать простой механизм для read-only, чтобы переменную извне можно было читать, но нельзя писать. Я сделал константную ссылку на закрытую переменную, т.е. сам класс может работать с переменной, а наружние могут только читать её через ссылку. И я хотел узнать, нет ли где ошибки в моём решении?
...
Рейтинг: 0 / 0
Пятничные get-ы
    #39653660
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMb,

Единственный минус, который я вижу - дополнительный указатель в каждом экзэмпляре подобного типа.

Для крупных типов это не проблема, а если тип мелкий и состоит из пары интов, то их размер вырастает на треть(а то и в половину).

И если таких эксзэмпляров миллион, то это 4(8)МБ дополнительной памяти.

И компилятор не имеет права выкинуть это поле, хотя пользоваться им, скорее всего, не будет.
...
Рейтинг: 0 / 0
Пятничные get-ы
    #39653661
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и лично для меня - это определяющий минус. я считаю, что держать в памяти бессмысленные данные нельзя, это повышает энтропию и приближает тепловую смерть вселенной
...
Рейтинг: 0 / 0
Пятничные get-ы
    #39653663
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devПросто я так точно и не понял, что именно, в итоге, ты хочешь получить и не сделал так, как ты хочешь. :)я хотел сделать простой механизм для read-only, чтобы переменную извне можно было читать, но нельзя писать. Я сделал константную ссылку на закрытую переменную, т.е. сам класс может работать с переменной, а наружние могут только читать её через ссылку. И я хотел узнать, нет ли где ошибки в моём решении?[/quot]Всего лишь? Я-то думал... :)
...
Рейтинг: 0 / 0
Пятничные get-ы
    #39653664
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex_kЕдинственный минус, который я вижу - дополнительный указатель в каждом экзэмпляре подобного типа.Какой дополнительный указатель?
...
Рейтинг: 0 / 0
Пятничные get-ы
    #39653670
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devКакой дополнительный указатель?
Который ссылка
...
Рейтинг: 0 / 0
Пятничные get-ы
    #39653673
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NekZrdb_devКакой дополнительный указатель?
Который ссылкаЗдесь тоже есть ссылка - prvalue оператора приведения типа:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
template <typename T>
CSafe struct
{
private:
  T safe;

public:
  CSafe();
  CSafe(T const & src) {safe = src;}
  operator T const &  () const {return *const_cast<T const *>(&safe);}
};
...
Рейтинг: 0 / 0
Пятничные get-ы
    #39654088
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbу MS была такая неудобная штука, declspec(property), которая позволяла заводить псевдоним для переменной, к которому были привязаны set и get.

Так как get обычно штука простая, то я нашёл для себя делать так:

Код: plaintext
1.
2.
3.
4.
5.
publuc:
const CType& Type = m_type;

private:
CType m_type = 0;


Кто что думает по этому?

Я думаю, что это нестандарт и must die.
(это про declspec(property), не про код)
...
Рейтинг: 0 / 0
Пятничные get-ы
    #39654623
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivЯ думаю, что это нестандарт и must die.Что именно?

Надо развернуть вопрос ширше

По-правильному мы держим все переменные в private-секции, чтобы чужие классы не могли без нашего ведома поменять их значение. А чтобы они могли, когда это нужно, надо завести пару функций, set и get. Тут начинается моё мнение: бездумное следование этому правилу приводит к ситуации, когда класс наполняют куча вырожденных set-ов и get-ов, которые просто присваивают значение и возвращают его, просто потому что так правильно. Поэтому я считаю, что когда ввод-вывод значения в переменную класса не нуждается в проверках - set и get делать ненужно, а просто сделать переменную public и, если надо, назвать соответствующе нотации.

Частный случай, когда никто кроме самого класса установить значение переменной не может, вместо get-а можно(?) использовать public const-ссылку на эту переменную, что я и написал в первом посте.
...
Рейтинг: 0 / 0
25 сообщений из 40, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Пятничные get-ы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]