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

时间:2013-02-04 19:32:38

标签: c++ dev-c++ undeclared-identifier

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

2 个答案:

答案 0 :(得分:3)

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

要做到这一点,请为Draw提供const Snake&类型的参数,“const Snake的引用”(如果constEndSnake,则删除constbool 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);