c ++声明一个类的const成员对象

时间:2014-11-19 18:50:52

标签: c++

我指的是stackoverflow post

当我构建以下代码时,我得到:“架构x86_64的重复符号”。我一直在谷歌搜索过去几个小时,但没有找到任何帮助。有什么建议吗?

#ifndef __lexer__lexer__
#define __lexer__lexer__

#include <stdio.h>
#include <string>

namespace Tag{
  const int AND = -1,
  OR = -2;
}

class Token{
public:
  std::string Name;
  std::string Type;
  std::string Value;
  int Tag;
  Token(std::string name, std::string type, std::string value, int tag){
    Name = name;
    Type = type;
    Value = value;
    Tag = tag;
  }
};

class Word : public Token{
public:
  Word(std::string name, std::string type, std::string value, int tag) : Token(name, type, value, tag){}
  static const Word AND;
};

const Word Word::AND = *new Word("and", "logical", "&&", Tag::AND);

#endif /* defined(__lexer__lexer__) */

代码:

const Word Word::AND = *new Word("and", "logical", "&&", Tag::AND);

是什么给了我这些问题。

2 个答案:

答案 0 :(得分:4)

简短的回答是你不想在.h文件中做定义(而不是声明)。当.h文件包含在多个其他文件中时,会出现错误。

稍微长一点的答案是你的*new成语是不必要的,可能会浪费少量存储空间。

const Word Word::AND("and", "logical", "&&", Tag::AND);

将调用相同的构造函数。

更长的答案是Tag应该是枚举,而你不希望按值传递std :: string。也许你来自另一种语言:你需要学习通过引用传递和const引用。

答案 1 :(得分:2)

初始化代码属于.c​​c文件,而不是标题。在标题中,包含它的每个编译单元都会创建一个新的,然后链接器会正确地抱怨重复。