C++ C++;未声明的类实例标识符

C++ C++;未声明的类实例标识符,c++,dev-c++,undeclared-identifier,C++,Dev C++,Undeclared Identifier,因此,我试图编译我的代码,但编译器一直抱怨“'mysnake'未声明(首先使用此函数)”,但我声明了它。 这是我的Main.cpp,wehre它被声明了 #include "Class.h" #include "Snake.h" int main(int argc, char* args[]){ Prog run; if((run.Init())==false){ return(1); } Snake mysnake; if(run.Lo

因此,我试图编译我的代码,但编译器一直抱怨“'mysnake'未声明(首先使用此函数)”,但我声明了它。 这是我的Main.cpp,wehre它被声明了

#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”的文件)

#包括“Class.h”
#包括
#包括“Snake.h”
bool Prog::Draw(){
std::stringstream消息;
垂直位置;
SDL_BlitSurface(图像,空,屏幕,空);
int s=mysnake.EndSnake();

消息在
main
中声明了
mysnake
这一事实不允许在
Prog
中使用它。您可能希望将对mysnake的引用传输到Draw方法。 通过构造函数或方法调用

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


mysnake
main
中声明的事实不允许在
Prog
中使用它。您可能希望将对mysnake的引用传输到Draw方法。 通过构造函数或方法调用

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


Draw
函数中,没有声明名为
mysnake
的变量。该函数无法看到
main
中声明的
mysnake
,因为它是
main
的本地变量。您需要将
mysnake
对象传递给
Draw
函数,以便它知道您是哪条蛇实际上是在谈论

为此,给
Draw
一个类型为
const Snake&
的参数,一个“对
const Snake
的引用”(如果
EndSnake
是非
const
成员函数,则去掉
const
):

main
中调用
Draw
时,请执行以下操作:

run.draw(mysnake);
现在,您的
Draw
函数有一个名为
snake
的变量,该变量是从
main
传入的。由于参数是引用,因此它看到的
snake
对象与
main
中的对象完全相同。如果参数的类型是
snake
而不是
const snake&
,则n您可以从
main
获取
mysnake
的副本


一些额外的建议:


我们通常编写类似于
(run.Init())==false的条件,就像
!run.Init()
-它读起来好多了。Returning也通常写为
return true;
,而不是
return(true)
,但这取决于您。

在您的
Draw
函数中没有声明名为
mysnake
的变量。该函数看不到在
main
中声明的
mysnake
,因为它是
main
的本地变量。您需要将
mysnake
对象传递给
Draw
函数它知道你说的是哪条蛇

为此,给
Draw
一个类型为
const Snake&
的参数,一个“对
const Snake
的引用”(如果
EndSnake
是非
const
成员函数,则去掉
const
):

main
中调用
Draw
时,请执行以下操作:

run.draw(mysnake);
现在,您的
Draw
函数有一个名为
snake
的变量,该变量是从
main
传入的。由于参数是引用,因此它看到的
snake
对象与
main
中的对象完全相同。如果参数的类型是
snake
而不是
const snake&
,则n您可以从
main
获取
mysnake
的副本


一些额外的建议:


我们通常编写类似于
(run.Init())==false的条件,就像
!run.Init()
-它读起来好多了。Returning也通常写为
return true;
,而不是
return(true);
,但这取决于您。

您在一个函数中声明的内容不会在每个函数中传播。这会导致极端的名称冲突问题。chris刚才所说的,mysnake对象在该文件中是未知的。您在一个函数中声明的内容不会在每个函数中传播。这会导致极端的名称冲突问题。chris just说,mysnake对象在该文件中是未知的。谢谢,不知怎的,我认为类的实例在默认情况下是全局的…显然我错了:DThanks,不知怎的,我认为类的实例在默认情况下是全局的…显然我错了:D
run.draw(mysnake);