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

Posted

技术标签:

【中文标题】C++ 类实例标识符未声明【英文标题】:C++ class instance identifier undeclared 【发布时间】:2013-02-04 19:32:38 【问题描述】:

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

【问题讨论】:

您在一个函数中声明的内容不会传播到每个函数中。这会导致极端的名称冲突问题。 chris 刚才说的,mysnake 对象在那个文件中是未知的。 【参考方案1】:

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

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

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

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

run.draw(mysnake);

现在您的Draw 函数有一个名为snake 的变量,它是从main 传入的。因为参数是一个引用,所以它看到的Snake 对象与main 中的对象完全相同。如果参数的类型是 Snake 而不是 const Snake&amp;,那么您会从 main 获得 mysnake 的副本。


一些额外的建议:

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

【讨论】:

谢谢,不知何故,我知道类的实例默认是全局的......显然我错了:D【参考方案2】:

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

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

run.draw(mysnake);

【讨论】:

以上是关于C++ 类实例标识符未声明的主要内容,如果未能解决你的问题,请参考以下文章

用户创建的类对象实例化的未声明标识符

C++ Visual Studio 2008 中未声明的标识符

在Visual Studio中使用C ++类 - 未声明的标识符错误[重复]

未声明 Visual c++ 标识符

C++ 对象未声明标识符

我在 Visual Studio C++ 中遇到这些错误:“NuovoUtente”:未声明的标识符和“CercareUtente”:未声明的标识符 [关闭]