Войти
ФлеймФорумПрограммирование

C++ вызов виртуального метода из конструктора (2 стр)

Страницы: 1 2 3 Следующая »
#15
15:33, 1 сен. 2018

Mephistopheles
Держи

+ Показать

Идея тоже должна такой варнинг выдавать.


#16
15:42, 1 сен. 2018

ud1
> В голову приходит только всю инициализацию вынести в отдельный метод init()

Иногда рационально сделать понятие "занулёного состояния". Суть в том, что конструктор по умолчанию инициализирует члены класса нулевыми и безопасными значениями (как в яве), а virtual Init/Done доводят поля до кондиции и, соответственно, снова их обнуляют. Но чаще всего это надо в сочетании с какими нибудь сложными сериализациями/десериализация/фабриками и т.п. и там по сути название метода не Init, а типа LoadFromStream или подобное. Иногда такое - самое простое, но оно реально немного пованивает тем, что можно не в том порядке что либо сделать. Но по моему такие проблемы зачастую сильно преувеличивают и раздувают, наподобие приматива синглтонов над обычными глобалками.

#17
15:49, 1 сен. 2018

=A=L=X=
Проблема в том что с таким подходом без документации бывает сложно разобраться. Пример с тем же TBitmap - конструктор не создает даже дескриптора картинки в памяти и следовательно ничего не инкапсулирует. Для того чтобы создать дескриптор, нужно вызывать либо SetSize, либо LoadFromFile. Но поскольку это может быть неочевидно - необходимо лезть в доки. Только не везде они грамотно написаны, поэтому может возникнуть путаница.

#18
15:57, 1 сен. 2018

monobogdan

Имхо невозможно писать код так чтобы пользоваться им можно было не читая документацию, поэтому всё что на самом деле нужно - чтобы в дебаге выдавалось внятное сообщение об ошибке и всё. Вселенской проблемы в том, что иногда можно написать неправильный код нет если ошибку легко потом поймать.

#19
16:00, 1 сен. 2018

=A=L=X=
В целом если названия методов понятны и общее представление о том как работает код есть то почему бы и нет? Некоторые формошлепы на Delphi не слышали что такое EDN но умудряются разный софт писать тыкая мышкой и пользуясь автодополнением IDE.

#20
16:04, 1 сен. 2018

monobogdan

В не-managed-Delphi как раз нужна безукоризненная дисциплина с Create/Free и запороть утечку или вайолейшн - как нефиг делать.
Обязательно надо читать кто кем и как владеет как минимум.

#21
16:07, 1 сен. 2018

Кстати, в Delphi тоже как в яве - виртуальные методы в конструкторе вызываются для потомков без проблем. Тоже нужна самодисциплина.
Но действительно, несмотря на то, что язык компилируемый в натив - все поля инициализируются осмысленным дефолтом до первой строки пользовательского кода.

#22
16:20, 1 сен. 2018

=A=L=X=
> все поля инициализируются осмысленным дефолтом
А чё, в Delphi нету типов, не имеющих инициализироваться пустым значением?

#23
16:43, 1 сен. 2018

Panzerschrek[CN]
> А чё, в Delphi нету типов, не имеющих инициализироваться пустым значением?

    Object fields are always initialized to 0, 0.0, '', False, nil or whatever applies.
    Global variables are always initialized to 0 etc as well;
    Local reference-counted variables are always initialized to nil or '';
    Local non reference-counted variables are uninitialized so you have to assign a value before you can use them.

То есть единственное что не инициализируется дефолтом - это локальные переменные функций, которые не являются строками, динамическими массивами или наследием COM/OLE (interface (IUnknown) или Variant)
#24
16:55, 1 сен. 2018

=A=L=X=
> Local non reference-counted variables
Это чё? Они не могут быть сложными классами с непустым начальным состоянием?

#25
17:03, 1 сен. 2018

Panzerschrek[CN]
> Они не могут быть сложными классами

Нормальные классы в Delphi - ссылочные типы.
Но есть наследие Pascal и Object Pascal - собственно объекты и записи - вот с ними уже сложнее, там как бы опять таки reference-counted все инициализируются и деинициализируются на всю глубину вложенности в любые стандартные типы (record/array/string/com-reference) по умолчанию. Фактически object-ы уже и использовать то моветон, а в record-ы содержат как правило только примитивные типы для совместимости со всякими WinAPI.

#26
18:05, 1 сен. 2018

=A=L=X=
Алсо Delphi не умеет экспортировать классы в чистом виде, только в виде интерфейсов(которые являются по сути теми же рекордами с VMT).

#27
18:58, 1 сен. 2018

=A=L=X=
> Кстати, в Delphi тоже как в яве - виртуальные методы в конструкторе вызываются
> для потомков без проблем. Тоже нужна самодисциплина.
> Но действительно, несмотря на то, что язык компилируемый в натив - все поля
> инициализируются осмысленным дефолтом до первой строки пользовательского кода.
В Делфи, аналог MyObject::MyObject() - это скорее MyObject.CreateInstance; а собственно MyObject.Create - это тот самый virtual Init().
Отличие заключается только в том, что если метод с пометкой constructor вызвать извне, то компилятор автоматически обвесит его по типу

obj := MyObject.Create;
// превращается в
obj := MyObject.CreateInstance; // зануление здесь
obj.BeforeConstruction; // virtual
obj.Create; // virtual
obj.AfterConstruction; // virtual
Поэтому у несовершенных форм жизни возникает естественное желание связать "MyObject.Create" == "new MyObject", хотя это ни разу не так.
Зато в крестах можно сделать так:
template<typename T, typename... Args>
T* create(Args&&... args)
{
    T* ptr = new T;
    ptr->before_construction();
    ptr->create(std::forward<Args>(args)...);
    ptr->after_construction();
    return ptr;
}

// in user code
obj = create<MyObject>();

monobogdan
> Алсо Delphi не умеет экспортировать классы в чистом виде
Ты так говоришь, будто кресты умеют, лол.

#28
19:03, 1 сен. 2018

Delfigamer
Ну дык Delphi экспортирует их в формате абстрактных классов крестов. Так что в каком то смысле можно сказать что да, кресты умеют экспортировать классы в "чистом" виде, это раз.
Очень давно ходит миф что классы в Delphi нельзя никак экспортировать это два.

#29
19:06, 1 сен. 2018

Шутка заключалась в том, что
monobogdan
> в формате крестов
не существует. Есть формат msvc, есть формат gcc, есть даже формат собаки из соседнего двора; а вот "C++ ABI" - это мечта, которой, к сожалению, не было суждено стать реальностью.

Страницы: 1 2 3 Следующая »
ФлеймФорумПрограммирование

Тема в архиве.