Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
CollSpack
7 / 7 / 1
Регистрация: 21.01.2013
Сообщений: 55
1

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

17.03.2013, 18:33. Просмотров 992. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.03.2013, 18:33
Ответы с готовыми решениями:

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

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

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

Как сравнить элемент вектора и переменную типа wchar_t?
Имеется vector&lt;wstring&gt; a; и переменная wchar_t *sss; также создан итератор...

Найти наименьший элемент массива объектов пользовательского типа
Помогите, пожалуйста. Нужно ввести размер массива и его элементы, а программа...

7
SummerRain
327 / 326 / 92
Регистрация: 16.12.2012
Сообщений: 544
17.03.2013, 18:43 2
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  [ТС] 3
Цитата Сообщение от SummerRain Посмотреть сообщение
// добавление нового элемента
* * SnakePart sp;
* * vSnake.push_back(sp);
Но нужно будет создавать много кусков змеи, не будет ли этот 1 кусок попросту пересоздаваться?
А можно как-то так:
C++
1
vSnake.push_back(new sp(&dir, &x, &y));
0
SummerRain
327 / 326 / 92
Регистрация: 16.12.2012
Сообщений: 544
17.03.2013, 19:24 4
не думаю, что так стоит делать. Этот элемент будет просто добавляться в вектор. И никуда он оттуда не денется.
Кстати, надо исправить
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  [ТС] 5
Ниче не пойму. Вот весь код:
Кликните здесь для просмотра всего текста
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
++Ͻ
14610 / 8364 / 1576
Регистрация: 27.09.2012
Сообщений: 20,558
Записей в блоге: 2
Завершенные тесты: 1
18.03.2013, 00:34 6
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  [ТС] 7
Кое что опять не так... Сделал все как положено, все компилируется, программа запускается но после отрисовки игровой зоны появляется окно с этим:
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
327 / 326 / 92
Регистрация: 16.12.2012
Сообщений: 544
18.03.2013, 17:39 8
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
18.03.2013, 17:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.03.2013, 17:39

Создать динамический массив объектов пользовательского типа
Есть класс class address { } Нужно создать динамический массив...

Хранение вектора экземпляров шаблонного класса неизвестного типа
Здравствуйте! Потребовалось хранить вектор экземпляров шаблонного класса...

Написать функцию для класса, возращающую данный из вектора обьектов класса по итератору вектора
День=добрый как написать функцию для класса возращающую данный из вектора...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru