0

所以,我正在尝试编译我的代码,但编译器一直抱怨“'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++,非常感谢您的帮助。

4

2 回答 2

3

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

要做到这一点,给Draw一个类型的参数const Snake&,一个“引用const Snake”(或者去掉constifEndSnake是一个非const成员函数):

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

当您致电Drawmain,请执行以下操作:

run.draw(mysnake);

现在你的Draw函数有一个名为的变量snake,它是从main. 因为参数是一个引用,所以Snake它看到的对象与 中的对象完全相同main。如果参数是 typeSnake而不是const Snake&,那么您将获得mysnakefrom的副本main


一些额外的建议:

我们通常写条件,就像这样(run.Init())==false-!run.init()它读起来要好得多。Returning 通常也写成return true;, 而不是return(true);, 但这取决于你。

于 2013-02-04T19:36:11.313 回答
0

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

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

或者

run.draw(mysnake);
于 2013-02-04T19:35:59.800 回答