class Game {
private:
string title;
bool running;
State currentState;
public:
sf::RenderWindow window;
void setup();
void run();
};
我有一个名为currentState的变量。这是州:
#ifndef STATE_HPP
#define STATE_HPP
using namespace std;
class State {
private:
public:
void start();
void update();
void render();
};
#endif
然后我有一个名为PlayState的类,它继承State:
#ifndef PLAY_STATE_HPP
#define PLAY_STATE_HPP
#include <SFML/Graphics.hpp>
#include "Game.hpp"
#include "State.hpp"
using namespace std;
class PlayState : public State {
private:
sf::CircleShape shape;
Game game;
public:
PlayState();
void start();
void update();
void render();
};
#endif
在我的Game.cpp上,我正在创建currentState:
currentState = PlayState();
问题是,它不起作用。 currentState.update()是state.update()。当我创建PlayState 时,似乎我没有覆盖State方法。
这是PlayState.cpp:
#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>
#include <stdio.h>
#include "PlayState.hpp"
PlayState::PlayState() {
printf("heyyy\n");
}
void PlayState::start() {
shape.setRadius(100.f);
shape.setOrigin(20.0f, 20.0f);
shape.setFillColor(sf::Color::Green);
}
void PlayState::update() {
sf::Event event;
while (game.window.pollEvent(event)) {
if (event.type == sf::Event::Closed) {
game.window.close();
//running = false;
}
}
printf("here\n");
}
void PlayState::render() {
printf("here\n");
game.window.clear();
game.window.draw(shape);
game.window.display();
}
关于如何“覆盖”这些方法的任何想法?谢谢。
修改 我必须将State.cpp函数设置为虚拟,以便可以覆盖它们。 我还必须将State * currentState定义为指针并使用“currentState = new PlayState();”创建PlayState。 此外,现在我使用 - &gt; update()和 - &gt; draw()访问.update和.draw。
答案 0 :(得分:3)
两个问题。正如@McAden所说,State
中要覆盖的PlayState
中的函数需要标记为虚拟。另一个问题是currentState
中的数据成员Game
的类型为State
。当您为其分配类型为PlayState
的对象时,它将获取State
对象的PlayState
部分,但不会获取派生部分。这称为“切片”。要阻止它,请currentState
指向State
,并在创建PlayState
对象时,将其地址分配给Game
对象的currentState
。
答案 1 :(得分:1)
答案 2 :(得分:1)
你需要使用虚拟修饰符来表达你的功能,即
virtual void Update();
当调用currentState-&gt; Update()时,这将调用最顶层的重写函数,如果你想调用类方法中的任何父类函数,只需指定ie即可。国家::更新();在调用函数时。