无法从构造函数访问私有变量 - 不在范围内(C ++)

时间:2014-01-25 06:21:52

标签: c++ oop sdl-2

我正在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;

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

3 个答案:

答案 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文件似乎已经解决了我的问题,现在程序正确编译。不知道我是怎么完全错过的。

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

编辑:如何关闭此内容?