Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
1 / 1 / 0
Регистрация: 12.10.2019
Сообщений: 18
1

Ошибка с контейнером мап

12.10.2019, 09:53. Показов 2966. Ответов 11
Метки map (Все метки)

Author24 — интернет-сервис помощи студентам
Столкнулся с проблемой. При компилировании программы - выводит ошибку, думаю это связано с контейнером map.
При удалении строчек из функции create, файла .h - всё запускается

Главный файл .cpp:
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
#include <iostream> 
#include <SFML/Graphics.hpp>
#include <vector>
#include <map> 
 
#include "Anime.h"
 
using namespace sf;
using namespace std;
 
int main()
{
    RenderWindow window(VideoMode(1000, 800),"SHIT!");
 
    Texture Shrek;
    Shrek.loadFromFile("images/AnimeMan.png");
 
    Name_Animation NameAnim;
    NameAnim.create("walk", Shrek, 0, 0, 80, 110, 2, 0.005, 40);
 
    while (window.isOpen())
    {
        Event event;
        while (window.pollEvent(event))
        {
            if (event.type == Event::Closed)
                window.close();
        }
    }
 
}
Файл .h
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <iostream>
#include <string>
#include <vector>
#include <map> 
#include <SFML/Graphics.hpp>
 
using namespace sf;
using namespace std;
 
class Hero_Animation
{
public:
    vector<IntRect> FALSE_Mirror, TRUE_Mirror;
    float AnimationFrame, speed; bool MIRROR, PlayAnimation;
    Sprite HeroSprite;
 
    Hero_Animation(Texture &HeroTexture, int x, int y, int w, int h, int N_Anim, float SPEED, int Personnel_Size = 0)
    {
        speed = SPEED;
        HeroSprite.setTexture(HeroTexture);
 
        AnimationFrame = 0; PlayAnimation = true; MIRROR = false;
 
        for (int i = 0; i < N_Anim; i = i + 1)
        {
            FALSE_Mirror.push_back(IntRect(x + i * Personnel_Size, y, w, h));
            TRUE_Mirror.push_back(IntRect(x + i * Personnel_Size + w, y, -w, h));
        }
    }
 
    void Pocess_Frame(float time)
    {
        int i;
 
        if (!PlayAnimation) { return; }
        AnimationFrame = AnimationFrame + speed * time;
 
        if (AnimationFrame > FALSE_Mirror.size()) { AnimationFrame = AnimationFrame - FALSE_Mirror.size(); }
 
        i = AnimationFrame;
 
        HeroSprite.setTextureRect(FALSE_Mirror[i]);
 
        if (MIRROR) { HeroSprite.setTextureRect(TRUE_Mirror[i]); }
    }
};
 
class Name_Animation
{
public:
    
    String AnimationFrame_Name; //Имя действующей аинмации
    map<String, Hero_Animation> Sheet_With_Animation;
 
    Name_Animation()
    {}
 
    void create(String name, Texture &HeroTexture, int x, int y, int w, int h, int N_Anim, float SPEED, int Personnel_Size = 0)
    {
        Sheet_With_Animation[name] = Hero_Animation(HeroTexture, x, y, w, h, N_Anim, SPEED, Personnel_Size);
        AnimationFrame_Name = name;
    }
 
 
};
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.10.2019, 09:53
Ответы с готовыми решениями:

map<Int,MYMAP>, или мап хранящий мап
Дброго времени суток. Такая проблема : typedef std::map&lt;std::string,std::string&gt; strmap;...

Ошибка с map контейнером
Всем привет , может кто подсказать, что я делаю не правильно ? Вылезает ошибка , чтобы я ни делал...

Ошибка в роботе с контейнером: set iterator not incrementable
Задание:Дано предложение.Какие большие и маленькие буквы с этих 'k','p','s','t','f','h','c' не...

Гистограмка = буутс + мап
Код компилируется. Но что то не так в свитч кейс лупе... НЕ правильно считает. См. принтскрин....

11
фрилансер
5498 / 5094 / 1047
Регистрация: 11.10.2019
Сообщений: 13,341
12.10.2019, 10:04 2
а какую ошибку то пишут ?
0
1 / 1 / 0
Регистрация: 12.10.2019
Сообщений: 18
12.10.2019, 10:20  [ТС] 3
Алексей1153, Код ошибки = 0x80070002
0
фрилансер
5498 / 5094 / 1047
Регистрация: 11.10.2019
Сообщений: 13,341
12.10.2019, 10:30 4
Цитата Сообщение от Kloody Посмотреть сообщение
При компилировании программы - выводит ошибку
- при компилировании где ошибка то ? Не в рантайме

0x80070002 - Не удается найти указанный файл.
и текст ошибки ?
0
1 / 1 / 0
Регистрация: 12.10.2019
Сообщений: 18
13.10.2019, 07:16  [ТС] 5
Алексей1153, 1>c:\program files (x86)\microsoft visual studio\2017\professional\vc\tools\msvc\14.16.27023\include\tuple(1305): error C2512: Hero_Animation::Hero_Animation: нет подходящего конструктора по умолчанию
0
фрилансер
5498 / 5094 / 1047
Регистрация: 11.10.2019
Сообщений: 13,341
13.10.2019, 07:44 6
Kloody, ну так тебе компилятор прямо пишет, что нужно сделать- надо добавить конструктор Hero_Animation по умолчанию, либо вызывать существующий конструктор.
Первое понятно.


второе стреляет вот тут
C++
1
Sheet_With_Animation[name]
используй метод Sheet_With_Animation.insert()
0
1 / 1 / 0
Регистрация: 12.10.2019
Сообщений: 18
13.10.2019, 07:56  [ТС] 7
Алексей1153, спасибо, что откликаешься. Как сделать по умолчанию - не знаю.
Но почему Sheet_With_Animation.insert() , а не Sheet_With_Animation.emplace(), ведь данные я вношу с файла .cpp.
Да и вроде так правильно - Sheet_With_Animation[name], пересмотрел гайдов по этим случаям.
1
фрилансер
5498 / 5094 / 1047
Регистрация: 11.10.2019
Сообщений: 13,341
13.10.2019, 08:32 8
Лучший ответ Сообщение было отмечено Kloody как решение

Решение

вот тут требуется вызов конструктора по умолчанию (внутри оператора [] мапы это требуется)
C++
1
Sheet_With_Animation[name]
вставку можно произвести без конструктора по умолчанию так
C++
1
Sheet_With_Animation.insert(std::make_pair(name, Hero_Animation(HeroTexture, x, y, w, h, N_Anim, SPEED, Personnel_Size)));
конструктор по умолчанию, если нужен, будет примерно такой
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
class Hero_Animation
{
public:
    std::vector<IntRect> FALSE_Mirror;
    std::vector<IntRect> TRUE_Mirror;
    float AnimationFrame;
    float speed;
    bool MIRROR;
    bool PlayAnimation;
    Sprite HeroSprite;
 
   //конструктор по умолчанию
   Hero_Animation()
    :AnimationFrame(0)
    ,speed(0)
    ,MIRROR(false)
    ,PlayAnimation(false)
   {
   }
 
    //конструктор с параметрами
    Hero_Animation(Texture &HeroTexture, int x, int y, int w, int h, int N_Anim, float SPEED, int Personnel_Size = 0)
    {
    }
...
...
1
1 / 1 / 0
Регистрация: 12.10.2019
Сообщений: 18
13.10.2019, 10:35  [ТС] 9
Алексей1153, то есть, мне нужно удалить конструктор с параметром и вставить по умолчанию? Или ничего не удалять и просто вставить конструктор по умолчанию?

Запись по моему пониманию

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
class Hero_Animation
{
public:
    vector<IntRect> FALSE_Mirror, TRUE_Mirror;
    float AnimationFrame, speed; bool MIRROR, PlayAnimation;
    Sprite HeroSprite;
 
    Hero_Animation()
        :AnimationFrame(0)
        , speed(0)
        , MIRROR(false)
        , PlayAnimation(false)
    {
 
    }
 
    Hero_Animation(Texture &HeroTexture, int x, int y, int w, int h, int N_Anim, float SPEED, int Personnel_Size = 0)
    {
        speed = SPEED;
        HeroSprite.setTexture(HeroTexture);
 
        AnimationFrame = 0; PlayAnimation = true; MIRROR = false;
 
        for (int i = 0; i < N_Anim; i = i + 1)
        {
            FALSE_Mirror.push_back(IntRect(x + i * Personnel_Size, y, w, h));
            TRUE_Mirror.push_back(IntRect(x + i * Personnel_Size + w, y, -w, h));
        }
    }
 
    void Pocess_Frame(float time)
    {
        int i;
 
        if (!PlayAnimation) { return; }
        AnimationFrame = AnimationFrame + speed * time;
 
        if (AnimationFrame > FALSE_Mirror.size()) { AnimationFrame = AnimationFrame - FALSE_Mirror.size(); }
 
        i = AnimationFrame;
 
        HeroSprite.setTextureRect(FALSE_Mirror[i]);
 
        if (MIRROR) { HeroSprite.setTextureRect(TRUE_Mirror[i]); }
    }
};
 
class Name_Animation
{
public:
    
    String AnimationFrame_Name; //Имя действующей аинмации
    map<String, Hero_Animation> Sheet_With_Animation;
 
    Name_Animation()
    {}
 
    void create(String name, Texture &HeroTexture, int x, int y, int w, int h, int N_Anim, float SPEED, int Personnel_Size = 0)
    {   
        Sheet_With_Animation.insert(std::make_pair(name, Hero_Animation(HeroTexture, x, y, w, h, N_Anim, SPEED, Personnel_Size)));
 
        AnimationFrame_Name = name;
    }
 
 
 
};
0
фрилансер
5498 / 5094 / 1047
Регистрация: 11.10.2019
Сообщений: 13,341
13.10.2019, 11:06 10
Kloody, если используешь insert , то конструктор по умолчанию в данном случае не нужен. Но можешь его и оставить, он не будет мешать. С ним твой прежний вариант получится, кстати, тоже. То есть с вызовом оператора []
0
1 / 1 / 0
Регистрация: 12.10.2019
Сообщений: 18
13.10.2019, 11:24  [ТС] 11
Алексей1153, если я использую инсерт, но удаляю конструктор по умолчанию, то программа не работает и выдает ошибку, если не удаляю - все работает. Не понимаю как это работает. Вы мне помогли, спасибо. Дальше, надеюсь, разберусь сам.
0
фрилансер
5498 / 5094 / 1047
Регистрация: 11.10.2019
Сообщений: 13,341
13.10.2019, 11:36 12
Лучший ответ Сообщение было отмечено Kloody как решение

Решение

Kloody, работает это так - если конструктор используется в программе, он должен быть объявлен )
0
13.10.2019, 11:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.10.2019, 11:36
Помогаю со студенческими работами здесь

Мап видеопамяти или скриншот из r0
Вроде тема избита, но чтот не выходит. HLP. Через IOCTL - IOCTL_VIDEO_MAP_VIDEO_MEMORY (XP32)...

Удаление ключей в коллекции мап
Здравствуйте,проблема следующая : создается коллекция Treemap(который уже по дефолту сортирует...

Внедрение длл в процесс (мануал мап)
всем привет внедряю вот так инжект не происходит думаю из за того что вызываю загрузку длл через...

Работа с контейнером
Первый вопрос. Вот пример перечисления элементов формы с проверкой типа элемента совместно с его...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru