Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
 Аватар для freemanc
14 / 14 / 6
Регистрация: 27.11.2012
Сообщений: 140

Не получается заполнить вектор объектами класса

08.03.2013, 17:31. Показов 2960. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Решения для своей проблемы на форуме не нашел, по этому пришлось создать тему.
Есть класс:
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
37
38
39
40
41
42
43
44
45
46
class CAnimate
{
private:
 
    int FrameNumber;   //Номер текущего кадра
    int FrameCount;    //Количество кадров в анимации
    AnsiString FilePath; //Путь к файлу с анимацией
    Graphics::TBitmap *Animation; //Сама анимация
    Graphics::TBitmap *Frame; //Кадр анимации
 
    TRect CurrentFramePosition;  //Положение текущего кадра
    TRect AnimationDisplayArea;     //Координаты и размер области отображения
 
public:
    TPoint Position;   //Позиция анимации
    int Room;
    int Floor;
    bool MoveUp, MoveDown, MoveLeft, MoveRight;      //Происходит ли движения в стороны
    bool CanMove;     //Можно ли двигаться
    int FrameWidth, FrameHeight; //Ширина и высота кадра
    CAnimate()
    {
        MoveUp = false;
        MoveDown = false;
        MoveLeft = false;
        MoveRight = false;
        CanMove = true;
        Position.x = 30;
        Position.y = 30;
 
    }
//Тот самый конструктор, который не хочет работать
    CAnimate(int _x, int _y)
    {
        Position.x = _x;
        Position.y = _y;
    }
 
    ~CAnimate()
    {
        delete Animation;
        delete Frame;
    }
 
    /* методы */
};
Объявляю вектор и пытаюсь его инициализировать через конструктор с параметрами:
C++
1
2
3
vector<CAnimate> temp;
    for(int i=0; i<6; i++)
        temp.push_back(CAnimate(100,200));
Но компилятор выдает мне следующее:
C++
1
First chance exception at $7667B9BC. Exception class EAccessViolation with message 'Access violation at address 00401E03 in module 'Project1.exe'. Read of address 00000000'. Process Project1.exe (9796)
Подскажите пожалуйста, где я делаю не так

Добавлено через 5 минут
И что самое интересное, с другими классами все работает, а с этим - нет
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.03.2013, 17:31
Ответы с готовыми решениями:

Создать вектор, состоящий из 10 элементов типа myString и заполнить его объектами с произвольными строками
Есть класс myString. Нужно создать вектор, состоящий из 10 элементов типа myString и заполнить его объектами с произвольными, но...

Заполнить массив объектами другого класса
доброго времени суток. возникла следующая проблема: есть у меня класс Exam: class Exam { ...

не получается заполнить вектор структур
Есть вектор структур class Console { public: struct MyStruct { int begin_M; int end_M; }; std::vector &lt;MyStruct&gt;...

9
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,536
Записей в блоге: 1
08.03.2013, 17:43
Цитата Сообщение от freemanc Посмотреть сообщение
~CAnimate(){
* * * * delete Animation;
* * * * delete Frame;
а ты для них new вызывал? нет?
получай.
1
 Аватар для freemanc
14 / 14 / 6
Регистрация: 27.11.2012
Сообщений: 140
08.03.2013, 17:49  [ТС]
Kuzia domovenok, можно по подробней, а то не совсем понятно.
Дело в том, что Animation грузится из файла с помощью метода класса, я не пишу для него new.
Но если дело только в new, то подскажите плз куда мне его влепить в своем классе, а то что то я запутался уже)
0
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
08.03.2013, 17:51
Для вектора обязательное требование — корректно работающий конструктор копирования и корректно работающие деструкторы (ну или move-конструктор для С++11). Где инициализация Animation и Frame? Хотя б в NULL. Ведь вектор, когда будет расти, скопирует ваши объекты в новое место и пойдёт вызывать деструкторы для старых копий. А там какой-то мусор вместо указателей.

И вообще, надо или копировать эти картинки целиком (в явном конструкторе копирования), или удалять их где-нибудь не в деструкторе, или работать с вектором так, чтобы он не вызывал деструкторы.
1
 Аватар для freemanc
14 / 14 / 6
Регистрация: 27.11.2012
Сообщений: 140
08.03.2013, 17:56  [ТС]
Хорошо, подскажите пожалуйста где мне лучше всего их инициализировать в моем случае?
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,536
Записей в блоге: 1
08.03.2013, 17:56
C++
1
2
3
4
5
    ~CAnimate()
    {
        delete Animation;//СЮДА СТАВИМ BreakPoint.
        delete Frame;// И наблюдаем попытку применить delete к тому, что не было new
    }
1
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
08.03.2013, 17:57
Цитата Сообщение от freemanc Посмотреть сообщение
Хорошо, подскажите пожалуйста где мне лучше всего их инициализировать в моем случае?
Инициализировать в NULL. На всякий случай. Прям в конструкторе. И хранить в векторе указатели на объекты, а не сами объекты, чтобы таких проблем не возникало. И заодно сделать приватными конструктор копирования и присваивание у CAnimate.
1
 Аватар для freemanc
14 / 14 / 6
Регистрация: 27.11.2012
Сообщений: 140
08.03.2013, 20:15  [ТС]
~OhMyGodSoLong~, через указатель я попробую, но меня сейчас больше интересует именно хранение объектов.
Я делаю класс CAnimate на примере этого:
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
class CObject
{
  private:
    TRect rect;
    HRGN hRgn;
    GTB * Image;
  public:
           //Тут мы видим:
    CObject(void);  //Конструктор по умолчанию
    CObject(int x,int y,int type); //К. с параметрами
    CObject(const CObject&); // и копирования
    ~CObject(void) {             // и деструктор
            delete Image;
            DeleteObject(hRgn);
          }
    GTB* Draw(void) { return Image; }
           /* много методов */
 
};
 
CObject::CObject(void) {
  Image = new GTB();
  rect = TRect(0,0,0,0);
  hRgn = CreateRectRgn(0,0,0,0);
}
CObject::CObject(int _x, int _y, int type)
{
  Image = new GTB();
  Image->Transparent= true;
  ..........
}
С этим классом объявление и инициализация вектора выглядела так:
C++
1
2
3
4
vector<CObject> list;
list.push_back(CObject(342,706,1));
list.push_back(CObject(94,1387,1));
list.push_back(CObject(676,1130,1));
Этот класс не мой. Мне нужно сделать то же самое. Добавив new в каждый из имеющихся конструкторов своего класса, он имеет следующий вид:
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
class CAnimate
{
private:
 
    ......
    Graphics::TBitmap *Animation; //Сама анимация
    Graphics::TBitmap *Frame; //Кадр анимации
 
 
public:
    TPoint Position;   //Позиция анимации
    
    CAnimate()
    {
        // то о чем вы говорили
        Animation = new Graphics::TBitmap();
        Animation->Transparent = true;
        Frame = new Graphics::TBitmap();
        Frame->Transparent = true;
    }
 
    CAnimate(int _x, int _y)
    {
        Animation = new Graphics::TBitmap();
        Animation->Transparent = true;
        Frame = new Graphics::TBitmap();
        Frame->Transparent = true;
        Position.x = _x;
        Position.y = _y;
    }
 
    ~CAnimate()
    {
        delete Animation;
        delete Frame;
    }
Теперь я в заблуждении, вроде бы классы одинаковые, но:
C++
1
2
vector<CAnimate> Rooms;
Rooms.push_back(CAnimate(20,40));
не работает. Объясните мне пожалуйста в чем тут соль.

Добавлено через 53 минуты
Неужели никто не может помочь?
0
419 / 418 / 72
Регистрация: 27.05.2012
Сообщений: 1,168
08.03.2013, 20:28
что компилятор пишет?
0
 Аватар для freemanc
14 / 14 / 6
Регистрация: 27.11.2012
Сообщений: 140
08.03.2013, 22:47  [ТС]
Пишет:
C++
1
First chance exception at $7667B9BC. Exception class EInvalidPointer with message 'Invalid pointer operation'. Process Project1.exe (668)
Указывает на строку с деструктором в файле xmemory (какой то системный)
C++
1
2
3
4
5
template<class _TyDtor> inline
    void _Destroy(_TyDtor _FARQ *_Ptr)
    {   // destroy object at _Ptr
    _DESTRUCTOR(_TyDtor, _Ptr); //на эту
    }
Добавлено через 1 час 6 минут
Кстати проблема частично решилась: если вместо vector использовать list, то все нормально проходит.
Но вот почему vector работать не хочет... В примере с классом CObject именно он используется, и там все с ним в прорядке

Добавлено через 36 минут
Походу я один такой "везучий"))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.03.2013, 22:47
Помогаю со студенческими работами здесь

Как из другого класса управлять объектами класса Form1 ?
Добрый вечер, подскажите, пожалуйста. Создал форму Form1, создал отдельный класс (подписчик на одно событие из Форм1) , в котором ,вроде...

Оптимизация работы метода класса с объектами класса [C++]
Здравствуйте! Я хочу сделать 25 000 объектов класса, в последствии они все будут разными, но сейчас, для упрощения задачи, я делаю их...

заполнить массив объектами
Как заполнить массив объектами класса и вывести? Например, &lt;?php Class Klass1 {} Class Klass2 {} Class Klass3 {} $k1 =...

Как заполнить вектор на вектор классов
#include &lt;iostream&gt; #include &lt;vector&gt; class Num { private: int m_num; public: Num(int num) { num =...

Не получается убрать промежутки между ячейками и объектами
У меня есть таблица из двух строк (&lt;TR&gt;). В каждой строке по одной ячейке (&lt;TD&gt;) В первой строке несколько ImgButton-s из которых...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru