この質問はthis質問から来ます。 私はコンテナ(ゲーム)にshared_ptrを持つ状態パターンを実装しようとしています。C++状態パターンで宣言する場所を知る方法
しかし、私は円形の包含に問題があり、宣言を転送する必要があります。
マイコード:
Game.h
#pragma once
#include <memory>
#include "BaseState.h"
class Game : public std::enable_shared_from_this<Game>
{
private:
std::shared_ptr<BaseState> currentState;
public:
Game();
void switchState(std::shared_ptr<BaseState> nextState);
void doSomething(char);
void runState();
};
CPP
#include "stdafx.h"
#include <iostream>
#include "Game.h"
#include "SomeState.h"
Game::Game()
{
currentState = std::make_shared<SomeState>();
}
void Game::switchState(std::shared_ptr<BaseState> nextState)
{
currentState = nextState;
}
void Game::doSomething(char c)
{
std::cout << "Game : " << c;
}
void Game::runState()
{
currentState->handleCommand(shared_from_this());
}
BaseState.h
#pragma once
#include <memory>
#include "Game.h"
class BaseState
{
public:
virtual void handleCommand(std::shared_ptr<Game>) = 0;
};
SomeState.h
#pragma once
#include "BaseState.h"
class SomeState :
public BaseState
{
public:
// Inherited via BaseState
virtual void handleCommand(std::shared_ptr<Game>) override;
};
cppの前方宣言が、まだそれを得ることはありませんについて
#include "stdafx.h"
#include "SomeState.h"
void SomeState::handleCommand(std::shared_ptr<Game> game)
{
game->doSomething('S');
}
I read他の質問。
私は何を試しましたか。
forward宣言BaseStateゲームでは、コードはコンパイルされますが、エラーはスローされます。 ConsoleApplication1.exeで0x73E9DAE8で
未処理の例外: のMicrosoft C++の例外:メモリ位置 0x00BBF5D4でのstd :: bad_weak_ptr。
はフォワードBaseStateにゲームを宣言します。 Dosntコンパイルも、未定義の型エラーの使用を与える
「doSomethingのは、」:doSomethingのためにコンパイル時の試合でロジックです 「のstd :: shared_ptrの」
のメンバーていないではありません関数のように宣言されているため;私はどこ別のクラスを宣言転送先を決めるん
class Game;
はどのように、どの論理的なステップがありますか、私は1つだけ選んで作成チョイスの問題を修正する必要がありますか?あなたはBaseState.h
に#include <Game.h>
する必要はありません
必要なクラスをヘッダファイルに宣言します。次に、cppファイルには実際に必要な宣言があるヘッダーファイルが含まれています。これは、デュープターゲットのジストです。 – NathanOliver
'BaseState.h'ファイルは本当に完全な' Game'クラスを必要とせず、前方宣言だけです。 'Game.h'と同じですが、完全な' BaseState'定義は必要なく、前方宣言だけです。 –
クラッシュについては、あなたが持っている前方宣言の問題とは無関係です。その代わりに、デバッガを使用してコード内のクラッシュを特定し、その原因を突き止めてください。 –