2011-01-20 56 views
4

我目前正試圖在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++的多元繼承模型。

回答

9

您在WorldObject.cpp中定義的函數GetGraphics不是WorldObject類的成員。使用

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

,而不是

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

注意,C++編譯器只是抱怨缺少WorldObject::GetGraphic如果這個功能是從某處在你的程序調用。

2

sf::Sprite GetGraphic()是不正確的,它宣佈全球GetGraphic函數。由於GetGraphicclass WorldObject的函數,因此它應該是sf::Sprite WorldObject::GetGraphic()

0

我沒有做太多的C++,但我認爲你需要WorldObject::GetGraphic而不是在WorldObject.cpp中的GetGraphic

0

我相信你的意思有:

SF ::雪碧WorldObject :: GetGraphic()

SF ::雪碧GetGraphic()

在WorldObject.cpp

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; 
}