Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Пятничные get-ы / 25 сообщений из 40, страница 1 из 2
30.05.2018, 05:34
    #39652155
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничные get-ы
у 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
30.05.2018, 08:22
    #39652194
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничные get-ы
CEMb,

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

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

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

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

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

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

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

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

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



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

CEMbNekZДо пропертей сисярпа/питона далеко.а чем они так уникальны?
Уникальны тем, что они уже есть в самой грамматике языка out-of-the-box, а также они имеют больше возможностей для создания DSL.
...
Рейтинг: 0 / 0
30.05.2018, 11:12
    #39652321
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничные get-ы
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
30.05.2018, 11:26
    #39652336
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничные get-ы
Естественно, можно и так:
Код: 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
31.05.2018, 05:23
    #39652971
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничные get-ы
NekZУникальны тем, что они уже есть в самой грамматике языка out-of-the-box, а также они имеют больше возможностей для создания DSL.а что они конкретно умеют, в чём преимущество перед C++?

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

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

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

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

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

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

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

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

И компилятор не имеет права выкинуть это поле, хотя пользоваться им, скорее всего, не будет.
...
Рейтинг: 0 / 0
01.06.2018, 05:19
    #39653661
alex_k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничные get-ы
ну и лично для меня - это определяющий минус. я считаю, что держать в памяти бессмысленные данные нельзя, это повышает энтропию и приближает тепловую смерть вселенной
...
Рейтинг: 0 / 0
01.06.2018, 05:23
    #39653663
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничные get-ы
rdb_devПросто я так точно и не понял, что именно, в итоге, ты хочешь получить и не сделал так, как ты хочешь. :)я хотел сделать простой механизм для read-only, чтобы переменную извне можно было читать, но нельзя писать. Я сделал константную ссылку на закрытую переменную, т.е. сам класс может работать с переменной, а наружние могут только читать её через ссылку. И я хотел узнать, нет ли где ошибки в моём решении?[/quot]Всего лишь? Я-то думал... :)
...
Рейтинг: 0 / 0
01.06.2018, 05:26
    #39653664
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничные get-ы
alex_kЕдинственный минус, который я вижу - дополнительный указатель в каждом экзэмпляре подобного типа.Какой дополнительный указатель?
...
Рейтинг: 0 / 0
01.06.2018, 06:29
    #39653670
NekZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничные get-ы
rdb_devКакой дополнительный указатель?
Который ссылка
...
Рейтинг: 0 / 0
01.06.2018, 07:06
    #39653673
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничные get-ы
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
01.06.2018, 15:57
    #39654088
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничные get-ы
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
04.06.2018, 05:20
    #39654623
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничные get-ы
MasterZivЯ думаю, что это нестандарт и must die.Что именно?

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

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

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


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