Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
 Аватар для Magister
0 / 0 / 0
Регистрация: 21.11.2012
Сообщений: 6

Копирование контейнера vector в конструкторе (STL)

20.02.2013, 14:41. Показов 1843. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день! У меня есть класс, в котором объявлен вектор указателей на объекты:
C++
1
2
3
4
5
6
7
8
9
10
class Schedule
{
public:
...
    Schedule(void);
    ~Schedule(void);
private:
    string day;
    vector<Lesson*> studies;
}
В своё время вызывается вектор этих объектов в функции main:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "stdafx.h"
#include "Schedule.h"
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    const int N = 5; //N - number of written days.
    vector<Schedule*> myPlan;
    Schedule **weekday = new Schedule*[N];
    for(int i=0; i < N; i++)
    {
        weekday[i] = new Schedule(); //cannot copy vector to weekday here :(
        myPlan.push_back(weekday[i]);
    }
...
}
Конструктор Schedule() выглядит так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Schedule::Schedule(void)
{
    ifstream inClientFile("I22.dat", ios::in);
    if ( !inClientFile )
    {
        cerr << "File couldn't be opened!" << endl;
        exit(1);
    }
 
    int count; //How many lessons do we have?
    static int filePosition = 0;
 
    Lesson *newLesson = new Lesson();
    int  numero;
    string nume;
    Auditory camera;
    Time timp;
 
    cout<<"Reading day.."<<endl;
    inClientFile.seekg(filePosition); //pereustanovka ukazatelya pozitii file'a
                                    //na sootvetstvuiushii deni
    inClientFile >> day >> count;
    for (int i = 0; i < count; i++)
    {   
        inClientFile >> numero >> nume >> camera.room >> camera.block >> timp.hour >> timp.minute;
            newLesson->setNumber(numero);
            newLesson->setName(nume);
            newLesson->setAud(camera);
            newLesson->setTime(timp);
        
        this->studies.push_back(newLesson);
    }
    filePosition = inClientFile.tellg();
 
    delete newLesson;
}
Внутри конструктора данные из файла считываются отлично, затем объекту weekday[i] передаётся поле day, тогда как вектор studies остаётся в конструкторе. В чём дело?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.02.2013, 14:41
Ответы с готовыми решениями:

Обработка STL контейнера vector
Текст дан в виде вектора. Отсортировать элементы этого вектора и превратить на два списка так, чтобы в первом были только те элементы,...

Из STL контейнера
Из STL контейнера создать 3-х мерный массив и класс который содержит этот 3-х мерный массив и вывод координат(пользователь вводит...

Выбор контейнера в STL
Здраствуйте! Нужно выбрать к этой задаче контейнер STL, который более выгодно подойдет, кроме вектора. Я думаю, что deque или map Помогите...

4
Эксперт С++
 Аватар для ITcrusader
179 / 165 / 21
Регистрация: 12.02.2013
Сообщений: 410
20.02.2013, 15:51
Очень долго смотрел в приведенный код, перечитывал вопрос. Так и не понял, в чем проблема и в каком месте проявляется. Попробуй развернуто как-нибудь пояснить?

А, понял, кажется
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
20.02.2013, 16:16
Цитата Сообщение от Magister Посмотреть сообщение
this->studies.push_back(newLesson);
а ты уверен что в конструкторе это нормально?

Добавлено через 3 минуты
зашел в конструктор, создал
Цитата Сообщение от Magister Посмотреть сообщение
C++
1
Lesson *newLesson = new Lesson();
записал (как ты думаешь, а если что ты записал туда адрес!!!)
Цитата Сообщение от Magister Посмотреть сообщение
C++
1
this->studies.push_back(newLesson);
Цитата Сообщение от Magister Посмотреть сообщение
C++
1
delete newLesson;
по данному адресу удалил объект, и ты думаешь потом в вектое что то останется?, я думаю это максимум адрес в никуда, совет - почитай майерса про использование stl
1
Эксперт С++
 Аватар для ITcrusader
179 / 165 / 21
Регистрация: 12.02.2013
Сообщений: 410
20.02.2013, 16:16
Если я понял правильно, то вот в чем проблема:

по завершении этой строки:
Цитата Сообщение от Magister Посмотреть сообщение
weekday[i] = new Schedule(); //cannot copy vector to weekday here
weekday[i] содержит нормальный day, но всякую ерунду в studies.

А вот он источник бед: ты создаешь объект Lesson в конструкторе и инициализируешь его. И вроде бы все нормально. Потом указатель на подготовленный объект ты пихаешь в studies:
C++
1
this->studies.push_back(newLesson);
И тут тоже вроде все нормально, он там появляется. НО studies содержит копию указателя на созданный объект Lesson. Т.е. теперь у тебя есть динамический объект и 2 указателя на него, по одному из которых ты удаляешь память по завершении конструктора:
C++
1
delete newLesson;
Получается, что не существует более твоего Lesson, который ты сформировал в конструкторе, а вектор studies теперь содержит указатель на мусор. Источник зол - семантика копирования, реализуемая контейнерами STL.

Во) пока катал - сверху дельный ответ появился aLarman читает мысли)
1
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
20.02.2013, 16:20
если не сделать последнего удаления, то скорее всего объект все равно удалиться, вышли из области выидимости - компилятор умный - затрет)

Добавлено через 56 секунд
ITcrusader я читаю твои мысли хД

Добавлено через 1 минуту
Цитата Сообщение от ITcrusader Посмотреть сообщение
Источник зол - семантика копирования, реализуемая контейнерами STL.
это кончно да) но почитав правильные книжки учишься их обходить)))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.02.2013, 16:20
Помогаю со студенческими работами здесь

Возврат контейнера STL из функции
Как правильно вернуть STL контейнер из функции НЕ ПО ЗНАЧЕНИЮ? std :: map&lt;std :: string, BTSComponent*&gt; BTSObject ::...

STL итератор на конец контейнера
Подскажите пожалуйста у меня задача сделать дерево и слизать интерфейс с STL std::map. Вопрос в следующем: когда мы обходим map итератором...

Адаптация контейнера под STL
Учу C++, на данный момент было задание: реализовать односвязный список. Пока что реализовано не все, но возник такой вопрос: &quot;Почему...

Алгоритм выбора контейнера STL
Привет. Существует ли некая таблица по таким контейнерам с кратким описанием плюсов и минусов каждого по сравнению с другими? И в обще...

Заполнение контейнера vector
хочу попросить уважаемых модераторов разрешить задавать тут вопросы касаемо map , set, vector чтобы не множить , как кажется многим,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru