0

我通过 StackOverflow 上的类实现发现了一种类似于 Java 的枚举的新方法。

在自己的头文件中声明的符号类

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

您已经声明了静态成员;但它也需要在一个源文件中定义和初始化。

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

我猜你认为这就是initialize函数正在做的事情;但它只是创建一个类型的本地对象Symbols,然后在函数返回时将其销毁。

于 2013-04-04T17:44:51.577 回答
1

只需static const Symbols CREATE;声明 Symbols 类型的静态 const 对象在某处,这会使编译器感到高兴。

但是需要在某个地方实际定义 CREATE 对象,这就是链接器找不到它的原因。

你必须把

const Symbols Symbols::CREATE;

在您的一个cpp 文件中。这样,实际上将分配一个存储位置,以便链接器可以找到它。

于 2013-04-04T17:43:08.973 回答