C++创建类的实例

C++ creating an instance of a class

本文关键字:实例 创建 C++      更新时间:2023-10-16
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。状态::更新((;调用函数时。