Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.09.2010, 23:49   #1
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию Повторный вызов конструктора класса

Возможно ли это в теории?
Код:
class CLS
{
    CLS()
    {
     //...
    }
};

void proc()
{
    CLS cls; // вызов конструктора при инициал. 
    // здесь нужно вызвать cls.CLS() повторно. Как?
}
EUGY вне форума Ответить с цитированием
Старый 28.09.2010, 00:18   #2
ozo
Форумчанин
 
Аватар для ozo
 
Регистрация: 26.04.2010
Сообщений: 328
По умолчанию

Повторно, может конструктор ваш вовсе не конструктор ?
К примеру, может можно сделать так :
Код:
class CLS
{
public:
    CLS()
    {
     Some();
     //...
    }
    bool Some();
    
};

void proc()
{
    CLS cls; // вызов конструктора при инициал. 
    cls.Some();// здесь нужно вызвать cls.CLS() повторно. Как?
}
Используй гугль, будь счастлив
hackme@yandex.ru
Блог об archlinux
ozo вне форума Ответить с цитированием
Старый 28.09.2010, 01:39   #3
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Спасибо, но нужен был именно вызов ctor.
Я добился этого так:
Код:
class CLS
{
public :
    CLS()
    {
	char ch[100];
	wsprintfA(ch,"%#08x\n",this);
	OutputDebugStringA(ch); // this
	//
    }
    void* operator new(size_t, void* p) 
    {
	return p; // просто заглушка
    }
};

void proc()
{
    CLS cls;
    new(&cls) CLS; // повторный вызов конструктора
}
Но не въехал, какой механизм использует оператор new чтобы вызывать конструктор. Иными словами, если это умеет делает перегруженный оператор, то как сделать напрямую.

Последний раз редактировалось EUGY; 28.09.2010 в 01:48.
EUGY вне форума Ответить с цитированием
Старый 28.09.2010, 01:43   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вопрос, а что вообще нужно от вызова конструктора?
выполнение некоторых операторов из него ведь так?
может стоит их вынести в отдельный метод?
(а то ведь не очень как то получается)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 28.09.2010, 02:10   #5
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Вообще мне это нужно для сброса private-членов класса в дефолт.
CLS() : x(0), y(0)...
Вы правы, конечно можно сделать это отдельным методом, но "дизайн" класса будет не тот
EUGY вне форума Ответить с цитированием
Старый 28.09.2010, 04:12   #6
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2EUGY
ты не понимаешь смысла конструктора, если хочешь вызывать его напрямую. почитай страуструпа, например. видно, что ты сишник, переходящий на плюсы, но тут другие правила)
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 28.09.2010, 05:39   #7
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Просто любопытно, как рантайм C++ вызывает конструктор объекта класса.
Не думаю, что это против правил.
Где увидеть нечто такое:
Код:
		p = malloc(sz);
		p->ctor()
EUGY вне форума Ответить с цитированием
Старый 28.09.2010, 08:09   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

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

Код:
    CLS cls;
    new(&cls) CLS; // повторный вызов конструктора
Здесь будут созданы 2 разных объекта - один в стеке и один в куче.

По теме:
Конструктор почти нормальный член класса и его можно вызывать.

Цитата:
Где увидеть нечто такое:
При ручном создание объектов. НО это очень редко используется.
p51x вне форума Ответить с цитированием
Старый 28.09.2010, 09:30   #9
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

CLS cls; // вызывается конструктор (по сути структура кладется на стек и заполняются поля, если они есть)
.....
// после его использования вызывается деструктор, который выталкивает его со стека, если в описании класса нет деструктора, он создается автоматически.
return 0;
NiCola999 вне форума Ответить с цитированием
Старый 28.09.2010, 11:42   #10
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

А не проще будет удалить ненужный объект и создать новый с нулевыми членами?
pu4koff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вызов конструктора суперкласса Golovastik PHP 1 04.07.2010 00:35
Вопрос про new и вызов конструктора Gtx541 Общие вопросы C/C++ 5 20.05.2010 12:18
Параметр конструктора класса = объект этого класса nazavrik Общие вопросы C/C++ 6 14.02.2010 13:48
Повторный вызов функций Roman Общие вопросы C/C++ 1 10.06.2009 14:48
Повторный вызов функции из dll Smertnik Общие вопросы C/C++ 5 15.05.2009 22:18