0

私は、ここ StackOverflow のクラス実装を通じて、Java のような列挙への斬新なアプローチを発見しました。

独自のヘッダーで宣言された Symbols クラス

class Symbols {

public:

    Symbols() {}

    static const Symbols CREATE;
              . . .
private:

    std::string the_symbol;

    // Symbols constructor
    Symbols (std::string symbol){
        this->the_symbol = symbol;
    }

public:

    std::string get_symbol(void) {
        return the_symbol;
    }

    void set_symbol(std::string new_value) { the_symbol = new_value; }  

    void initialize(void){
        const Symbols CREATE = Symbols("create");
                     . . .
    }
};

いくつかの方法でクラスで使用されます

bool RecursiveDescentParser::type_name(){
if (accept(Symbols::STRING) || accept(Symbols::INTEGER)){
    return true;
}
else
    return false;

}

symbol_ = Symbols::WHERE;

if (!boost::iequals(tokenizer_->peekAtNext(), symbol_.get_symbol(), loc_)){
    // complete any tokens
    std::string temp = tokenizer_->completeToken();                     
}

ヘッダーはいくつかのSymbolsクラスに含まれています。タイプの多くのコンパイラ エラーがあります

1>recursive_descent_parser.obj : error LNK2001: unresolved external symbol "public: static class Symbols const Symbols::VALUES" (?VALUES@Symbols@@2V1@B)

何を与える?私は 39 件の未解決の外部情報をすべて受け取りましたが、そのうちのいくつかはこの質問とは関係ありません。重複した宣言がなく、すべてのクラスが適切にコンパイルされるように、ヘッダー ファイルを適切に定義しています。

4

2 に答える 2

3

静的メンバーを宣言しました。ただし、正確に 1 つのソース ファイルで定義および初期化する必要もあります。

const Symbols Symbols::CREATE("create");

initializeそれが関数が行っていることだと思います。しかし、それはタイプ のローカル オブジェクトを作成しSymbols、関数が戻るときにそれを破棄するだけです。

于 2013-04-04T17:44:51.577 に答える
1

static const Symbols CREATE;Symbols 型の static const オブジェクトがどこかにあると宣言するだけで、コンパイラは満足します。

しかし、CREATE オブジェクトが実際に定義されている場所が必要です。そのため、リンカーはそれを見つけることができません。

あなたは置く必要があります

const Symbols Symbols::CREATE;

あなたのcppファイルの1つに。そうすれば、リンカーがそれを見つけることができるように、ストレージの場所が実際に割り当てられます。

于 2013-04-04T17:43:08.973 に答える