C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Констсруктор и дестуктор класса  (Прочитано 2391 раз)
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


Констсруктор и дестуктор класса
« : 13 Апрель 2015, 18:23:51 »

Если, к примеру, у меня есть такой класс:
Код
class TMyData : public TObject
{
public:
int Value;
int CoutSens;
String Login;
bool Aut;
bool ProverkaSetup;
int PeriodTime;
String Otvet;
__fastcall TMyData(const int &aValue, const int &aCoutSens, const String &sLogin, const bool &sAut, const bool &sProverkaSetup,
const int &aPeriodTime, const String &aOtvet)
: TObject(), Value(aValue), CoutSens(aCoutSens), Login(sLogin), Aut(sAut), ProverkaSetup(sProverkaSetup),
PeriodTime(aPeriodTime), Otvet(aOtvet) {}
};
 

Я хочу добавить в этот класс переменную:
BYTE RamdomData[16];
Как правильно добавить инициализацию этой переменной в конструктор класса? Как будет правильно выглядеть деструктор чтобы очищать эту переменную?
Спасибо.
Записан
d7d1cd
Участник


Сказали спасибо: +59/-24
Offline

Сообщений: 1005


Re: Констсруктор и дестуктор класса
« Ответ #1 : 13 Апрель 2015, 20:17:27 »

Наверное вы имеете ввиду "как правильно выделить память для данной переменной"? Можно так и добавить:
Код
class TMyData : public TObject
{
public:
int Value;
int CoutSens;
BYTE RamdomData[16]; // Тут память выделится сразу, при объявлении переменной данного класса
...
 

А можно так:
Код
class TMyData : public TObject
{
public:
int Value;
int CoutSens;
BYTE *RamdomData; // Тут память не будет выделена
...
 
// В конструкторе:
RamdomData = new BYTE[16]; // Выделяю память
 
// В деструкторе:
delete RamdomData; // Освобождаю память
Записан
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


Re: Констсруктор и дестуктор класса
« Ответ #2 : 14 Апрель 2015, 10:29:12 »

Если тогда такой код:
Код
class TMyData : public TObject
{
public:
int Value;
int CoutSens;
String Login;
bool Aut;
bool ProverkaSetup;
int PeriodTime;
String Otvet;
BYTE  * RamdomData;
//не правильно
__fastcall TMyData(const int &aValue, const int &aCoutSens, const String &sLogin, const bool &sAut, const bool &sProverkaSetup,
const int &aPeriodTime, const String &aOtvet, const BYTE & RamdomData)
: TObject(), Value(aValue), CoutSens(aCoutSens), Login(sLogin), Aut(sAut), ProverkaSetup(sProverkaSetup),
PeriodTime(aPeriodTime), Otvet(aOtvet) {RamdomData = new BYTE[16];}//нельзя менять const
};
 

И как передовать в конструктор?
Код
   BYTE Data[16];
  Randomize();
  for(int i = 1; i 16; i++)
{
BYTE rnd = Random(256);
Data[i] = rnd;
//*** код ***
 
//не правильно:
TMyData OurData = new TMyData(0, 0,"", false, false, 0, Otvet, Data);
 
« Последнее редактирование: 14 Апрель 2015, 10:49:49 от SilverFish » Записан
OVE
Участник


Сказали спасибо: +67/-0
Offline

Сообщений: 72


Re: Констсруктор и дестуктор класса
« Ответ #3 : 14 Апрель 2015, 11:34:59 »

У Вас совпадает имя члена класса и параметра, передаваемого в конструктор (RamdomData), поэтому компилятор и ругается.
Можно сделать так
Код:
class TMyData : public TObject
{
public:
int Value;
int CoutSens;
String Login;
bool Aut;
bool ProverkaSetup;
int PeriodTime;
String Otvet;
BYTE  * RamdomData;
__fastcall TMyData(const int &aValue, const int &aCoutSens, const String &sLogin, const bool &sAut, const bool &sProverkaSetup,
const int &aPeriodTime, const String &aOtvet, const BYTE & aRamdomData)
: TObject(), Value(aValue), CoutSens(aCoutSens), Login(sLogin), Aut(sAut), ProverkaSetup(sProverkaSetup),
PeriodTime(aPeriodTime), Otvet(aOtvet) {RamdomData = new BYTE[16]; memcpy(RamdomData,aRamdomData,16);}
};

В деструкторе
Код:
delete RamdomData;
Записан
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


Re: Констсруктор и дестуктор класса
« Ответ #4 : 14 Апрель 2015, 12:02:34 »

Спасибо.
Теперь тут ругается:
memcpy(RamdomData,aRamdomData,16);
Cannot convert 'int' to 'const void *'

Записан
OVE
Участник


Сказали спасибо: +67/-0
Offline

Сообщений: 72


Re: Констсруктор и дестуктор класса
« Ответ #5 : 14 Апрель 2015, 12:21:53 »

попробуйте так
Код:
memcpy((void*)RamdomData,(void*)aRamdomData,16)
Записан
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


Re: Констсруктор и дестуктор класса
« Ответ #6 : 14 Апрель 2015, 12:49:15 »

Спасибо, так работает, но я не соображу как создать объект.
Код
//***
BYTE  * RamdomData;
__fastcall TMyData(const int &aValue, const int &aCoutSens, const String &sLogin, const bool &sAut, const bool &sProverkaSetup,
const int &aPeriodTime, const String &aOtvet, const BYTE & aRamdomData)
: TObject(), Value(aValue), CoutSens(aCoutSens), Login(sLogin), Aut(sAut), ProverkaSetup(sProverkaSetup),
PeriodTime(aPeriodTime), Otvet(aOtvet)
{
 RamdomData = new BYTE[16];
 memcpy((void*)RamdomData,(void*)aRamdomData,16);
}
__fastcall ~TMyData()
{
if(RamdomData)  
delete [] RamdomData;
}
 


Код
   Randomize();
  BYTE Data[16];
  for(int i = 0; i 16; i++)
{
BYTE rnd = Random(256);
Data[i] = rnd;
//****
 
TMyData OurData = new TMyData(0, 0,"", false, false, 0, "", Data);
 
Could not find a match for 'TMyData::TMyData(int,int,const char *,bool,bool,int,const char *,unsigned char *)'

Записан
OVE
Участник


Сказали спасибо: +67/-0
Offline

Сообщений: 72


Re: Констсруктор и дестуктор класса
« Ответ #7 : 14 Апрель 2015, 13:21:07 »

Объявите конструктор следующим образом
Код:
__fastcall TMyData(int aValue, int aCoutSens, String sLogin, bool sAut, bool sProverkaSetup,
int aPeriodTime, String aOtvet, BYTE *aRamdomData)
: TObject(), Value(aValue), CoutSens(aCoutSens), Login(sLogin), Aut(sAut), ProverkaSetup(sProverkaSetup),
PeriodTime(aPeriodTime), Otvet(aOtvet)
{
  RamdomData = new BYTE[16];
  memcpy((void*)RamdomData,(void*)aRamdomData,16);
}
Записан
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


Re: Констсруктор и дестуктор класса
« Ответ #8 : 14 Апрель 2015, 13:28:11 »

Could not find a match for 'TMyData::TMyData(const TMyData&)'
 
Записан
OVE
Участник


Сказали спасибо: +67/-0
Offline

Сообщений: 72


Re: Констсруктор и дестуктор класса
« Ответ #9 : 14 Апрель 2015, 13:37:34 »

При вызове оператора new создается указатель на новый объект.
Код:
TMyData * OurData = new TMyData(0, 0,"", false, false, 0, "", Data);
Записан
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


Re: Констсруктор и дестуктор класса
« Ответ #10 : 14 Апрель 2015, 13:45:44 »

Спасибо. Досадная оплошность.
Записан
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


Re: Констсруктор и дестуктор класса
« Ответ #11 : 14 Апрель 2015, 13:53:06 »

Объясните, пожалуйста, а почему надо везде убрать const?
Переменные const устанавливаются в списки инициализации, а RamdomData в теле конструктора. Поэтому почему это не работает?
Код
__fastcall TMyData(const int &aValue, const int &aCoutSens, const String &sLogin, const bool &sAut, const bool &sProverkaSetup,
const int &aPeriodTime, const String &aOtvet, BYTE & aRamdomData)
: TObject(), Value(aValue), CoutSens(aCoutSens), Login(sLogin), Aut(sAut), ProverkaSetup(sProverkaSetup),
PeriodTime(aPeriodTime), Otvet(aOtvet)
{
 RamdomData = new BYTE[16];
 memcpy((void*)RamdomData,(void*)aRamdomData,16);
}
 
__fastcall ~TMyData()
{
 if(RamdomData)
 delete [] RamdomData;
}
 
Записан
OVE
Участник


Сказали спасибо: +67/-0
Offline

Сообщений: 72


Re: Констсруктор и дестуктор класса
« Ответ #12 : 14 Апрель 2015, 15:09:43 »

const можно оставить
главное - последний параметр должен быть указатель на char, а не ссылка.(... BYTE * aRamdomData)
Записан
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


« Ответ #13 : 14 Апрель 2015, 15:47:03 »

Спасибо.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.109 секунд. Запросов: 19.