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

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

Восстановить пароль Регистрация
 
CollSpack
 Аватар для CollSpack
7 / 7 / 0
Регистрация: 21.01.2013
Сообщений: 55
17.03.2013, 18:33     Как создать элемент вектора пользовательского типа(класса)? #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
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? Имею в виду как передать параметры для создания нового элемента.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
SummerRain
 Аватар для SummerRain
325 / 324 / 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
 Аватар для 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
 Аватар для SummerRain
325 / 324 / 17
Регистрация: 16.12.2012
Сообщений: 544
17.03.2013, 19:24     Как создать элемент вектора пользовательского типа(класса)? #4
не думаю, что так стоит делать. Этот элемент будет просто добавляться в вектор. И никуда он оттуда не денется.
Кстати, надо исправить
C++
1
vSnake.push_back(SnakePart(1, 1, 0));
само собой в классе SnakePart должен быть конструктор с 3-мя аргументами.
CollSpack
 Аватар для 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
Модератор
Эксперт С++
 Аватар для Croessmah
11822 / 6801 / 769
Регистрация: 27.09.2012
Сообщений: 16,870
Записей в блоге: 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 строку...
Опережающее объявление класса лишь указывает, что такой класс есть, но не информирует о его методах и данных. Поэтому и получается ошибка, что класс не определен.
CollSpack
 Аватар для 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++ Как сравнить элемент вектора и переменную типа wchar_t?
Создать в классе поле типа другого класса C++
C++ Как создать шаблон для пользовательского и встроенного типа?

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

Или воспользуйтесь поиском по форуму:
SummerRain
 Аватар для SummerRain
325 / 324 / 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     Как создать элемент вектора пользовательского типа(класса)?
Ответ Создать тему
Опции темы

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