Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
freemanc
 Аватар для freemanc
12 / 12 / 1
Регистрация: 27.11.2012
Сообщений: 140
08.03.2013, 17:31     Не получается заполнить вектор объектами класса #1
Здравствуйте. Решения для своей проблемы на форуме не нашел, по этому пришлось создать тему.
Есть класс:
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 минут
И что самое интересное, с другими классами все работает, а с этим - нет
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.03.2013, 17:31     Не получается заполнить вектор объектами класса
Посмотрите здесь:

C++ при перезагрузке оператора для класса не получается использовать имя переменной такое же,как в описании класса
C++ Работа с объектами внутри класса.
Оптимизация работы метода класса с объектами класса [C++] C++
Действия со всеми объектами класса C++
C++ Реализуйте интерфейс динамической структуры list для работы с объектами класса А
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
08.03.2013, 17:43     Не получается заполнить вектор объектами класса #2
Цитата Сообщение от freemanc Посмотреть сообщение
~CAnimate(){
* * * * delete Animation;
* * * * delete Frame;
а ты для них new вызывал? нет?
получай.
freemanc
 Аватар для freemanc
12 / 12 / 1
Регистрация: 27.11.2012
Сообщений: 140
08.03.2013, 17:49  [ТС]     Не получается заполнить вектор объектами класса #3
Kuzia domovenok, можно по подробней, а то не совсем понятно.
Дело в том, что Animation грузится из файла с помощью метода класса, я не пишу для него new.
Но если дело только в new, то подскажите плз куда мне его влепить в своем классе, а то что то я запутался уже)
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
08.03.2013, 17:51     Не получается заполнить вектор объектами класса #4
Для вектора обязательное требование — корректно работающий конструктор копирования и корректно работающие деструкторы (ну или move-конструктор для С++11). Где инициализация Animation и Frame? Хотя б в NULL. Ведь вектор, когда будет расти, скопирует ваши объекты в новое место и пойдёт вызывать деструкторы для старых копий. А там какой-то мусор вместо указателей.

И вообще, надо или копировать эти картинки целиком (в явном конструкторе копирования), или удалять их где-нибудь не в деструкторе, или работать с вектором так, чтобы он не вызывал деструкторы.
freemanc
 Аватар для freemanc
12 / 12 / 1
Регистрация: 27.11.2012
Сообщений: 140
08.03.2013, 17:56  [ТС]     Не получается заполнить вектор объектами класса #5
Хорошо, подскажите пожалуйста где мне лучше всего их инициализировать в моем случае?
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
08.03.2013, 17:56     Не получается заполнить вектор объектами класса #6
C++
1
2
3
4
5
    ~CAnimate()
    {
        delete Animation;//СЮДА СТАВИМ BreakPoint.
        delete Frame;// И наблюдаем попытку применить delete к тому, что не было new
    }
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
08.03.2013, 17:57     Не получается заполнить вектор объектами класса #7
Цитата Сообщение от freemanc Посмотреть сообщение
Хорошо, подскажите пожалуйста где мне лучше всего их инициализировать в моем случае?
Инициализировать в NULL. На всякий случай. Прям в конструкторе. И хранить в векторе указатели на объекты, а не сами объекты, чтобы таких проблем не возникало. И заодно сделать приватными конструктор копирования и присваивание у CAnimate.
freemanc
 Аватар для freemanc
12 / 12 / 1
Регистрация: 27.11.2012
Сообщений: 140
08.03.2013, 20:15  [ТС]     Не получается заполнить вектор объектами класса #8
~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 минуты
Неужели никто не может помочь?
Кудаив
328 / 405 / 24
Регистрация: 27.05.2012
Сообщений: 1,162
Завершенные тесты: 2
08.03.2013, 20:28     Не получается заполнить вектор объектами класса #9
что компилятор пишет?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.03.2013, 22:47     Не получается заполнить вектор объектами класса
Еще ссылки по теме:

Заполнение map объектами класса C++
Работа с объектами класса: вывод на консоль, подсчет суммы C++
C++ Сортировка массива с объектами класса

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

Или воспользуйтесь поиском по форуму:
freemanc
 Аватар для freemanc
12 / 12 / 1
Регистрация: 27.11.2012
Сообщений: 140
08.03.2013, 22:47  [ТС]     Не получается заполнить вектор объектами класса #10
Пишет:
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 минут
Походу я один такой "везучий"))
Yandex
Объявления
08.03.2013, 22:47     Не получается заполнить вектор объектами класса
Ответ Создать тему
Опции темы

Текущее время: 21:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru