C++创建类的实例
C++ creating an instance of a class
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
在我的游戏.cpp上,我正在通过以下方式创建当前状态:
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("heyyyn");
}
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("heren");
}
void PlayState::render() {
printf("heren");
game.window.clear();
game.window.draw(shape);
game.window.display();
}
关于如何"覆盖"这些方法的任何想法?谢谢。
编辑我必须使 State.cpp 函数成为虚拟函数,以便可以覆盖它们。我还必须将State *currentState定义为指针,并使用"currentState = new PlayState((;"创建PlayState。另外,现在我使用 ->update(( 和 ->draw(( 访问 .update 和 .draw。
两个问题。正如@McAden所说,State
中要覆盖的PlayState
函数需要标记为虚拟。另一个问题是Game
中的数据成员currentState
的类型为 State
。将类型为 PlayState
的对象分配给它时,它将获取PlayState
对象的State
部分,而不是派生部件。这称为"切片"。若要防止它,请将currentState
设置为指向 State
的指针,并在创建该PlayState
对象时,将其地址分配给Game
对象的currentState
。
你要找的是虚函数的概念。
维基百科条目
国家需要:
virtual void update();
PlayState需要:
void update();
你需要用虚拟修饰符来制作你的函数,即。
virtual void Update();
当调用currentState->Update((时,这将调用最顶层的被覆盖的函数,如果你想调用类方法中的任何父类函数,只需指定ie。状态::更新((;调用函数时。
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 如何在c++中为模板函数实例创建快捷方式
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 如何创建一个空的全局类并在启动时实例化它
- 无法创建抽象类的实例
- 为什么创建友元类的实例会导致"undefined reference to"错误?
- 在C++中为链表类创建实例
- 如何为类的每个实例创建特定实例的方法
- 基于现有实例创建类的新实例
- 从模板类的另一个实例创建模板类的实例时省略模板参数
- Vulkan-加载扩展时实例创建失败
- 通知B1或B2或B3类的特定实例创建Pointer A类
- 使用std::shared_ptr对象实例创建boost::线程
- 如何在C++中仅包含一个实例创建类
- 如何从旧实例创建新实例
- 在V8 javascript引擎中,如何为每个实例创建一个重新使用ObjectTemplate的构造函数
- 有没有一种方法可以从基本实例创建派生实例
- 如何在修改设计时停止现有代码基类的实例创建
- 使用基类实例创建派生类实例
- 如何从另一个仅静态选择满足特定类型规则的索引的元组实例创建元组实例