Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Описание тела функции в обявлении класса  (Прочитано 13353 раз)
0 Пользователей и 1 Гость смотрят эту тему.
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« : 01-09-2006 05:51 » 

Есть такой код
 class TCP_Buf
 {public   :
   int MaxLen;
   int Len;
   char * Buf;
   
   TCP_Buf(void)
   {
      TCP_Buf(MAX_TCP_BUF);
      
   };
   TCP_Buf(int size)
   {
      if (size>0 && size<=MAX_TCP_BUF)
      {
         Buf=new char[size];
         MaxLen=size;
      };
   }
   ~TCP_Buf(void)
   {
      delete Buf;
      MaxLen=0;

   };
   

};
class factori
{
    TCP_Buf m_Buf;
   factori();
}


При создании экземпляра объекта factori

вызывается    TCP_Buf(void) отрабатывает и затем почемуто сразу вызывается деструктор... ~TCP_Buf()

В итоге отладчиком в     factori();  я вижу не мнициализированные поля
Записан

Да да нет нет все остальное от лукавого.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #1 : 01-09-2006 06:25 » 

всё очень просто
вот это
   TCP_Buf(void)
   {
      TCP_Buf(MAX_TCP_BUF);
     
   };
конструирование временного объекта TCP_Buf внутри конструктора TCP_Buf как только конструкто отработает он уничтожит данные
сделай так
Код:
class TCP_Buf 
{
void init(int size)
{
if (size>0 && size<=MAX_TCP_BUF)
{
cout << "TCP_Buf::TCP_Buf(n)\n";
Buf=new char[size];
MaxLen=size;
}
}

public   :
int MaxLen;
int Len;
char * Buf;

TCP_Buf(int size)
{
init(size);
}

TCP_Buf(void)
{
cout << "TCP_Buf::TCP_Buf\n";
init(MAX_TCP_BUF);

}
~TCP_Buf(void)
{
delete Buf;
MaxLen=0;
cout << "TCP_Buf::~TCP_Buf\n";

}
};

я бы еще конструкторы объеденил в один TCP_Buf(int size = MAX_TCP_BUF)
Записан

Странно всё это....
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 01-09-2006 06:33 » 

Спасибо вы конечно правы.  Вызов коструктора равносилен созданию объекта (((((

(Блин, сначала "where id_count=225" вместо  "where id_count=225 or id_count is null"   в запросе с left join, теперь конструктор ....  похоже пришло время снова брать отпуск....  )



Записан

Да да нет нет все остальное от лукавого.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #3 : 01-09-2006 06:41 » 

PSD, вообще вроде все тут на ты. Улыбаюсь
возможно можно конструктор из конструктора вызвать если использовать конструкцию
new(this) TCP_Buf(n);
т.е. конструирование поверх текущего объекта
Записан

Странно всё это....
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 01-09-2006 07:20 » 

Это получается как создание обекта класса в собственном буфере?
   
Записан

Да да нет нет все остальное от лукавого.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #5 : 01-09-2006 07:30 » 

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

Странно всё это....
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 01-09-2006 07:39 » 

Хм, это получается что в принципе конструктор можно вызвать из любой функции ....
Записан

Да да нет нет все остальное от лукавого.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #7 : 01-09-2006 09:01 » 

да
на этом построенны аллокаторы
просто я не разу не пробовал вызывать собственный конструктор из нутри объекта.
Записан

Странно всё это....
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 01-09-2006 14:57 » 

Цитата
new(this) TCP_Buf(n);
Извините за глупый вопрос, но хотелось бы узнать, здесь конструкция (this) служит как бы приведением к типу?
Записан

ещё один вопрос ...
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 01-09-2006 15:08 » 

Цитата: nikedeforest
Извините за глупый вопрос, но хотелось бы узнать, здесь конструкция (this) служит как бы приведением к типу?
this - не тип, а типизированный указатель на объект, т.е. приведением это быть не может. Зачем она там - не могу сказать Улыбаюсь. Вероятно, это связано с декларацией new, и таким образом this используется как адрес, по которому new выполняет все действия.
« Последнее редактирование: 01-09-2006 15:11 от dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #10 : 01-09-2006 15:39 » 

возможно можно конструктор из конструктора вызвать если использовать конструкцию
new(this) TCP_Buf(n);
т.е. конструирование поверх текущего объекта

имелось в виду наверное так:

this= new TCP_Buf(n);

а утечки памяти не будет? Улыбаюсь
« Последнее редактирование: 01-09-2006 15:45 от Алексей1153 » Записан

PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 04-09-2006 04:29 » 

Нет, если я правельно понял, имелось  виду именно следующее: оператор new  позволяет создавать экзепляры обекта класса не только в куче(с выделенем памяти) но и в произвольном буфере   адрес буфера передается в скобках. 

new (pointer) type

В данном случае приводился пример как можно вызвать конструктор класса, мы просто передаем new  указатель на сам эекземпляр объекта , что приводит к пересозданию объекта на томже месте. Учитывая что память в С ни при выделении ни при освобождении не "очищается" теоретически мы можем влюбой момент вызвать конструктор класса из любого другого метода.   

Записан

Да да нет нет все остальное от лукавого.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #12 : 04-09-2006 05:22 » 

PSD, ты абсолютно прав Улыбаюсь можно сделать malloc стразу на 100 мегов и засовывать туда те объекты которые тебе хочится.

this используем, как указатель на себя и вот эта конструкция new(this) TCP_Buf(n); в конструкторе TCP_Buf говорить сконструировать объект прямо поверх уже созданного объекта. Из серии, что не запрещено, то разрешено

Алексей1153, целью было было вызвать один конструктор изнутри друго-го(как обычный метод) при инниализации объекта, а не создавать новый объект
Записан

Странно всё это....
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #13 : 04-09-2006 07:17 » 

PSD, LogRus, то есть мы делаем

MYTYPE xxx(...);
memmove(pointer,&xxx,sizeof(xxx));

(где pointer - указатель на "чистый" буфер?)

?
Записан

Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #14 : 04-09-2006 07:30 » 

при чем тут memmove

new(pointer) TObj(arg) означает сконструировать объект по адресу pointer используя конструктор TObj::TObj(param arg)
ничего ни куда не двигаем просто вызываем конструктор для ранее аллоцированной памяти, память может быль аллоцирована через malloc или например через boost::pool(у нас активно используется там, где много выделений/удалений памяти)
Записан

Странно всё это....
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines