【问题标题】:C++ creating an instance of a classC++ 创建一个类的实例
【发布时间】:2012-08-24 14:05:13
【问题描述】:
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。 另外,现在我使用 ->update() 和 ->draw() 访问 .update 和 .draw。

【问题讨论】:

  • 你需要一个虚函数来覆盖任何东西。其他任何事情都只是隐藏。

标签: c++ oop class methods overriding


【解决方案1】:

您需要使用 virtual 修饰符 ie 来制作您的函数。

virtual void Update();

当调用 currentState->Update() 时,这将调用最顶层的重写函数,如果您希望调用类方法中的任何父类函数,只需指定 ie。状态::更新();调用函数时。

【讨论】:

    【解决方案2】:

    两个问题。正如@McAden 所说,State 中要在PlayState 中覆盖的函数需要标记为虚拟。另一个问题是Game 中的数据成员currentState 的类型为State。当您为它分配PlayState 类型的对象时,它会获得PlayState 对象的State 部分,但不会获得派生部分。这称为“切片”。为防止这种情况发生,请将currentState 设为指向State 的指针,并在创建PlayState 对象时,将其地址分配给Game 对象的currentState

    【讨论】:

      【解决方案3】:

      您正在寻找的是虚函数的概念。

      Wikipedia entry

      状态需求:

      virtual void update();
      

      PlayState 需要:

      void update();
      

      【讨论】:

      • 覆盖是 C++11,所以你的编译器中可能还没有它。
      • 对不起,脑子放屁——我在 C# 上花了太多时间。我更正了。
      • 你不能这样写公开
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多