Итак, я пытаюсь скомпилировать свой код, но компилятор продолжает жаловаться, что «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 ++
Я был бы очень благодарен за помощь.
Внутри вашего 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);
, но это зависит от вас.
Дело в том, что mysnake
объявлен в main
не позволяет использовать его в Prog
, Вы, вероятно, хотите передать ссылку на mysnake в метод Draw.
Через конструктор или через вызов метода.
Prog run(mysnake);
run.draw();
или же
run.draw(mysnake);