powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Пятничные get-ы
40 сообщений из 40, показаны все 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
Пятничные get-ы
    #39654711
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbТут начинается моё мнение: бездумное следование этому правилу приводит к ситуации, когда класс наполняют куча вырожденных set-ов и get-ов, которые просто присваивают значение и возвращают его, просто потому что так правильно.

Это значит, что эти данные не должны принадлежать этому классу. Он их просто хранит для кого-то. А если они ему не нужны, то их у него надо забрать.
...
Рейтинг: 0 / 0
Пятничные get-ы
    #39654745
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbА чтобы они могли, когда это нужно, надо завести пару функций, set и get. Тут начинается моё мнение: бездумное следование этому правилу приводит к ситуации, когда класс наполняют куча вырожденных set-ов и get-ов, которые просто присваивают значение и возвращают его, просто потому что так правильно. Поэтому я считаю, что когда ввод-вывод значения в переменную класса не нуждается в проверках - set и get делать ненужно, а просто сделать переменную public и, если надо, назвать соответствующе нотации.

Частный случай, когда никто кроме самого класса установить значение переменной не может, вместо get-а можно(?) использовать public const-ссылку на эту переменную, что я и написал в первом посте.так-то оно вроде так, когда местечковый класс пишешь. Но вот когда твой код уходит в виде либы начинаются ходьбы по граблям из-за бинарной несовместимости. Я бы не очень обрадовался если бы какой-то разраб каждый раз интерфейсы менял на свою динамическую либу.
Поясню: для динамичекой либы, в идеале, вообще не должно быть ситуаций с вычислением смещения полей класса (когда даёшь доступ к полям напрямую), т.е. полупустой метод для установки это необходимое зло для обеспечения совместимости.

Кроме того set-метод обычно используется для создания триггера, т.е. каких-то действий при установке поля.
...
Рейтинг: 0 / 0
Пятничные get-ы
    #39654770
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)Поясню: для динамичекой либы, в идеале, вообще не должно быть ситуаций с вычислением смещения полей класса (когда даёшь доступ к полям напрямую)Это один из самых смертных грехов. За такое сразу в ад - на "1С Платформу" пожизненно.
...
Рейтинг: 0 / 0
Пятничные get-ы
    #39655302
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex_kЭто значит, что эти данные не должны принадлежать этому классу. Он их просто хранит для кого-то. А если они ему не нужны, то их у него надо забрать.а кому их отдать? Я имел ввиду неконтролируемые значения.
kealon(Ruslan)Поясню: для динамичекой либы, в идеале, вообще не должно быть ситуаций с вычислением смещения полей класса (когда даёшь доступ к полям напрямую)Не понял про вычисление смещения полей. Это про DLL речь?
rdb_devЭто один из самых смертных грехов. За такое сразу в ад - на "1С Платформу" пожизненно.О чём речь?
kealon(Ruslan)Кроме того set-метод обычно используется для создания триггера, т.е. каких-то действий при установке поля.Ну с этим случаем всё ясно, я про это упоминал.
...
Рейтинг: 0 / 0
Пятничные get-ы
    #39655317
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbа кому их отдать? Я имел ввиду неконтролируемые значения.
я тоже.
Если класс не контролирует эти значения, значит они ему не нужны. Просто, кто то приходит и кладет их. Кто то приходит и берет. А временем жизни управляет класс. Это неправильно.
Классу нужно обладать теми данными, которые он использует.

Это допустимо, если вся суть этого класса - хранить эти значения. Типа настройки какие то. Но тогда тут достаточно и структуры, рид онли которой достигается константностью ссылки на нее. Или сделать константные поля, инициализирующиеся в конструкторе.

Возьмем класс std::string. у него есть геттеры, типа size(). Но они не возвращают значение внутреннего поля, они возвращают размер строки. Это большая разница. Да, размер строки может быть записан во внутреннем поле и size вернет это значение, но для потребителя интерфейса это неважно. Его интересует размер строки, а не содержимое поля.

std::string предоставляет геттер data(). Дата возвращает указатель на последовательное расположение символов строки. И, скорее всего, этот указатель будет указывать память, в которой строка хранит свои символы. Но потребителю строки не нужен указатель на эту память. Ему нужен указатель на символы строки.

Поэтому геттеры и сеттеры у класса - это не способ записать/прочитать значение в поле объекта. Это способ повлиять на состояние или выяснить текущее состояние объекта. Только так нужно об этом думать. А в таком случае - прямой доступ к полю допустим в частном случае реализации, которая может измениться и интерфейс придется поменять. Потребители интерфейса не обрадуются :)
...
Рейтинг: 0 / 0
Пятничные get-ы
    #39655323
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbkealon(Ruslan)Поясню: для динамичекой либы, в идеале, вообще не должно быть ситуаций с вычислением смещения полей класса (когда даёшь доступ к полям напрямую)Не понял про вычисление смещения полей. Это про DLL речь?да
Вот, например, ты объявил класс, его реалиация ушла в dll. Оставляя паблик-поля ты "заставляешь" компилятор при обращении к ним жёстко прописывать смещение, а если пользуешься методом, то он будет сцеплен по имени.
...
Рейтинг: 0 / 0
Пятничные get-ы
    #39655326
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex_kТолько так нужно об этом думать.Ну вот не согласен. Так нужно думать, но это 100% случаев. Это был бы идеальный вариант, как телевизор: нажал одну кнопку, внутри произошло N невидимых процессов, телевизор включился, переключился на последний используемый канал, включил последнюю используемую громкость, и так далее. И всё одним простым методом. Это идеальный вариант, для совсем конечного пользователя. Программер, который делает пульт от телевизора, должен иметь больше прямого доступа к телевизору. А программер, который делает точку ИК-приёмника и обработку - ещё больше. И так далее.
Или вот ещё пример, делаю я игру с N объектов. Чтобы объект двигался, мне надо сделать функцию Go(), к примеру, внутрь класса засунуть x, y, z чтобы их никто не видел. Ок. Но тут мне надо посчитать коллизии, чтобы повлиять на движение. Если это объекты одного класса, то всё ок, а если разных? Тогда надо кому-то делать GetX, GetY, GetZ, потому что по всем координатам разные проверки. А если объект словил пулю другого класса? А если объект нашёл что-то, тоже другого класса? А если ветер (другого класса) подул - мне приходится постоянно пользоваться get-ами, потом set-ами. Это всё правильно по науке. Но вот, например, с учётом того, что в Debug версии нет inline - оно всё будет тормозить, а ещё мне тяжко будет в IDE во внутреннем цикле обработки мышкой быстро глянуть значение переменных - надо будет сначала залезть в QuickWatch самого объекта, потом по иерархии долго шарить в поисках нужных для просмотра переменных...
Не, я, конечно, утрирую, таких доступов к переменным бывает немного, но если в классе самих переменных много, много условных обработок - получается много кода на set/get.
alex_kЭто допустимо, если вся суть этого класса - хранить эти значения.почему вся? Данные могут логически быть связаны с классом, при этом никак не ограничиваться самим классом.
Вот пыль на телевизоре - она связана с телевизором, но стереть её может кто угодно, без использования set. В случае переноса телевизора - пыль перенесётся вместе с ним. Количество пыли самим телевизором никак не ограничивается(нет set с проверками), но собирает пыль на себя именно телевизор, т.е. нельзя сказать, что пыль связана с каким-то другим классом.
...
Рейтинг: 0 / 0
Пятничные get-ы
    #39655328
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)Оставляя паблик-поля ты "заставляешь" компилятор при обращении к ним жёстко прописывать смещение, а если пользуешься методом, то он будет сцеплен по имени.Ага, ясно.
...
Рейтинг: 0 / 0
Пятничные get-ы
    #39655341
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbrdb_devЭто один из самых смертных грехов. За такое сразу в ад - на "1С Платформу" пожизненно.О чём речь?Речь о способе доступа к членам экземпляра класса, ссылку или указатель на который возвращает библиотечная функция. Любой доступ к членам такого объекта должен осуществляться исключительно через виртуальные методы интерфейсного класса.
...
Рейтинг: 0 / 0
Пятничные get-ы
    #39655839
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devCEMbпропущено...
О чём речь?Речь о способе доступа к членам экземпляра класса, ссылку или указатель на который возвращает библиотечная функция. Любой доступ к членам такого объекта должен осуществляться исключительно через виртуальные методы интерфейсного класса.а я вот насчёт виртуальных методов не совсем согласен, статические лучше.
Для виртуальных компилятору придётся вставлять в код смещение метода из VMT, что запретит менять порядок методов, а со статикой таких проблем нету
...
Рейтинг: 0 / 0
Пятничные get-ы
    #39655854
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)а я вот насчёт виртуальных методов не совсем согласен, статические лучше.
Для виртуальных компилятору придётся вставлять в код смещение метода из VMT, что запретит менять порядок методов, а со статикой таких проблем нетуПо-моему, ты не совсем понял о чем идет речь. Использование библиотечных функций как статических методов класса вырождается в обычный Си-подобный API с передачей явной передачей указателя на структуру, а заголовочный файл, описывающий такой интерфейс будет выглядеть более громоздко и менее понятно.
...
Рейтинг: 0 / 0
Пятничные get-ы
    #39655874
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devkealon(Ruslan)а я вот насчёт виртуальных методов не совсем согласен, статические лучше.
Для виртуальных компилятору придётся вставлять в код смещение метода из VMT, что запретит менять порядок методов, а со статикой таких проблем нетуПо-моему, ты не совсем понял о чем идет речь. Использование библиотечных функций как статических методов класса вырождается в обычный Си-подобный API с передачей явной передачей указателя на структуру, а заголовочный файл, описывающий такой интерфейс будет выглядеть более громоздко и менее понятно.прекрасно понимаю, в этом вырождении как раз и вся прелесть
а то что хидеры больше - нет, суммарно меньше, так как наследований нет
...
Рейтинг: 0 / 0
Пятничные get-ы
    #39655879
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devРечь о способе доступа к членам экземпляра класса, ссылку или указатель на который возвращает библиотечная функция. Любой доступ к членам такого объекта должен осуществляться исключительно через виртуальные методы интерфейсного класса.
Непонятно почему именно виртуальные методы интерфейсного класса, когда можно и PImpl'ом обойтись. Но тут всё на вкус и цвет.
Библиотечные интерфейсы C++ -- вещь достаточно хрупкая, накладывающая некие ограничения в измерениях версий рантаймов и правил манглинга различных компиляторов. Например, считается дурной практикой выставлять контейнеры STL в интерфейсы. API в C стиле до сих пор является статусом-кво стабильности ABI.
...
Рейтинг: 0 / 0
Пятничные get-ы
    #39655942
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NekZБиблиотечные интерфейсы C++ -- вещь достаточно хрупкая, накладывающая некие ограничения в измерениях версий рантаймов и правил манглинга различных компиляторов.Чувствуется, ты никогда не пробовал реализовать объектный интерфейс. Манглинг там вообще неусметен... Например, надо тебе сделать объектный интерфейс для подключения к БД. Что ты делаешь:
1. Описываешь в заголовочном файле набор абстрактных интерфейсных классов, например: CONNECTION, TRANSACTION, QUERY DATASET и т.д.;
2. Пишешь реализацию библиотеки, наследуя для классов реализации интерфейсные классы и экспортируешь только одну Си функцию, возвращающую экземпляр наследника CONNECTION с реализацией всех наследованных виртуальных функций;
3. Далее, в проект, использующий твою библиотеку, включаем заголовочный файл, описывающий интерфейсные классы и "поднимаем ботинок за шнурок", типа:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
CONNECTION & conn = mylib::getCONNECTION("my_database");
TRANSACTION & tran = conn.transactions.Сreate();
tran["property_name"] = some_value;
tran.Start();
QUERY & qry = conn.queries.Create();
qry.transaction = tran;
qry.SQL = "SELECT * FROM my_table";
if (qry.Prepare())
  qry.Exec();

и т.д... Иными словами, твоя библиотека экспортирует лишь одну функцию и никаких тебе манглингов. Единственное, что тебе нужно - предусмотреть проверку соответствия версии заголовочного файла и версии реализации библиотеки, чтобы быть уверенным, что все виртуальные методы на своих местах.
...
Рейтинг: 0 / 0
Пятничные get-ы
    #39655946
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devNekZБиблиотечные интерфейсы C++ -- вещь достаточно хрупкая, накладывающая некие ограничения в измерениях версий рантаймов и правил манглинга различных компиляторов.Чувствуется, ты никогда не пробовал реализовать объектный интерфейс. Манглинг там вообще неусметен... Например, надо тебе сделать объектный интерфейс для подключения к БД. Что ты делаешь:
1. Описываешь в заголовочном файле набор абстрактных интерфейсных классов, например: CONNECTION, TRANSACTION, QUERY DATASET и т.д.;
2. Пишешь реализацию библиотеки, наследуя для классов реализации интерфейсные классы и экспортируешь только одну Си функцию, возвращающую экземпляр наследника CONNECTION с реализацией всех наследованных виртуальных функций;
3. Далее, в проект, использующий твою библиотеку, включаем заголовочный файл, описывающий интерфейсные классы и "поднимаем ботинок за шнурок", типа:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
CONNECTION & conn = mylib::getCONNECTION("my_database");
TRANSACTION & tran = conn.transactions.Сreate();
tran["property_name"] = some_value;
tran.Start();
QUERY & qry = conn.queries.Create();
qry.transaction = tran;
qry.SQL = "SELECT * FROM my_table";
if (qry.Prepare())
  qry.Exec();

и т.д... Иными словами, твоя библиотека экспортирует лишь одну функцию и никаких тебе манглингов. Единственное, что тебе нужно - предусмотреть проверку соответствия версии заголовочного файла и версии реализации библиотеки, чтобы быть уверенным, что все виртуальные методы на своих местах.
По-видимому, у тебя там какая-то своя атмосфера из частной практики. Видимо, мы о разных вещах говорим.
Примерно так же реализованы драйвера БД в Qt.
Спасибо, открыл мне Америку.
...
Рейтинг: 0 / 0
40 сообщений из 40, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Пятничные get-ы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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