Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
 Аватар для CollSpack
7 / 7 / 1
Регистрация: 21.01.2013
Сообщений: 55

Как создать элемент вектора пользовательского типа(класса)?

17.03.2013, 18:33. Показов 2241. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Делаю змейку в консоли, а по сути тренируюсь с классами и векторами.

Есть класс с конструктором который создает кусок змейки в конкретном направлении от координат головы змеи
Кликните здесь для просмотра всего текста
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
class SnakePart
{
private:
    short xClass;
    short yClass;
public:
    SnakePart (short iDirrection, short *sHeadX, short *sHeadY)
    {
        switch (iDirrection)
        {
        case 72: //up
            //создает голову змеи в новом месте
            xClass=*sHeadX;
            yClass=*sHeadY+1;
            //меняет координаты головы
            *sHeadY+=1;
            break;
        case 80: //down
            xClass=*sHeadX;
            yClass=*sHeadY-1;
            *sHeadY-=1;
            break;
        case 77: //right
            xClass=*sHeadX+1;
            yClass=*sHeadY;
            *sHeadX+=1;
            break;
        case 75: //left
            xClass=*sHeadX-1;
            yClass=*sHeadY;
            *sHeadX-=1;
            break;
        }
    }
};


Есть координаты головы змеи которые будут изменяться по адресу внутри конструктора при создании нового элемента змеи, и есть направление:
C++
1
short xHead=1, yHead=1, dir=0;
И самое главное - это вектор змеи, тело которой будет состоять из элементов SnakePart
C++
1
vector<SnakePart> vSnake;
Как создать элемент вектора типа SnakePart? Имею в виду как передать параметры для создания нового элемента.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.03.2013, 18:33
Ответы с готовыми решениями:

Как передать в коллекцию объект класса или пользовательского типа?
Встречаю две взаимоисключающие ошибки: В модуле класса PublicNonCreatable &quot;Supplies&quot; Private x As spls Private supcol As...

Как создать в форме поле пользовательского типа?
Поля базовых типов создаются без проблем. Но когда пытаюсь создать поле моего типа возникает ошибка &quot;необъявленный идентификатор...

Как создать шаблон для пользовательского и встроенного типа?
Есть перегруженные операторы класса: void String::operator=(const char *a){ //Перегрпуженный оператор присваивания для типа char* ...

7
 Аватар для SummerRain
328 / 327 / 92
Регистрация: 16.12.2012
Сообщений: 544
17.03.2013, 18:43
C++
1
2
3
4
5
6
7
8
9
10
11
12
std::vector<SnakePart> vSnake;
 
    // добавление нового элемента
    SnakePart sp;
    vSnake.push_back(sp);
 
    // Если хотите добавить элемент с конкретными значениями
    vSnake.push_back(sp(1, 1, 0));
 
    // копирование   
    std::vector<SnakePart> newvSnake;
    std::copy(vSnake.begin(), vSnake.end(), std::back_inserter(newvSnake));
0
 Аватар для CollSpack
7 / 7 / 1
Регистрация: 21.01.2013
Сообщений: 55
17.03.2013, 19:11  [ТС]
Цитата Сообщение от SummerRain Посмотреть сообщение
// добавление нового элемента
* * SnakePart sp;
* * vSnake.push_back(sp);
Но нужно будет создавать много кусков змеи, не будет ли этот 1 кусок попросту пересоздаваться?
А можно как-то так:
C++
1
vSnake.push_back(new sp(&dir, &x, &y));
0
 Аватар для SummerRain
328 / 327 / 92
Регистрация: 16.12.2012
Сообщений: 544
17.03.2013, 19:24
не думаю, что так стоит делать. Этот элемент будет просто добавляться в вектор. И никуда он оттуда не денется.
Кстати, надо исправить
C++
1
vSnake.push_back(SnakePart(1, 1, 0));
само собой в классе SnakePart должен быть конструктор с 3-мя аргументами.
0
 Аватар для CollSpack
7 / 7 / 1
Регистрация: 21.01.2013
Сообщений: 55
18.03.2013, 00:06  [ТС]
Ниче не пойму. Вот весь код:
Кликните здесь для просмотра всего текста
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
// Snake.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <iostream>
#include <string>
#include <vector>
#include <conio.h>
using namespace std;
 
class SnakePart;
 
 
void DrawScreen (vector<SnakePart> snake)
{
    //задает в 2мерный массив местоположение всех частей змеи в нем
    char cPlayZone[50][50];
        for (int i=0; i<snake.size(); ++i)
        {
            short xX=snake[i].getLocationX(), yY=snake[i].getLocationY();
            cPlayZone[xX][yY]='X';
        }
 
    //выводит игровую зону обведенную #
    cout<<"####################################################"<<endl;
    for (int i=0; i<52; ++i)
    {
        cout<<"#";
        for (int j=0; j<50; ++j)
        {
            cout<<cPlayZone[i][j];
        }
        cout<<"#"<<endl;
    }
    cout<<"####################################################"<<endl;
}
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    short xHead=1, yHead=1, dir=77;
 
    //игровая зона состоящая из пробелов
    char cPlayZoneArray[50][50];
    for (int i=0; i<52; ++i)
        for (int j=0; j<52; ++j)
            cPlayZoneArray[i][j]=' ';
 
    vector<SnakePart> vSnake;
    
    
 
    for (bool bExit=true; bExit; )
    {
        vSnake.push_back(new SnakePart(dir, &xHead, &yHead));
        DrawScreen (vSnake);
    }
 
 
    return 0;
}
 
 
class SnakePart
{
private:
    short xClass;
    short yClass;
 
public:
    short getLocationX()
    {
        return xClass;
    }
    short getLocationY()
    {
        return yClass;
    }
 
    SnakePart (short iDirrection, short *sHeadX, short *sHeadY)
    {
        switch (iDirrection)
        {
        case 72: //up
            //создает голову змеи в новом месте
            xClass=*sHeadX;
            yClass=*sHeadY+1;
            //меняет координаты головы
            *sHeadY+=1;
            break;
        case 80: //down
            xClass=*sHeadX;
            yClass=*sHeadY-1;
            *sHeadY-=1;
            break;
        case 77: //right
            xClass=*sHeadX+1;
            yClass=*sHeadY;
            *sHeadX+=1;
            break;
        case 75: //left
            xClass=*sHeadX-1;
            yClass=*sHeadY;
            *sHeadX-=1;
            break;
        }
    }
    ~SnakePart();
};

Вот что пишет компилятор:
Кликните здесь для просмотра всего текста
1>------ Build started: Project: Snake, Configuration: Debug Win32 ------
1> Snake.cpp
1>f:\users\collspack\documents\visual studio 2010\projects\snake\snake\snake.cpp(18): warning C4018: '<' : signed/unsigned mismatch
1>f:\users\collspack\documents\visual studio 2010\projects\snake\snake\snake.cpp(20): error C2027: use of undefined type 'SnakePart'
1> f:\users\collspack\documents\visual studio 2010\projects\snake\snake\snake.cpp(11) : see declaration of 'SnakePart'
1>f:\users\collspack\documents\visual studio 2010\projects\snake\snake\snake.cpp(20): error C2228: left of '.getLocationX' must have class/struct/union
1>f:\users\collspack\documents\visual studio 2010\projects\snake\snake\snake.cpp(20): error C2027: use of undefined type 'SnakePart'
1> f:\users\collspack\documents\visual studio 2010\projects\snake\snake\snake.cpp(11) : see declaration of 'SnakePart'
1>f:\users\collspack\documents\visual studio 2010\projects\snake\snake\snake.cpp(20): error C2228: left of '.getLocationY' must have class/struct/union
1>f:\users\collspack\documents\visual studio 2010\projects\snake\snake\snake.cpp(56): error C2514: 'SnakePart' : class has no constructors
1> f:\users\collspack\documents\visual studio 2010\projects\snake\snake\snake.cpp(11) : see declaration of 'SnakePart'
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========


В чем дело? Как понять что класс без конструктора если он с конструктором? И вообще он сильно ругается на 20 строку...
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
18.03.2013, 00:34
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
// Snake.cpp : Defines the entry point for the console application.
//
 
#include <iostream>
#include <string>
#include <vector>
#include <conio.h>
using namespace std;
 
//!!!!!Класс SnakePart вынес перед main, чтобы можно было работать с ним.
class SnakePart
{
private:
    short xClass;
    short yClass;
 
public:
    short getLocationX()
    {
        return xClass;
    }
    short getLocationY()
    {
        return yClass;
    }
 
    SnakePart (short iDirrection, short *sHeadX, short *sHeadY)
    {
        switch (iDirrection)
        {
        case 72: //up
            //создает голову змеи в новом месте
            xClass=*sHeadX;
            yClass=*sHeadY+1;
            //меняет координаты головы
            *sHeadY+=1;
            break;
        case 80: //down
            xClass=*sHeadX;
            yClass=*sHeadY-1;
            *sHeadY-=1;
            break;
        case 77: //right
            xClass=*sHeadX+1;
            yClass=*sHeadY;
            *sHeadX+=1;
            break;
        case 75: //left
            xClass=*sHeadX-1;
            yClass=*sHeadY;
            *sHeadX-=1;
            break;
        }
    }
     ~SnakePart(){/*!!!!!Деструктор нужно определить!!!!!*/};
};
 
 
void DrawScreen (vector<SnakePart> snake)
{
    //задает в 2мерный массив местоположение всех частей змеи в нем
    char cPlayZone[50][50];
        for (int i=0; i<snake.size(); ++i)
        {
            short xX=snake[i].getLocationX(), yY=snake[i].getLocationY();
            cPlayZone[xX][yY]='X';
        }
 
    //выводит игровую зону обведенную #
    cout<<"####################################################"<<endl;
    for (int i=0; i<52; ++i)
    {
        cout<<"#";
        for (int j=0; j<50; ++j)
        {
            cout<<cPlayZone[i][j];
        }
        cout<<"#"<<endl;
    }
    cout<<"####################################################"<<endl;
}
 
 
 
int main()
{
    short xHead=1, yHead=1, dir=77;
 
    //игровая зона состоящая из пробелов
    char cPlayZoneArray[50][50];
    for (int i=0; i<52; ++i)
        for (int j=0; j<52; ++j)
            cPlayZoneArray[i][j]=' ';
 
    vector<SnakePart> vSnake;
    
    
 
    for (bool bExit=true; bExit; )
    {
        vSnake.push_back(SnakePart(dir, &xHead, &yHead));//!!!!!!!!!!!!!!В векторе объекты, а не указатели
        DrawScreen (vSnake);
    }
 
 
    return 0;
}
Добавлено через 1 минуту
В DrawScreen лучше передавать ссылку на вектор

Добавлено через 1 минуту
Цитата Сообщение от CollSpack Посмотреть сообщение
И вообще он сильно ругается на 20 строку...
Опережающее объявление класса лишь указывает, что такой класс есть, но не информирует о его методах и данных. Поэтому и получается ошибка, что класс не определен.
1
 Аватар для CollSpack
7 / 7 / 1
Регистрация: 21.01.2013
Сообщений: 55
18.03.2013, 17:24  [ТС]
Кое что опять не так... Сделал все как положено, все компилируется, программа запускается но после отрисовки игровой зоны появляется окно с этим:
Unhandled exception at 0x77b415de in Snake.exe: 0xC0000005: Access violation.

Смотрю на консоль, отрисовался массив обведенный #, но в него почему то не забилась сама змейка...
Вот весь код.
Кликните здесь для просмотра всего текста
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
// Snake.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <iostream>
#include <string>
#include <vector>
#include <conio.h>
using namespace std;
 
class SnakePart
{
private:
    short xClass;
    short yClass;
 
public:
    short getLocationX()
    {
        return xClass;
    }
    short getLocationY()
    {
        return yClass;
    }
 
    SnakePart (short iDirrection, short *sHeadX, short *sHeadY)
    {
        switch (iDirrection)
        {
        case 72: //up
            //создает голову змеи в новом месте
            xClass=*sHeadX;
            yClass=*sHeadY+1;
            //меняет координаты головы
            *sHeadY+=1;
            break;
        case 80: //down
            xClass=*sHeadX;
            yClass=*sHeadY-1;
            *sHeadY-=1;
            break;
        case 77: //right
            xClass=*sHeadX+1;
            yClass=*sHeadY;
            *sHeadX+=1;
            break;
        case 75: //left
            xClass=*sHeadX-1;
            yClass=*sHeadY;
            *sHeadX-=1;
            break;
        }
    }
};
 
 
void DrawScreen (vector<SnakePart> snake)
{
    //задает в 2мерный массив с пробелами местоположение всех частей змеи Х
    char cPlayZone[50][50];
    for (int i=0; i<52; ++i)
        for (int j=0; j<52; ++j)
            cPlayZone[i][j]=' ';
    for (int i=0; i<snake.size(); ++i)
    {
        short xX=snake[i].getLocationX(), yY=snake[i].getLocationY();
        cPlayZone[xX][yY]='X';
    }
 
    //выводит игровую зону обведенную #
    cout<<"####################################################"<<endl;
    for (int i=0; i<52; ++i)
    {
        cout<<"#";
        for (int j=0; j<50; ++j)
        {
            cout<<cPlayZone[i][j];
        }
        cout<<"#"<<endl;
    }
    cout<<"####################################################"<<endl;
}
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    short xHead=5, yHead=5, dir=77;
 
    
 
    vector<SnakePart> vSnake;
    
    
 
    for (bool bExit=true; bExit; )
    {
        SnakePart sp(dir, &xHead, &yHead);
        vSnake.push_back(sp);
        DrawScreen (vSnake);
        system("pause");
    }
 
 
    return 0;
}

По идее должна была хотябы отрисоваться змейка по координатам х=6 у=5...
0
 Аватар для SummerRain
328 / 327 / 92
Регистрация: 16.12.2012
Сообщений: 544
18.03.2013, 17:39
C++
1
2
3
4
char cPlayZone[50][50];
    for (int i=0; i<50; ++i)              // откуда там 52?
        for (int j=0; j<50; ++j)
            cPlayZone[i][j]=' ';
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.03.2013, 17:39
Помогаю со студенческими работами здесь

Удаление элемента из вектора пользовательского класса
Помогите, пожалуйста. Не могут понять, что я упускаю. При удалении элемента из вектора происходит краш. class some_class { public:...

Очистка вектора объектов пользовательского класса
Здравствуйте. Есть вектор std::vector&lt;Morphology*&gt; MorphCollection который заполняется следующим образом: Morphology *Morph = new...

Как создать STL stack объектов пользовательского класса?
Всем привет! Скажите пожалуйста, как создать STL stack объектов пользовательского класса в WinForm C++. У меня постоянно ругается на память...

Как создать динамически расширяемый массив объектов пользовательского типа (структура User)?
Здравствуйте, нужна ваша помощь с структурой ... Bот у меня пользователей при регистрации может быть ток 100 , как как сделать, чтоб был...

Как использовать stl для своего класса(для пользовательского типа данных)
Мне бы пример какой-нибудь а то в инете ищу ничего не могу найти, кроме базовых типов данных


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
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