我在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个未解决的外部因素,其中一些与此问题无关。我正确定义头文件以确保没有重复的声明 并且所有课程都能正确编译。
答案 0 :(得分:3)
你已经宣布了静态成员;但它也需要在一个源文件中定义和初始化。
const Symbols Symbols::CREATE("create");
我猜你认为这是initialize
函数正在做的事情;但它只是创建一个Symbols
类型的本地对象,然后在函数返回时销毁它。
答案 1 :(得分:1)
使用static const Symbols CREATE;
,您只声明符号类型的静态const对象在某处,这使编译器感到满意。
但是需要有一些实际定义CREATE对象的地方,这就是链接器无法找到它的原因。
你必须把
const Symbols Symbols::CREATE;
在一个的cpp文件中。这样,实际上将分配一个存储位置,以便链接器可以找到它。