我正在尝试使用 Irrlicht 编写游戏代码,但在将代码分成 .h 和 .cpp 文件时遇到了这个问题。
编译器中的主要错误是“节点在此上下文中受到保护”。 节点是“GameObjectOverworld”的属性,并从“Player”(GameObjectOverworld 子类)调用
在我将 .h 和 .cpp 文件中的代码分开之前,这工作正常。
GameObjectOverworld.h
#ifndef __GAMEOBJECTOVERWORLD_H__
#define __GAMEOBJECTOVERWORLD_H__
#include <irrlicht.h>
#include <stdio.h>
#include "GameObject.h"
class GameObjectOverWorld : public GameObject{
protected:
scene::ISceneNode* node = nullptr;
public:
GameObjectOverWorld() {}
core::vector3df getPosition(){return node->getPosition();}
};
#endif
播放器.h
#ifndef __PLAYER_H__
#define __PLAYER_H__
#include <irrlicht.h>
#include <stdio.h>
#include "GameObject.h"
#include "GameObjectOverworld.h"
using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;
class Player : public GameObjectOverWorld{
private:
std::string name ="";
float speed = 15.0f;
public:
Player() = default;
void addPlayerModel(ISceneManager* smgraux, IVideoDriver* driveraux){}
void move (char axis, int direction, float frameDeltaTime){}
};
#endif
和 player.cpp(发送错误的那个)
#include "Player.h"
void addPlayerModel(ISceneManager* smgraux, IVideoDriver* driveraux){
Player::node = smgraux->addCubeSceneNode(10.0f, 0, 0, core::vector3df(15.0f, 0.0f, 45.0f), core::vector3df(0, 0, 0), core::vector3df(1.0f, 1.0f, 1.0f));
if (node)
{
node->setMaterialTexture(0, driveraux->getTexture("Materials/madero.jpg"));
node->setMaterialFlag(video::EMF_LIGHTING, false);
}
}
最佳答案
您忘记将方法 addPlayerModel
链接到类:
改变:
void addPlayerModel(ISceneManager* smgraux, IVideoDriver* driveraux)
到
void Player::addPlayerModel(ISceneManager* smgraux, IVideoDriver* driveraux)
还要将 Player::node
更改为 this->node
,因为您的“节点”属性不是静态的。
关于c++ - "Attribute is protected within this context"具有继承和 .h 和 .cpp 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49210604/