Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Перегруженный конструктор / 21 сообщений из 21, страница 1 из 1
09.10.2006, 14:25
    #34041725
(`yka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегруженный конструктор
Есть зачаток класса:
Код: 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.
class ElfPGP
{
private:
	HWND parent;
	BYTE *res_buffer;
	char *err_buffer;

public:
	ElfPGP(HWND parent)
	{
		this->parent = parent;
		res_buffer = NULL;
		err_buffer = (char*)malloc( 256 );
		ZeroMemory(err_buffer,  256 );
	}

	ElfPGP() 
	{
		ElfPGP((HWND)NULL);
	}

	~ElfPGP()
	{
		if (res_buffer) free(res_buffer);
		if (err_buffer) free(err_buffer);
	}
};
Когда делаю
Код: plaintext
ElfPGP *p = new ElfPGP();
конструктор без параметров вызывает перегруженный конструктор с параметром. Вроде всё вполне обычно. НО! Почему-то сразу после конструктора с параметром выполняется деструктор! Т.е. вызов
ElfPGP((HWND)NULL);
как будто кроет в себе вызов деструктора. Они отрабатывают сразу один за другим. Почему??! Даже исключений не возникает никаких.
Глаза уже сломал. Не понимаю.


─────────
∙ Иногда решительный шаг вперед - результат хорошего пинка сзади ∙
[SRC c++][/SRC]
...
Рейтинг: 0 / 0
09.10.2006, 14:32
    #34041748
(`yka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегруженный конструктор
MS VS 2005 / Win32 project


─────────
∙ Иногда решительный шаг вперед - результат хорошего пинка сзади ∙
...
Рейтинг: 0 / 0
09.10.2006, 14:34
    #34041755
Перегруженный конструктор
Код: plaintext
1.
2.
3.
4.
	ElfPGP() 
	{
		ElfPGP((HWND)NULL);
	}

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

сделайте приватную функцию инициализации и дергайте ее из обоих конструкторов
...
Рейтинг: 0 / 0
09.10.2006, 14:36
    #34041769
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегруженный конструктор
Однажды меня колбасило... и я искал функцию - постконструктор.
...
Рейтинг: 0 / 0
09.10.2006, 14:38
    #34041781
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегруженный конструктор
В данном случае можно использовать параметр по умолчанию
...
Рейтинг: 0 / 0
09.10.2006, 15:09
    #34041901
kolobok0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегруженный конструктор
(`yka...конструктор без параметров вызывает перегруженный конструктор с параметром...


может быть вот так, получше будет ?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
..........
	ElfPGP(HWND parent = NULL)
	{
		this->parent = parent;
		res_buffer = NULL;
		err_buffer = (char*)malloc( 256 );
		ZeroMemory(err_buffer,  256 );
	}
.........

тогда и с параметром и без - прокатит...


(круглый)
ЗЫ
Замечания правильно сказали - у Вас на стэке порождается, посему и деструктор отрабатывает...
...
Рейтинг: 0 / 0
09.10.2006, 15:13
    #34041915
Перегруженный конструктор
Ну, не знаю... У меня все прошло без проблем при пошаговой отладке (MS VC 6.0)....
...
Рейтинг: 0 / 0
09.10.2006, 15:13
    #34041917
(`yka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегруженный конструктор
А почему порождается-то? Не помню такого особого поведения конструкторов. Может подскажете, где про это написано.. Мне почему-то кажется, что раньше в порядке вещей было вызывать один конструктор из другого по логике, которую преследовал я. Может быть ошибаюсь - очень давно на С++ не кодил.



─────────
∙ Иногда решительный шаг вперед - результат хорошего пинка сзади ∙
...
Рейтинг: 0 / 0
09.10.2006, 15:20
    #34041937
Sandro_K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегруженный конструктор
Код: plaintext
1.
2.
3.
4.
	ElfPGP() 
	{
		this->ElfPGP((HWND)NULL);
	}
Так кажется должно работать.
...
Рейтинг: 0 / 0
09.10.2006, 15:27
    #34041955
(`yka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегруженный конструктор
Пробовал уже - не прокатит. Error C2273
В Borland Dev Studio 2006 такое же поведение. Раньше много на С++ писал, но все же не помню я такого...


─────────
∙ Иногда решительный шаг вперед - результат хорошего пинка сзади ∙
...
Рейтинг: 0 / 0
09.10.2006, 15:44
    #34042023
Перегруженный конструктор

В Borland Dev Studio 2006 такое же поведение. Раньше много на С++ писал, но все же не помню я такого...


насколько я могу судить, такое поведение соответствует текущему стандарту языка: вызов конструктора происходит неявно при создании объекта
...
Рейтинг: 0 / 0
09.10.2006, 16:12
    #34042128
Sandro_K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегруженный конструктор
Код: plaintext
1.
2.
3.
4.
	ElfPGP() 
	{
		this->ElfPGP((HWND)NULL);
	}
Да, так действительно не работает, ошибся :)

А вот так точно работать будет, хотя выглядит как-то извращенно.
Код: plaintext
1.
2.
3.
4.
	ElfPGP() 
	{
		new(this)ElfPGP((HWND)NULL);
	}
...
Рейтинг: 0 / 0
09.10.2006, 16:35
    #34042226
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегруженный конструктор
Sandro_K
А вот так точно работать будет, хотя выглядит как-то извращенно.
Код: plaintext
1.
2.
3.
4.
	ElfPGP() 
	{
		new(this)ElfPGP((HWND)NULL);
	}


Я бы не советовал рисковать с подобными конструкциями.
...
Рейтинг: 0 / 0
09.10.2006, 17:47
    #34042529
Sandro_K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегруженный конструктор
Akh Sandro_K
А вот так точно работать будет, хотя выглядит как-то извращенно.
Код: plaintext
1.
2.
3.
4.
	ElfPGP() 
	{
		new(this)ElfPGP((HWND)NULL);
	}


Я бы не советовал рисковать с подобными конструкциями.

Согласен, подобные конструкции - это плохой стиль.
Но то, что тут написано, вполне корректно, и я не могу придумать другого способа вызвать один конструктор из другого.
...
Рейтинг: 0 / 0
09.10.2006, 17:58
    #34042564
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегруженный конструктор
Sandro_KСогласен, подобные конструкции - это плохой стиль.
Но то, что тут написано, вполне корректно, и я не могу придумать другого способа вызвать один конструктор из другого.

Угу.

Не думаю, что вызов констуктора из конструктора может когда-либо потребоваться.
...
Рейтинг: 0 / 0
10.10.2006, 17:50
    #34045219
Gryz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегруженный конструктор
Sandro_K ,то, что вы хотите сделать, сделать невозможно.
Нужен метод init()
вызов конструктора == создание нового объекта
...
Рейтинг: 0 / 0
10.10.2006, 20:00
    #34045582
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегруженный конструктор
Sandro_K Akh Sandro_K
А вот так точно работать будет, хотя выглядит как-то извращенно.
Код: plaintext
1.
2.
3.
4.
	ElfPGP() 
	{
		new(this)ElfPGP((HWND)NULL);
	}


Я бы не советовал рисковать с подобными конструкциями.

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

Почему плохой стиль ? Что некорректного ? Вопросы риторические, отвечать не надо.

PS: Долго ржал над исходным текстом.
...
Рейтинг: 0 / 0
10.10.2006, 20:03
    #34045591
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегруженный конструктор
GryzSandro_K ,то, что вы хотите сделать, сделать невозможно.
Нужен метод init()
вызов конструктора == создание нового объекта

Это неправда. Конструктор никогда не создает нового объекта. Конструктор только инициализирует объект. Сделать такое возможно и абсолютно корректно, причем переносимо, ибо стандарт. Через placement new.
...
Рейтинг: 0 / 0
10.10.2006, 20:24
    #34045620
blinded
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегруженный конструктор
А зачем делат сложным то, что должно быть простым? Вас же люди читать будутю Правильно сделать init - потому что понятнее.
...
Рейтинг: 0 / 0
10.10.2006, 23:05
    #34045752
Gryz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегруженный конструктор
MasterZiv GryzSandro_K ,то, что вы хотите сделать, сделать невозможно.
Нужен метод init()
вызов конструктора == создание нового объекта

Это неправда. Конструктор никогда не создает нового объекта. Конструктор только инициализирует объект. Сделать такое возможно и абсолютно корректно, причем переносимо, ибо стандарт. Через placement new.
Ok. :)

Если нету placement new, то при вызове конструктора компилятор генерирует код, выделяющий память для нового объекта.

Часто Вам приходится использовать placement new, чтобы "ситуация вынуждала"? Я просто пока не сталкивался
...
Рейтинг: 0 / 0
11.10.2006, 11:48
    #34046613
Sandro_K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перегруженный конструктор
blindedА зачем делат сложным то, что должно быть простым? Вас же люди читать будутю Правильно сделать init - потому что понятнее.

Я просто привел пример, как можно вызвать один коструктор из другого,
он совершенно правильный, и писать так можно, но не нужно. Я никому не советовал и не советую так писать. Полностью согласен что правильнее сделать init.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Перегруженный конструктор / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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