1

次のように定義された列挙 StackIndex があります。

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

という形式のタプルの束のMoveSequenceラッパーであるというクラスを作成しました。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;
};

関数で使用するために、 aを aに変換するクラスの静的std::mapメンバーを作成できると思いました。しかし、試してみると、エラーが発生しました:MoveSequenceStackIndexstd::stringPrint()

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

std::map を静的メンバーとして作成できない場合、オブジェクトの出力に使用できるaStackIndexを a に変換する std::map を作成する別の方法はありますか?std::stringMoveSequence

ありがとう

ビーバンド。

4

4 に答える 4

6

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

// 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");
于 2010-01-11T22:29:18.077 に答える
4

std::map をクラスの静的メンバーにすることができます。できないことは、クラス定義内で初期化することです。これはエラーがあなたに言っていることに注意してください:

エラー C2864: 'MoveSequence::m':クラス内で*初期化*できるのは static const 整数データ メンバーのみです

したがって、これをヘッダーに含める必要があります。

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

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

std::map<StackIndex, std::string> MoveSequence::_m_whatever( ..constructor args.. );
于 2010-01-11T22:29:38.830 に答える
2

std::map が必要だとは思いません(ただし、ここでの他のすべての回答は、その方法については良い回答です)。インデックスが列挙値である文字列の静的 C 配列が必要なように思えます。

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

次に、stacknames[DECK] は「デッキ」などです。

于 2010-01-11T22:58:32.183 に答える
1

他の人が示唆しているように、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 {
  ...
};
于 2010-01-11T22:41:54.777 に答える