我正在SDL2中创建一个简单的游戏并学习C ++类,但是我对私有变量和类构造函数有困难。我正在尝试访问定义为私有变量的SDL_Texture
并在构造函数中对其进行修改。
编译后,下面的代码会导致以下错误:
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;
对此的任何想法将不胜感激。感谢。
答案 0 :(得分:1)
根据编译器的最新版本,它可能不接受没有整数类型的非静态成员的初始化。或者它可能不知道关键字nullptr
。
SDL_Texture * ShipSprite = nullptr;
尝试改为
SDL_Texture * ShipSprite;
答案 1 :(得分:0)
看看你是否在其他地方没有定义包含守卫(#ifndef PLAYERSHIP_H
)。
另外,检查minGW的输出,它使用哪些文件,也许你的假设是错误的?您还可以执行快速和脏的调试,例如在头文件中引入语法错误。如果没有捕获,则甚至不使用该文件。
除此之外,我还建议了一些其他的事情(与你的问题无关):
具有与类名不同的成员变量的命名约定。 ShipSprite可以是shipSprite_,m_shipSprite,shipSprite或者你有什么。 (一组很好的建议:http://geosoft.no/development/cppstyle.html)
如果要初始化成员变量,请使用构造函数初始化列表进行初始化。即:
PlayerShip::PlayerShip(SDL_Texture * tex) : ShipSprite(tex) {
}
如果您对要做的事情更精确,编译器可能会更有帮助。
答案 2 :(得分:-1)
在我添加变量之前,我可能会意外地单独编译头文件,并且在我的标题的同一文件夹中留下了PlayerShip.gch
文件。 GCC可能试图使用它而不是普通的头文件,因此给了我这个错误。
尽管如此,删除.gch文件似乎已经解决了我的问题,现在程序正确编译。不知道我是怎么完全错过的。
再次感谢大家的建议和帮助。
编辑:如何关闭此内容?