class advert {
public:
advert( int day_start, int month_start, int yaer_start,
int day_finish, int month_finish, int yaer_finish,
int rate_price_up, string type_advert,
string responsible, advert *prev_obj, advert *next_obj
) { //Конструктор явной инициализации
_day_start = day_start;
_month_start = month_start;
_yaer_start = yaer_start;
_day_finish = day_finish;
_month_finish = month_finish;
_yaer_finish = yaer_finish;
_type_advert = type_advert;
_rate_price_up = rate_price_up;
_responsible = responsible;
_prev = prev_obj;
_next = next_obj;
}
.......................................................................
advert *_prev;
//Указатель на предыдущий элемент
advert *_next;
//Указатель на следующий элемент
private:
//Дата начала
int _day_start;
int _month_start;
int _yaer_start;
//Дата завершения
int _day_finish;
int _month_finish;
int _yaer_finish;
//Тип проводимой рекламы
string _type_advert;
//Процент роста
int _rate_price_up;
//Ответственный
string _responsible;
};
Передача значений в конструктор класса[C++]
Постановка задачи: создать список в узлах которого будут находиться экземпляры класса.
Определение класса
Код:
Два указателя на голову и хвост списка соответственно:
Код:
advert *head = NULL;
advert *tail = NULL;
advert *tail = NULL;
И функция создания узлов списка
Код:
advert random_input( ) {
int day_start, month_start, year_start, day_finish;
int month_finish, year_finish, rate_price_up;
string type_advert, responsible;
day_start = rand()%30+1;
day_finish = rand()%30+1;
month_start = rand()%12+1;
month_finish = rand()%12+1;
year_start = rand()%30+1980;
year_finish = rand()%30+1980;
rate_price_up = rand()%301;
int num_of_type = 7;
char **list_type_advert = new char *[num_of_type];
list_type_advert[0] = "Почтовая рассылка";
list_type_advert[1] = "Газеты/журналы";
list_type_advert[2] = "Радио/Телевидиние";
list_type_advert[3] = "Щиты/Плакаты";
list_type_advert[4] = "Флаеры/Банеры";
list_type_advert[5] = "Интернет-реклама";
list_type_advert[6] = "В транспорте";
type_advert = list_type_advert[ rand()%num_of_type ];
int num_of_responsible = 5;
char **list_responsible = new char *[num_of_responsible];
list_responsible[0] = "Кардонский М.М.";
list_responsible[1] = "Янкина Л.Ф.";
list_responsible[2] = "Гусив А.Н.";
list_responsible[3] = "Крайкин А.А.";
list_responsible[4] = "Иванов И.И";
responsible = list_responsible[ rand()%num_of_responsible ];
cout << responsible << " || " << type_advert << endl;
advert obj( day_start, month_start, year_start, day_finish,
month_finish, year_finish, rate_price_up,
type_advert, responsible, tail, NULL );
return obj;
}
int day_start, month_start, year_start, day_finish;
int month_finish, year_finish, rate_price_up;
string type_advert, responsible;
day_start = rand()%30+1;
day_finish = rand()%30+1;
month_start = rand()%12+1;
month_finish = rand()%12+1;
year_start = rand()%30+1980;
year_finish = rand()%30+1980;
rate_price_up = rand()%301;
int num_of_type = 7;
char **list_type_advert = new char *[num_of_type];
list_type_advert[0] = "Почтовая рассылка";
list_type_advert[1] = "Газеты/журналы";
list_type_advert[2] = "Радио/Телевидиние";
list_type_advert[3] = "Щиты/Плакаты";
list_type_advert[4] = "Флаеры/Банеры";
list_type_advert[5] = "Интернет-реклама";
list_type_advert[6] = "В транспорте";
type_advert = list_type_advert[ rand()%num_of_type ];
int num_of_responsible = 5;
char **list_responsible = new char *[num_of_responsible];
list_responsible[0] = "Кардонский М.М.";
list_responsible[1] = "Янкина Л.Ф.";
list_responsible[2] = "Гусив А.Н.";
list_responsible[3] = "Крайкин А.А.";
list_responsible[4] = "Иванов И.И";
responsible = list_responsible[ rand()%num_of_responsible ];
cout << responsible << " || " << type_advert << endl;
advert obj( day_start, month_start, year_start, day_finish,
month_finish, year_finish, rate_price_up,
type_advert, responsible, tail, NULL );
return obj;
}
Собственно в чем проблема: в конструктор класса не передается значение ни одной стринговоской переменной, а именно type_advert и responsible, хотя если записывать вместо них жесткую строку "в кавычках", все работает нормально.
В чем здесь проблема и как ее устранить?
Весь исходных код программы прикрепляю к посту.
а например так: advert * ex_1 =new advert(input()); , иначе объект удаляется и попытка чтото из него прочитать приводит в никуда. (и не забудь удалить их потом)
А с конструкторами всё в порядке там.
arrjj, спс
Я понимаю что перед тем как программе завершиться она вызовет для каждого экземпляра класса деструктор, который сам уничтожит объект, но по заданию лабы нужно отдельная функция, в которой это все будет делаться.
Я написал ее вот так
Код:
void clear( advert *head )
{
//head - указатель на первый узел в списке
if( head )
{
clear( head->_next );
head->~advert();
}
}
{
//head - указатель на первый узел в списке
if( head )
{
clear( head->_next );
head->~advert();
}
}
Деструктор вот так
Код:
~advert()
{
//_type_advert и _responsible - переменные типа string
_type_advert.clear();
_responsible.clear();
}
{
//_type_advert и _responsible - переменные типа string
_type_advert.clear();
_responsible.clear();
}
...но помоему это немного не то... (определение самого класса выше)
Как будет правильно объясните или дайте ссылку пожалуйста.
P.S.: Код программы прилагаю
Примерно так:
if(_next!=NULL)
_next->~advert();
НО! При большом количестве объектов ( при очень большом ) возникнет ошибка stack overflow, там решай по месту, мало объектов - то пофиг, много - создавай список объектов и проходись по нему (или если список advert * то можно одним delete [] обойтись)....
П.С. а твой код правильный, но в нём также может быть переполнение стека, ну а стринги нет смысла очищать, у них у самих в деструкторе очистка вызывается. Вобще на практике один раз только с переполнением стека встречался - неоптимизированная рекурсивная функция в графич. редакторе, аналогичная фотошоповской "волшебной палочке".
Цитата:
P.S.: Код программы прилагаю
Вложения
main.cpp.zip (4.0 Кб, Показов: 0)
Вложения
main.cpp.zip (4.0 Кб, Показов: 0)
Это C++???:confused::confused:
Ты где учишься?