クラスのすべてのオブジェクトで使用できるように、STD ::マップを1回初期化する方法は?

StackOverflow https://stackoverflow.com/questions/2045396

  •  20-09-2019
  •  | 
  •  

質問

次のように定義されているeNum stackindexがあります。

typedef enum 
{
    DECK,
    HAND,
    CASCADE1,
    ...
    NO_SUCH_STACK
} StackIndex;

私は呼ばれるクラスを作成しました MoveSequence, 、これはaのラッパーです std::deque フォームのタプルの束の <StackIndex, StackIndex>.

class MoveSequence
{
    public:
        void AddMove( const tpl_move & move ){ _m_deque.push_back( move ); }
        void Print();
    protected:
    deque<tpl_move> _m_deque;
};

静的を作成できると思いました std::map のメンバー MoveSequence クラス、それはaを翻訳します StackIndexstd::string, 、によって使用されます Print() 関数。しかし、私が試したとき、私はエラーを得ました:

"error C2864: 'MoveSequence::m' : only static const integral data members can be initialized within a class"

STD ::静的メンバーとしてMapを作成することが不可能な場合は、STD :: MAPを作成する別の方法があります。 StackIndexstd::string それは印刷に使用できます MoveSequence オブジェクト?

ありがとう

ビーバンド。

役に立ちましたか?

解決

STD :: Classの静的メンバーをマップすることができます。できないことは、クラスの定義内でそれを初期化することです。これがエラーがあなたに伝えていることであることに注意してください:

エラーC2864: 'MoveSequence :: M':静的const積分データメンバーのみが *初期化* クラス内

だから、あなたはこれをヘッダーに入れたい:

class MoveSequence
{
    static std::map<StackIndex, std::string> _m_whatever;
};

そして、ソース(.cpp)ファイルでこれが必要です。

std::map<StackIndex, std::string> MoveSequence::_m_whatever( ..constructor args.. );

他のヒント

初期化をソースファイルに移動する必要があります。

// header
struct foo
{
    typedef std::map<unsigned, std::string> the_map;
    static const the_map m;
};

// source
const foo::the_map foo::m(...);

ただし、初期化します。 C ++ 0xはこの制限を削除します。

留意してください boost.assign これを非常に簡単にします:

#include <boost/assign.hpp>
const foo::the_map foo::m = boost::assign::map_list_of(1, "a")(2, "b");

他の人が示唆したように、C ++ソースファイルにマップの静的インスタンスを作成する必要があります。初期化に関しては、MoveSequenceで静的関数を作成することをお勧めします。

class MoveSequence {

   static void InitMap() {
      if ( m_map.size() == 0 ) {
           m_map.insert( std::make_pair( DECK, "deck" ) );
            m_map.insert( std::make_pair( HAND, "hand" ) );
      }
   }
   ...
};

その後、Movesequenceのコンストラクターからこれを呼び出すことができます。

ああ、ところで、列挙にtypedefの必要はありません:

enum StackIndex {
  ...
};

私はあなたがSTD ::マップを望んでいるとは思わない(ただし、ここでの他の答えはすべてそれを行う方法について良いものです)。インデックスが列挙値である静的なcアレイの文字列が必要なように聞こえます。

const char* const stacknames[] = 
{
    "deck",
    "hand",
    "cascade1"
};

その後、StackNames [デッキ]は「デッキ」などです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top