powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Константный экземпляр класса. Кто как делает?
25 сообщений из 94, страница 1 из 4
Константный экземпляр класса. Кто как делает?
    #39647628
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Допустим, есть некий класс и в зависимости от того, является ли экземпляр const или non-const у этого экземпляра либо нет реализации деструктора, либо она есть. Кто как решает подобную задачу?
...
Рейтинг: 0 / 0
Константный экземпляр класса. Кто как делает?
    #39647636
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devКто как решает подобную задачу?это какая то странная задача))
...
Рейтинг: 0 / 0
Константный экземпляр класса. Кто как делает?
    #39647655
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorych, есть необходимость изменить поведение экземпляра класса, когда он const, но если обычные методы можно сделать const и они будут вызываться только для const указателя/ссылки на объект, то конструкторы и деструкторы сделать const, разделив таким образом поведение при создании/разрушении, нельзя.

Вот я и спрашиваю - кто и как решал подобную задачу?
...
Рейтинг: 0 / 0
Константный экземпляр класса. Кто как делает?
    #39647682
blonduser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devegorych, есть необходимость изменить поведение экземпляра класса, когда он const, но если обычные методы можно сделать const и они будут вызываться только для const указателя/ссылки на объект, то конструкторы и деструкторы сделать const, разделив таким образом поведение при создании/разрушении, нельзя.

Вот я и спрашиваю - кто и как решал подобную задачу?

Это где такому учат?
...
Рейтинг: 0 / 0
Константный экземпляр класса. Кто как делает?
    #39647705
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devДопустим, есть некий класс и в зависимости от того, является ли экземпляр const или non-const у этого экземпляра либо нет реализации деструктора, либо она есть. Кто как решает подобную задачу?
Вернись в постановке реальной задачи, а не к черезжопному представлению, как ее делать.
...
Рейтинг: 0 / 0
Константный экземпляр класса. Кто как делает?
    #39647710
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devegorych, есть необходимость изменить поведение экземпляра класса, когда он const, но если обычные методы можно сделать const и они будут вызываться только для const указателя/ссылки на объект, то конструкторы и деструкторы сделать const, разделив таким образом поведение при создании/разрушении, нельзя.

Вот я и спрашиваю - кто и как решал подобную задачу?
Ну как вариант, можно чекать внутри объекта если хотя бы раз у него вызывался неконстантный мембер, то он неконстантный и уже в деструкторе принимать решение на основе этого флага. Но это дурно пахнет, если честно.
...
Рейтинг: 0 / 0
Константный экземпляр класса. Кто как делает?
    #39647725
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devконструкторы и деструкторы сделать const, разделив таким образом поведение при создании/разрушении, нельзяи это правильно, ибо класс с константным конструктором не получится создать, а с константным деструктором - разрушить )))

PS смотри в stl, там сделали отдельные классы для таких извращённых случаев, iterator и const_iterator как пример
...
Рейтинг: 0 / 0
Константный экземпляр класса. Кто как делает?
    #39647828
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если я всё правильно понял, конструкторы вызываются для константных и не константных объектов. Разница только в точке вызова.
...
Рейтинг: 0 / 0
Константный экземпляр класса. Кто как делает?
    #39647897
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychи это правильно, ибо класс с константным конструктором не получится создать, а с константным деструктором - разрушить )))

PS смотри в stl, там сделали отдельные классы для таких извращённых случаев, iterator и const_iterator как примерВ том-то и дело, что при инициализации константного объекта он может быть проинициализирован константными значениями без их копирования в кучу, т.е. ссылаться на них, а при разрушении, естественно, не должен пытаться очистить эти ресурсы. Совершенно не хочется проверять в деструкторе, где именно находится ресурс - в куче или в ресурсах бинарного модуля. По всей видимости, придётся как-то выкручиваться через спецификацию шаблона.
...
Рейтинг: 0 / 0
Константный экземпляр класса. Кто как делает?
    #39647899
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbЕсли я всё правильно понял, конструкторы вызываются для константных и не константных объектов. Разница только в точке вызова.И точка вызова у них может быть одна и та же. Разница лишь в том, что при вызове константного метода ему прилетает константный this со всеми вытекающими.
...
Рейтинг: 0 / 0
Константный экземпляр класса. Кто как делает?
    #39647950
blonduser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devИ точка вызова у них может быть одна и та же. Разница лишь в том, что при вызове константного метода ему прилетает константный this со всеми вытекающими.

При вызове ему прилетает указатель и никто не знает какой он.

https://msdn.microsoft.com/ru-ru/library/07x6b05d.aspx]Ключевое слово const указывает, что значение переменной является постоянным и сообщает компилятору , что программист не должен его изменять.
...
Рейтинг: 0 / 0
Константный экземпляр класса. Кто как делает?
    #39647984
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blonduser, что мешает проверить?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
class A {
  volatile int a;
public :
    void set(int src) const
    {
      int * p_a = reinterpret_cast<int*>(reinterpret_cast<void*>(this)++);
      //int * p_a = reinterpret_cast<int*>((size_t)this + sizeof(void*));
      *p_a = src;
    }
};

Результат компиляции:
Код: plaintext
1.
2.
main.cpp: In member function 'void A::set(int) const':
main.cpp:38:70: error: reinterpret_cast from type 'const A*' to type 'void*' casts away qualifiers
       int * p_a = reinterpret_cast<int*>(reinterpret_cast<void*>(this)++);
...
Рейтинг: 0 / 0
Константный экземпляр класса. Кто как делает?
    #39648003
blonduser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,

С функциями Set const не используется обычно. Но вы знаете толк в извращения!
Это происходит только в момент компиляции.

Мой вариант работает.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
class A {
  volatile int a;
public :
    void set(int src) const
    {
	  int * pA = (int*)(void*)&a;
	  *pA = src;

      //int * p_a = reinterpret_cast<int*>(reinterpret_cast<void*>(this)++);
      //int * p_a = reinterpret_cast<int*>((size_t)this + sizeof(void*));
      //*p_a = src;
    }
};
...
Рейтинг: 0 / 0
Константный экземпляр класса. Кто как делает?
    #39648012
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blonduserЭто происходит только в момент компиляции.Естественно! Где же еще? :)
Скомпилированный бинарный модуль не хранит информацию о спецификаторах. Ты же понимаешь, что доступ к любому члену экземпляра класса осуществляется по неявному указателю this, который можно указывать, а можно и не указывать в реализации метода, а доступ по константному указателю, это доступ read-only.

P.S. Кстати, попробуй в моём примере строку с ошибкой заменить на строку из комментария. ;)
...
Рейтинг: 0 / 0
Константный экземпляр класса. Кто как делает?
    #39648020
blonduser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,

Так ты что хочешь получить в результате?
...
Рейтинг: 0 / 0
Константный экземпляр класса. Кто как делает?
    #39648076
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blonduserrdb_dev, так ты что хочешь получить в результате?Об этом я уже всё написал выше, а сейчас мы ушли в небольшой оффтоп на обсуждение особенностей константных методов. Если удастся сделать красивую реализацию на спецификации шаблона с дедукцией, выложу.
...
Рейтинг: 0 / 0
Константный экземпляр класса. Кто как делает?
    #39648109
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devДопустим, есть некий класс и в зависимости от того, является ли экземпляр const или non-const у этого экземпляра либо нет реализации деструктора, либо она есть. Кто как решает подобную задачу?

Ты неправ, деструктор у класса есть всегда, и он всегда вызывается.
Реализация при этом одна и та же.
...
Рейтинг: 0 / 0
Константный экземпляр класса. Кто как делает?
    #39648112
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devegorych, есть необходимость изменить поведение экземпляра класса, когда он const, но если обычные методы можно сделать const и они будут вызываться только для const указателя/ссылки на объект, то конструкторы и деструкторы сделать const, разделив таким образом поведение при создании/разрушении, нельзя.

Вот я и спрашиваю - кто и как решал подобную задачу?

Ты можешь объявить два конструктора для const и не const объектов, и вызывать их соответственно.
Отличать конструкторы друг от друга придётся руками (можно сделать два наследника, чтобы это было видно в названии класса).
При этом ты можешь в конструкторе инициализировать некий флаг внутри класса, чтобы отличать, является ли данный экземлпяр
const или не является.

Ещё раз, при этом дифференцировать объекты по const|не const тебе придётся руками. Для упрощения можно ещё запрятать
создание экземпляров в фабрику.

P.S. да, задача идиотская, я согласен со всеми, кто так высказывался. Всё против объектной модели С++.
...
Рейтинг: 0 / 0
Константный экземпляр класса. Кто как делает?
    #39648191
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivrdb_devДопустим, есть некий класс и в зависимости от того, является ли экземпляр const или non-const у этого экземпляра либо нет реализации деструктора, либо она есть. Кто как решает подобную задачу?

Ты неправ, деструктор у класса есть всегда, и он всегда вызывается.
Реализация при этом одна и та же.Я знаю, что деструктор есть всегда, поэтому и написал не "нет деструктора", а "нет реализации деструктора", имея в виду ~T() {}
...
Рейтинг: 0 / 0
Константный экземпляр класса. Кто как делает?
    #39648201
blonduser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv, Не отвлекайте его. Очень хочется на результат посмотреть.
...
Рейтинг: 0 / 0
Константный экземпляр класса. Кто как делает?
    #39648218
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv...
Отличать конструкторы друг от друга придётся руками (можно сделать два наследника, чтобы это было видно в названии класса).
...
Для упрощения можно ещё запрятать создание экземпляров в фабрику.

В этом случае, проблемы нет вообще.
базовый класс, два наследника: TMyClassInHeap, TMyClassAsRef
и просто virtual деструктор
...
Рейтинг: 0 / 0
Константный экземпляр класса. Кто как делает?
    #39648356
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blonduser, не дождешься!
С дедукцией не получается, а без неё выходит банальный exactly specialized template, который даже школьник напишет.
...
Рейтинг: 0 / 0
Константный экземпляр класса. Кто как делает?
    #39648366
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devРазница лишь в том, что при вызове константного метода ему прилетает константный this со всеми вытекающими.Это разница - для компилятора . Код не различает const. Я думаю, компилятор при генерации отличает ctor/dtor-ы от остальных методов. Т.е. ты не сможешь сам его позвать явно (не скомпилируется).
...
Рейтинг: 0 / 0
Константный экземпляр класса. Кто как делает?
    #39648431
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbЭто разница - для компилятора . Код не различает const. Я думаю, компилятор при генерации отличает ctor/dtor-ы от остальных методов. Т.е. ты не сможешь сам его позвать явно (не скомпилируется).Я так и написал: 21428334
...
Рейтинг: 0 / 0
Константный экземпляр класса. Кто как делает?
    #39648487
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivТы можешь объявить два конструктора для const и не const объектов, и вызывать их соответственно.
Отличать конструкторы друг от друга придётся руками (можно сделать два наследника, чтобы это было видно в названии класса).
При этом ты можешь в конструкторе инициализировать некий флаг внутри класса, чтобы отличать, является ли данный экземлпяр
const или не является.

Ещё раз, при этом дифференцировать объекты по const|не const тебе придётся руками. Для упрощения можно ещё запрятать
создание экземпляров в фабрику.

P.S. да, задача идиотская, я согласен со всеми, кто так высказывался. Всё против объектной модели С++.Неа, объявить const конструктор не могу! Конструкторы и деструкторы не могут иметь cv квалификаторы.
В итоге получается два точно специализированных шаблона класса-обёртки (для const и не const) к интересующему классу, плюс typedef'ы для них. Вот так - банально и скучно. Нет возможности специализировать шаблон по объявлению lvalue.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
template<class T> class A_;

template<>
class A_<A const> : public A
{
...
};

template<>
class A_<A> : public A
{
...
};

typedef A_<const A> ClassConstA;
typedef A_<A> ClassA;


Вообще, в C++ очень много "недосказанности". К примеру:
* Есть возможность "сказать" new const Type(), но нет возможности этот const хоть как-то "услышать" в реализации перегруженного оператора new, конструктора или деструктора класса;
* Есть возможность переопределить placement new, но компилятор не симулирует его вызов при определении экземпляра объекта на стеке, хотя, такое поведение было бы логичным;
* Можем специализировать шаблоны с дедукцией по параметрам конструктора, но не можем специализировать шаблоны с дедукцией по типу и квалификаторам объявления lvalue;
...
Рейтинг: 0 / 0
25 сообщений из 94, страница 1 из 4
Форумы / C++ [игнор отключен] [закрыт для гостей] / Константный экземпляр класса. Кто как делает?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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