Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Передача значений в конструктор класса[C++]

8.9K
26 января 2011 года
Apach47
130 / / 14.06.2010
Здравствуйте уважаемые форумчане.

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

Определение класса
Код:
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;
};


Два указателя на голову и хвост списка соответственно:
 
Код:
advert *head = 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;
}


Собственно в чем проблема: в конструктор класса не передается значение ни одной стринговоской переменной, а именно type_advert и responsible, хотя если записывать вместо них жесткую строку "в кавычках", все работает нормально.

В чем здесь проблема и как ее устранить?

Весь исходных код программы прикрепляю к посту.
277
26 января 2011 года
arrjj
1.7K / / 26.01.2011
Надо делать не advert ex_1 = random_input(); и advert ex_1 = input();
а например так: advert * ex_1 =new advert(input()); , иначе объект удаляется и попытка чтото из него прочитать приводит в никуда. (и не забудь удалить их потом)

А с конструкторами всё в порядке там.
8.9K
27 января 2011 года
Apach47
130 / / 14.06.2010
Действительно забыл выделить под объект память...
arrjj, спс
8.9K
28 января 2011 года
Apach47
130 / / 14.06.2010
Так, с созданием объектов теперь все понятно, но как быть с удалением?
Я понимаю что перед тем как программе завершиться она вызовет для каждого экземпляра класса деструктор, который сам уничтожит объект, но по заданию лабы нужно отдельная функция, в которой это все будет делаться.

Я написал ее вот так
 
Код:
void clear( advert *head )
{
//head - указатель на первый узел в списке
    if( head )
    {
        clear( head->_next );
        head->~advert();
    }
}


Деструктор вот так
 
Код:
~advert()
    {
//_type_advert и _responsible - переменные типа string
        _type_advert.clear();
        _responsible.clear();
    }


...но помоему это немного не то... (определение самого класса выше)
Как будет правильно объясните или дайте ссылку пожалуйста.

P.S.: Код программы прилагаю
277
29 января 2011 года
arrjj
1.7K / / 26.01.2011
Переделай деструктор так, чтобы он для дочернего объекта вызывал деструктор,тогда тебе понадобится только вызов head->~advert(), и он удалит все дочерние объекты.

Примерно так:
if(_next!=NULL)
_next->~advert();


НО! При большом количестве объектов ( при очень большом ) возникнет ошибка stack overflow, там решай по месту, мало объектов - то пофиг, много - создавай список объектов и проходись по нему (или если список advert * то можно одним delete [] обойтись)....

П.С. а твой код правильный, но в нём также может быть переполнение стека, ну а стринги нет смысла очищать, у них у самих в деструкторе очистка вызывается. Вобще на практике один раз только с переполнением стека встречался - неоптимизированная рекурсивная функция в графич. редакторе, аналогичная фотошоповской "волшебной палочке".
38K
28 февраля 2011 года
alt@zir
29 / / 28.08.2008
Цитата:
P.S.: Код программы прилагаю
Вложения
main.cpp.zip (4.0 Кб, Показов: 0)


Это C++???:confused::confused:
Ты где учишься?

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог