0
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

そして、Stateを継承するPlayStateというクラスがあります。

#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にアクセスします。

4

3 に答える 3

3

2つの問題。@McAdenが言ったように、その中の関数は、State仮想PlayStateとしてマークする必要があります。もう1つの問題は、のデータメンバーcurrentStateGameタイプがであるということStateです。タイプのオブジェクトを割り当てると、オブジェクトの一部はPlayState取得されますが、派生部分は取得されません。これは「スライス」と呼ばれます。これを防ぐには、へのポインタを作成し、そのオブジェクトを作成するときに、そのアドレスをオブジェクトのに割り当てます。StatePlayStatecurrentStateStatePlayStateGamecurrentState

于 2012-08-29T21:39:23.647 に答える
1

あなたが探しているのは、仮想関数の概念です。

ウィキペディアのエントリ

州のニーズ:

virtual void update();

PlayStateのニーズ:

void update();
于 2012-08-29T21:32:25.000 に答える
1

つまり、仮想修飾子を使用して関数を作成する必要があります。

virtual void Update();

currentState-> Update()を呼び出すとき、これは最上位のオーバーライドされた関数を呼び出します。クラスメソッド内の親クラス関数のいずれかを呼び出したい場合は、単にieを指定します。State :: Update(); 関数を呼び出すとき。

于 2012-08-29T22:10:12.747 に答える