所以,我正在尝试编译我的代码,但编译器一直在抱怨“'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 :(得分:3)
在Draw
函数中,没有声明名为mysnake
的变量。该函数无法看到mysnake
中声明的main
,因为它是 local 到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);
,而不是{{1}},但这取决于您。
答案 1 :(得分:0)
在mysnake
中声明main
的事实不允许人们在Prog
中使用它。您可能希望将对mysnake的引用传递给Draw方法。
通过构造函数或通过调用方法。
Prog run(mysnake);
run.draw();
或
run.draw(mysnake);