C ++创建一个类的实例

时间:2012-08-29 21:30:18

标签: c++ oop class methods override

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。

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

您正在寻找的是虚拟功能的概念。

Wikipedia entry

国家需要:

virtual void update();

PlayState需要:

void update();

答案 2 :(得分:1)

你需要使用虚拟修饰符来表达你的功能,即

virtual void Update();

当调用currentState-&gt; Update()时,这将调用最顶层的重写函数,如果你想调用类方法中的任何父类函数,只需指定ie即可。国家::更新();在调用函数时。