私は、自分のknoledgeの最高の状態機械の例であるいくつかのコードを書こうとしています。私がこれまで行ってきた何C++ステートマシンとファイル内の隠蔽クラス
は次のようになります。これは、しかし、私は単一の状態を存在するがしたい私のプログラムの実行時に、正常に動作します
#include <map>
#include <iostream>
class StateInstance
{
std::string m_string;
public:
StateInstance(const std::string& string)
: m_string{string}
{
}
std::string Get() const
{
return m_string;
}
}instance_a("hello world"), instance_b("bring me coffee");
enum class StateInstanceOption
{
STATE_INSTANCE_A,
STATE_INSTANCE_B
}gCurrentState{StateInstanceOption::STATE_INSTANCE_A}; // global variable to hold current state "pointer" (really a flag)
class StateInstanceMapper
{
std::map<StateInstanceOption, const StateInstance&> m_map;
public:
StateInstanceMapper()
{
m_map.insert(std::pair<StateInstanceOption, const StateInstance&>(StateInstanceOption::STATE_INSTANCE_A, instance_a));
m_map.insert(std::pair<StateInstanceOption, const StateInstance&>(StateInstanceOption::STATE_INSTANCE_B, instance_b));
}
const StateInstance& DoMap(/*const StateInstanceOption opt*/) const
{
return m_map.at(/*opt*/ gCurrentState);
}
}mapper_instance;
int main()
{
std::cout << mapper_instance.DoMap(/*gCurrentState*/).Get() << std::endl;
gCurrentState = StateInstanceOption::STATE_INSTANCE_B;
std::cout << mapper_instance.DoMap(/*gCurrentState*/).Get() << std::endl;
return 0;
}
。
- 私は(Cで)、機能の例については
StateInstance
、StateInstanceOption
とStateInstanceMapper
の別のインスタンスを作成し、ユーザーを防止するための方法をしたい、私は関数は、静的行い、入れるでしょうそれは別のファイルには見えないようにすることです。
エンドユーザーがこれらのオブジェクトのインスタンスをさらに作成するのを止めるためにできることはありますか?
あなたが作成しようとしている何
#include <map>
#include <iostream>
class StateInstance
{
std::string m_string;
public:
// somewhat inconveniently, have to create an entirely new function for each possible instance of the state
static StateInstance& get_instance_a()
{
static StateInstance instance_a("hello world");
return instance_a;
}
static StateInstance& get_instance_b()
{
static StateInstance instance_b("bring me coffee");
return instance_b;
}
private:
StateInstance(const std::string& string)
: m_string{string}
{
}
StateInstance(const StateInstance &) = delete;
StateInstance& operator=(const StateInstance&) = delete;
public:
std::string Get() const
{
return m_string;
}
}; // instance_a("hello world"), instance_b("bring me coffee");
enum class StateInstanceOption
{
STATE_INSTANCE_A,
STATE_INSTANCE_B
}gCurrentState{StateInstanceOption::STATE_INSTANCE_A}; // global variable to hold current state "pointer" (really a flag)
class StateInstanceMapper
{
std::map<StateInstanceOption, const StateInstance&> m_map;
public:
static StateInstanceMapper& getInstance()
{
static StateInstanceMapper instance;
return instance;
}
private:
StateInstanceMapper()
{
m_map.insert(std::pair<StateInstanceOption, const StateInstance&>(StateInstanceOption::STATE_INSTANCE_A, StateInstance::get_instance_a()));
m_map.insert(std::pair<StateInstanceOption, const StateInstance&>(StateInstanceOption::STATE_INSTANCE_B, StateInstance::get_instance_b()));
}
StateInstanceMapper(const StateInstanceMapper &) = delete;
StateInstanceMapper& operator=(const StateInstanceMapper &) = delete;
public:
const StateInstance& DoMap(/*const StateInstanceOption opt*/) const
{
return m_map.at(/*opt*/ gCurrentState);
}
}; //mapper_instance;
int main()
{
//std::cout << mapper_instance.DoMap(/*gCurrentState*/).Get() << std::endl;
std::cout << StateInstanceMapper::getInstance().DoMap().Get() << std::endl;
gCurrentState = StateInstanceOption::STATE_INSTANCE_B;
//std::cout << mapper_instance.DoMap(/*gCurrentState*/).Get() << std::endl;
std::cout << StateInstanceMapper::getInstance().DoMap().Get() << std::endl;
return 0;
}
ので、あなたがシングルトンをしたいですか? – vu1p3n0x
これは何が有望なのでしょうか? – user3728501
_ "有望な音" _ - 私は、音の下痢について同じことを考えました。 –