7

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

世界对象.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

世界对象.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++ 的多重继承模型。继承模型。

4

5 回答 5

13

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

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

代替

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

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

于 2011-01-20T05:50:09.047 回答
2

sf::Sprite GetGraphic()不正确,它是在声明一个全局GetGraphic函数。既然GetGraphicclass WorldObject它应该是的函数sf::Sprite WorldObject::GetGraphic()

于 2011-01-20T05:49:38.827 回答
0

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

于 2011-01-20T05:50:31.543 回答
0

我相信你的意思是:

sf::Sprite WorldObject::GetGraphic()

不是

sf::Sprite GetGraphic()

在 WorldObject.cpp 中

于 2011-01-20T05:56:32.200 回答
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;  
}
于 2011-01-20T05:58:20.760 回答