dev C ++ идентификатор экземпляра класса необъявленный

Итак, я пытаюсь скомпилировать свой код, но компилятор продолжает жаловаться, что «mysnake» не объявлен (сначала используйте эту функцию) », но я объявил это.
Это мой Main.cpp, где он объявлен.

#include "Class.h"#include "Snake.h"
int main(int argc, char* args[]){
Prog run;
if((run.Init())==false){
return(1);
}
Snake mysnake;
if(run.LoadFiles()==false){
return(1);
}
run.MainLoop();
if(run.Draw()==false){
return(1);
}
run.CleanUp();
return(0);
}

И этот файл заставляет компилятор жаловаться (AFAIK это первый файл с любой ссылкой на «mysnake», который компилируется)

#include "Class.h"#include<sstream>
#include "Snake.h"
bool Prog::Draw(){
std::stringstream message;
SDL_Rect position;
SDL_BlitSurface(image, NULL, screen, NULL);
int s=mysnake.EndSnake();
message<<"Your snake was "<<s<<" blocks long.";
msg=TTF_RenderText_Solid(font, message.str().c_str(), font_color);
if(msg==NULL){
return(false);
}
position.x=(WWIDTH-msg->w)/2;
position.y=(WHEIGHT-msg->h)/2;
SDL_BlitSurface(msg, NULL, screen, &position);
SDL_Flip(screen);
return(true);
}

Я думал об этом больше часа и до сих пор не могу понять, почему он это делает. Кстати, я использую Bloodshed Dev C ++
Я был бы очень благодарен за помощь.

0

Решение

Внутри вашего Draw функция не существует объявленной переменной mysnake, Эта функция не может видеть mysnake это объявлено в main потому что это так местный в main, Вы должны передать mysnake возражать против Draw Функция так, чтобы он знал, о какой змеи вы на самом деле говорите.

Для этого дайте Draw аргумент типа const Snake&, ссылка на const Snake«(или забрать const если EndSnake это неconst функция-член):

bool Prog::Draw(const Snake& snake) {
// ...
}

И когда вы звоните Draw в main, сделай это:

run.draw(mysnake);

Теперь ваш Draw функция имеет переменную под названием snake который был передан из main, Поскольку аргумент является ссылкой, Snake объект, который он видит, является точно таким же объектом, как в main, Если аргумент был типа Snake вместо const Snake&тогда вы получите копию mysnake от main,


Несколько дополнительных советов:

Мы обычно пишем такие условия, как (run.Init())==false как раз !run.init() — это читается намного лучше. Возвращение также обычно пишется как return true;, скорее, чем return(true);, но это зависит от вас.

3

Другие решения

Дело в том, что mysnake объявлен в main не позволяет использовать его в Prog, Вы, вероятно, хотите передать ссылку на mysnake в метод Draw.
Через конструктор или через вызов метода.

Prog run(mysnake);
run.draw();

или же

run.draw(mysnake);
0

По вопросам рекламы [email protected]