2014-01-25 81 views
0

我在SDL2中创建了一个简单的游戏并学习了C++类,但是我在使用私有变量和类构造函数时遇到了困难。我试图访问定义为私有变量的SDL_Texture,并在构造函数中对其进行修改。无法从构造函数访问私有变量 - 不在范围内(C++)

在汇编下面的代码将导致以下错误:

In constructor 'PlayerShip::PlayerShip(SDL_Texture*)': |5| error: 'ShipSprite' was not declared in this scope

头文件(PlayerShip.h):

#ifndef PLAYERSHIP_H 
#define PLAYERSHIP_H 

#include "SDL2/SDL.h" 

class PlayerShip 
{ 
    public: 
     PlayerShip(SDL_Texture * tex); 
    private: 
     SDL_Texture * ShipSprite = nullptr; //The variable/texture I want to modify 
}; 
#endif 

CPP文件(PlayerShip.cpp)

#include "PlayerShip.h" 

PlayerShip::PlayerShip(SDL_Texture * tex) //ctor 
{ 
    ShipSprite = tex; //This needs to change the private variable above. However "ShipSprite" is apparently not in scope. 
} 

它是在头文件中定义的,但我不确定它为什么会赢得'即使它在课堂内部也可以访问它。我试着寻找解决这个问题的方法,但是我发现的问题与我的问题没有关系。

在此之上,我试图改变ShipSprite = tex;以下内容,但没有成功: PlayerShip::ShipSprite = tex;this->ShipSprite = tex;

的任何想法,将不胜感激。谢谢。

+1

编译器给你带来的* only *错误吗? –

+0

这听起来像你可能有多个文件名为'PlayerShip.h' –

+0

@BenVoigt是的,这是我得到的唯一错误,我检查了重复的文件,找不到任何。 – iownall555

回答

0

见,如果你不定义包括后卫(#ifndef PLAYERSHIP_H)其他地方。

此外,检查minGW的输出,它使用哪个文件,也许你的假设是错误的?你也可以做快速和肮脏的调试,比如在你的头文件中引入一个语法错误。如果它未被捕获,则甚至不使用该文件。

除此之外,我建议一些其他的东西(无关你的问题):

  • 有成员变量的命名约定是从类名称的不同。 ShipSprite可能是shipSprite_,m_shipSprite,shipSprite或你有什么。 (一套好的建议:http://geosoft.no/development/cppstyle.html

  • 如果你想初始化成员变量,那么首先要用构造函数初始化列表来完成。编号: PlayerShip::PlayerShip(SDL_Texture * tex) : ShipSprite(tex) { }如果您对自己想要做的更精确,编译器可能会更有帮助。

1

取决于编译器的最新版本,它可能不接受不具有整数类型的非静态成员的初始化。或者它可能不知道关键字nullptr

SDL_Texture * ShipSprite = nullptr; 

尝试,而不是

SDL_Texture * ShipSprite; 
+0

它似乎没有工作。我仍然遇到同样的错误。至于我的编译器,我使用MinGW和GCC 4.8.2,并且我设置了C++ 11标志。 – iownall555

-1

这样看来,我可能不小心单独编译头文件之前,我增加了变量,它在同一文件夹中我的头部留下了PlayerShip.gch文件。海湾合作委员会可能试图使用它而不是正常的头文件,因此给了我那个错误。

尽管如此删除。gch文件似乎已经解决了我的问题,现在程序编译正确。不知道我是如何完全错过的。

再次感谢大家的建议和帮助。

编辑:我该如何去关闭这个?

+0

似乎你的假设对于minGW使用哪些文件是错误的,而且它会通过建议的“在头文件中引入语法错误”来确认这一点,更不用说“检查minGW的输出了,它使用哪个文件”。他们都似乎符合我上面提供的答案。您可以将您发现的解决方案描述为对我的答案的评论,并接受它。或者,你可以接受你自己的答案。 PS:如果你的编译系统不能自动更新预编译头文件,那么你应该尽快修复这个问题,因为它会给你带来很多麻烦。 – swalog