Trouble accessing a vector's object's member functions

Hi all,

I'm making a basic vertical scrolling car game that creates a vector of objects (enemies), and then accessing the member functions of them. I'm also using SDL for some graphics. So far I have this as the class:
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
class enemyCar
{
    private:
    int number;
    int xPos, yPos;
    int yVel;
    int CAR_WIDTH;
    SDL_Surface *sprite;

    public:
    enemyCar() {
        number=carCounter;
        yPos=300;
        CAR_WIDTH=5;
        generateSprite();
    }
    ~enemyCar() {
        enemies.erase(enemies.begin()+carCounter);
        delete sprite;
    }

    void generateSprite() {
        srand(SDL_GetTicks());
        int random=(rand()/2);
        if (random==0) {
            sprite=IMG_Load("data/Sprites/car1.png");
        }
        else if (random==1) {
            sprite=IMG_Load("data/Sprites/car2.png");
        }
    }

    void show() {
        apply_surface(xPos, yPos, sprite, screen);
    }

    void move() {
        yPos-=yVel;
    }

    void setXpos(int column) {
        xPos=column;
    }
};

I also have a global integer carCounter that increments whenever a car is created.

I can see nothing wrong with the class, but having made my vector (vector<enemyCar> enemies;) which is global, by the way, I try to access it as such:
enemies[carCounter].setXpos(100);
It declares 'error: cannot resolve address of overloaded function'.

Not quite sure what it means but it's stopping me from completing this.

Any help is appreciated,
hnefatl
The only issue I see in that code segment is you are not meant to delete SDL_Surfaces, you use SDL_FreeSurface() (line 19) but I am not sure if that is causing the problem here.

If that does not fix it posting more of your code might show the problem.
Thanks for that info; I've corrected it now. This is all my code. I've got no header files, just main.cpp.

Also I apologize for not including comments; I tend not to as I can remember what I was doing and tend to be able to solve errors for myself.

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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
#include "SDL/SDL.h"
#include "SDL/SDL_Image.h"
#include "SDL/SDL_TTF.h"
#include "SDL/SDL_Mixer.h"
#include <string>
#include <sstream>
#include <fstream>
#include <vector>

const int SCREEN_WIDTH=210;
const int SCREEN_HEIGHT=375;
const int SCREEN_BPP=32;
const int FRAMES_PER_SECOND=20;

int carCounter=0;

SDL_Surface *screen=NULL;
SDL_Surface *road=NULL;
SDL_Surface *car1=NULL;
SDL_Surface *car2=NULL;
SDL_Surface *car3=NULL;
SDL_Surface *background=NULL;
TTF_Font *font;

SDL_Event event;

class playerCar;
class enemyCar;

std::vector <enemyCar> enemies;

void update();
bool init();
bool load_files();
void apply_surface(int x, int y, SDL_Surface *source, SDL_Surface *destination);
void clean_up();
bool save();
bool load();
void generate_wave();

class playerCar
{
    private:
    int xPos, yPos;
    int xVel;
    int CAR_WIDTH;
    SDL_Surface *sprite;

    public:
    playerCar() {
        yPos=300;
        xPos=105;
        CAR_WIDTH=5;
        sprite=IMG_Load("data/Sprites/car1.png");
    }
    ~playerCar() {
        SDL_FreeSurface(sprite);
    }
    void show() {
        apply_surface(xPos, yPos, sprite, screen);
    }

    void handle_input() {
        if (event.type==SDL_KEYDOWN) {
            switch (event.key.keysym.sym) {
                case SDLK_RIGHT: xVel+=CAR_WIDTH/2; break;
                case SDLK_LEFT: xVel-=CAR_WIDTH/2; break;
                default: ;
            }
        }

        if (event.type==SDL_KEYUP) {
            switch (event.key.keysym.sym) {
                case SDLK_RIGHT: xVel-=CAR_WIDTH/2; break;
                case SDLK_LEFT: xVel+=CAR_WIDTH/2; break;
                default: ;
            }
        }
    }

    void move() {
        xPos+=xVel;

        if ((xPos<0) or (xPos+42>SCREEN_WIDTH)) {
            xPos-=xVel;
        }
    }
};

class enemyCar
{
    private:
    int number;
    int xPos, yPos;
    int yVel;
    int CAR_WIDTH;
    SDL_Surface *sprite;

    public:
    enemyCar() {
        number=carCounter;
        yPos=300;
        CAR_WIDTH=5;
        generateSprite();
    }
    ~enemyCar() {
        enemies.erase(enemies.begin()+carCounter);
        SDL_FreeSurface(sprite);
    }

    void generateSprite() {
        srand(SDL_GetTicks());
        int random=(rand()/2);
        if (random==0) {
            sprite=IMG_Load("data/Sprites/car1.png");
        }
        else if (random==1) {
            sprite=IMG_Load("data/Sprites/car2.png");
        }
    }

    void show() {
        apply_surface(xPos, yPos, sprite, screen);
    }

    void move() {
        yPos-=yVel;
    }

    void setXpos(int column) {
        xPos=column;
    }
};

playerCar player;

int main(int argc, char* args[]) {
    bool quit=false;
    if (!init()) {
        return 0;
    }

    while (quit==false) {
        while (SDL_PollEvent(&event)) {

            player.handle_input();

            if (event.type==SDL_QUIT) {
                return 0;
            }
        }

        player.move();

        apply_surface(0, 0, background, screen);
        apply_surface(0, 0, road, screen);

        player.show();

        update();
    }

    clean_up();

    return 1;
}

void generate_wave() {
    int random=0;
    int temp=SDL_GetTicks();
    srand(temp);
    random=(rand()/5);
    if (random==0) {
        enemies.push_back(carCounter);
        enemies[carCounter].setXpos;
    }
}

void apply_surface(int x, int y, SDL_Surface* source, SDL_Surface* destination) {
    SDL_Rect offset;
    offset.x=x;
    offset.y=y;

    SDL_BlitSurface(source, NULL, destination, &offset);
}

void update() {
    SDL_Flip(screen);
}

bool init() {
    if (SDL_Init(SDL_INIT_EVERYTHING)==-1) {
        return false;
    }

    if (TTF_Init()==-1) {
        return false;
    }

    if (Mix_OpenAudio(22050, MIX_DEFAULT_FORMAT, 2, 4096)==-1) {
        return false;
    }
    screen=SDL_SetVideoMode(SCREEN_WIDTH+200, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE);

    if (screen==NULL) {
        return false;
    }

    if (load_files()==false) {
        return false;
    }

    SDL_WM_SetCaption("Road Rage", NULL);

    return true;
}

bool load_files() {
    road=IMG_Load("data/Sprites/road.png");
    car1=IMG_Load("data/Sprites/car1.png");
    car2=IMG_Load("data/Sprites/car2.png");
    car3=IMG_Load("data/Sprites/car3.png");
    background=IMG_Load("data/Sprites/background.png");
    font=TTF_OpenFont("data/Fonts/Font1.ttf", 28);

    if (road==NULL or car1==NULL or car2==NULL or car3==NULL or font==NULL) {
        SDL_Delay(1000);
        return false;
    }
    return true;
}

void clean_up() {
    SDL_FreeSurface(road);
    SDL_FreeSurface(car1);
    SDL_FreeSurface(car2);
    SDL_FreeSurface(car3);
    SDL_FreeSurface(background);
    TTF_CloseFont(font);

    Mix_CloseAudio();
    TTF_Quit();
    SDL_Quit();
}


I'm not using SDL_Mixer or SDL_TTF, I've just got them there for when I need them later.

I'm recieving 2 errors:
error: no matching function for call to 'std::vector<enemyCar, std::allocator<enemyCar> >::push_back(int&)'|
and
error: statement cannot resolve address of overloaded function
You try to pass an int to std::vector<enemyCar>::push_push. You must pass it a enemyCar.
Thanks a lot!

I'd forgotten about that, and I'd forgotten to put brackets after my call to enemyCar.setXpos(int), as well as not passing it parameter!

Thanks again for your help,
hnefatl

SOLVED
Topic archived. No new replies allowed.