这个私有变量如何“未在此范围内声明”?

时间:2011-01-20 05:40:15

标签: c++ oop scope sfml declare

我目前正在尝试更多地了解C ++中的面向对象设计(熟悉Java)并且正在进入一些墙。我试图在一个使用SFML构建的游戏中学习这些原理的项目用于图形和音频。我有以下两个文件。

WorldObject.h

#ifndef WORLDOBJECT_H
#define WORLDOBJECT_H
#include <SFML/Graphics.hpp>
#include <string>
#include "ImageManager.h"

class WorldObject
{
 private:
  sf::Sprite _sprite;
  void SetImagePath(std::string path);
  sf::Sprite GetGraphic();
};
#endif

WorldObject.cpp

#include "WorldObject.h"
void WorldObject::SetImagePath(std::string path)
{
  _sprite.SetImage(*gImageManager.getResource(path));
}

sf::Sprite GetGraphic()
{
  return _sprite;
}

我没有看到任何这些问题,但是当我尝试编译它们时,我从g ++收到以下错误:

WorldObject.cpp: In function ‘sf::Sprite GetGraphic()’:
WorldObject.cpp:9: error: ‘_sprite’ was not declared in this scope
make: *** [WorldObject.o] Error 1

此代码中缺少什么?试图理解设置继承层次结构的正确方法已经导致游戏开发中迄今为止遇到的大多数问题,但我知道这主要是因为我更习惯于使用Java的继承模型而不是C ++的多重模型。继承模型。

5 个答案:

答案 0 :(得分:11)

您在GetGraphics中定义的函数WorldObject.cpp不是WorldObject类的成员。使用

sf::Sprite WorldObject::GetGraphic()
{
  return _sprite;
}

而不是

sf::Sprite GetGraphic()
{
  return _sprite;
}

请注意,如果从程序中的某个位置调用此函数,C ++编译器只会抱怨缺少WorldObject::GetGraphic

答案 1 :(得分:2)

sf::Sprite GetGraphic()不正确,它声明了一个全局GetGraphic函数。由于GetGraphicclass WorldObject的函数,因此它应为sf::Sprite WorldObject::GetGraphic()

答案 2 :(得分:0)

我没有做太多C ++,但我认为在WorldObject.cpp中你需要WorldObject::GetGraphic而不是GetGraphic

答案 3 :(得分:0)

我相信你的意思是:

sf :: Sprite WorldObject :: GetGraphic()

sf :: Sprite GetGraphic()

在WorldObject.cpp

答案 4 :(得分:0)

// `GetGraphic()` is a member function of `WorldObject` class. So, you have two options to correct-
//Either define the functionality of `GetGraphic()` in the class definition itself. 

#ifndef WORLDOBJECT_H
#define WORLDOBJECT_H
#include <SFML/Graphics.hpp>
#include <string>
#include "ImageManager.h"

class WorldObject
{
    private:
    sf::Sprite _sprite;
    void SetImagePath(std::string path);
    sf::Sprite GetGraphic()  // Option 1
    {
         return _sprite;
    }
};
#endif

//When providing the member function definition, you need to declare that it is in class scope.  
// Option 2 => Just prototype in class header, but definition in .cpp
sf::Sprite WorldObject::GetGraphic() 
{  
    return _sprite;  
}