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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
CollSpack
7 / 7 / 0
Регистрация: 21.01.2013
Сообщений: 55
#1

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

17.03.2013, 18:33. Просмотров 867. Ответов 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? Имею в виду как передать параметры для создания нового элемента.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.03.2013, 18:33     Как создать элемент вектора пользовательского типа(класса)?
Посмотрите здесь:
C++ Как создать шаблон для пользовательского и встроенного типа?
C++ Как сравнить элемент вектора и переменную типа wchar_t?
Найти наименьший элемент массива объектов пользовательского типа C++
C++ Создать динамический массив объектов пользовательского типа
C++ Хранение вектора экземпляров шаблонного класса неизвестного типа
Написать функцию для класса, возращающую данный из вектора обьектов класса по итератору вектора C++
C++ Как вызвать метод из указателя на вектор пользовательского типа?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
SummerRain
326 / 325 / 17
Регистрация: 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));
CollSpack
7 / 7 / 0
Регистрация: 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));
SummerRain
326 / 325 / 17
Регистрация: 16.12.2012
Сообщений: 544
17.03.2013, 19:24     Как создать элемент вектора пользовательского типа(класса)? #4
не думаю, что так стоит делать. Этот элемент будет просто добавляться в вектор. И никуда он оттуда не денется.
Кстати, надо исправить
C++
1
vSnake.push_back(SnakePart(1, 1, 0));
само собой в классе SnakePart должен быть конструктор с 3-мя аргументами.
CollSpack
7 / 7 / 0
Регистрация: 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 строку...
Croessmah
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 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 строку...
Опережающее объявление класса лишь указывает, что такой класс есть, но не информирует о его методах и данных. Поэтому и получается ошибка, что класс не определен.
CollSpack
7 / 7 / 0
Регистрация: 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...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.03.2013, 17:39     Как создать элемент вектора пользовательского типа(класса)?
Еще ссылки по теме:
C++ Как привести объект пользовательского типа к заданному встроенному типу?
Как правильно передать массив объектов пользовательского типа в функцию? C++
Как заставить std::set хранить объекты пользовательского типа? C++
Как правильно инициализировать динамический массив пользовательского класса C++
Можно ли присвоить объекту основного типа значение объекта пользовательского типа? C++

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

Или воспользуйтесь поиском по форуму:
SummerRain
326 / 325 / 17
Регистрация: 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]=' ';
Yandex
Объявления
18.03.2013, 17:39     Как создать элемент вектора пользовательского типа(класса)?
Ответ Создать тему
Опции темы

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