静态映射为C++中的类成员
Static Map as Class Member in C++
我在使用静态映射作为C++成员时遇到问题。我的头文件是:
class Article
{
public:
//
static map<string,Article*> dictionary;
....
....
};
在我的构造函数中,我首先调用以下方法:
void Article::InitializeDictionary()
{
#ifndef DICT
#define DICT
map<string,Article*> Article::dictionary;
#endif
}
根据有关此的其他帖子,我应该声明静态成员,但是当我尝试执行此操作时,出现以下错误:
Error 1 error C2655: 'Article::dictionary' : definition or redeclaration illegal in current scope c:.......article.cpp 88 1
如果我将函数更改为以下内容:
void Article::InitializeDictionary()
{
#ifndef DICT
#define DICT
Article::dictionary["null"] = 0;
#endif
}
我收到此错误:
Error 1 error LNK2001: unresolved external symbol "public: static class std::map<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class Article *,struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<struct std::pair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const ,class Article *> > > Article::dictionary" (?dictionary@Article@@2V?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@PAVArticle@@U?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@PAVArticle@@@std@@@2@@std@@A)
关于我能做什么的任何想法?
你必须正确地声明和定义静态成员(在方法中这样做是错误的(:
class Article
{
public:
//
static map<string,Article*> dictionary;
....
....
};
map<string,Article*> Article::dictionary;
int main() {
//..
}
您在评论中问过:
我尝试在类声明后执行此操作并得到错误,但如果 我在函数定义所在的.cpp文件中执行此操作 工程。为什么?
由于静态成员在类的所有实例之间共享,因此必须在一个且只能一个编译单元(place(中定义它们。实际上,它们是具有一些访问限制的全局变量。
如果您尝试在标头中定义它们,它们将在包含该标头的每个模块中定义,并且在链接期间会发现错误,因为它会找到所有重复的定义。
你在类中声明静态没有错。
但是,您需要告诉编译器为静态成员保留存储:您需要定义它。为此,请包括以下行
map<string,Article*> Article::dictionary;
在一个编译单元和全局范围内;即不在方法或命名空间中。
正常的做法是将该行放在与Article
类关联的源文件中。如果将行放在头文件中,则多个编译单元可以定义它,这将为您提供链接错误。即使有警卫,也会发生这种情况。
请务必注意,map
的初始化将在程序的main
函数运行之前进行。
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 助记符和指向成员语法的指针
- 用于访问容器<T>数据成员的正确 API
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 嵌套在类中时无法设置成员数据
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 将函数类成员映射到类本身内部
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 将Ref对象作为类成员
- 将包含C样式数组的对象初始化为成员变量(C++)
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 将公共但非静态的成员函数与ALGLIB集成
- 多成员Constexpr结构初始化
- 我们可以访问一个不存在的联盟的成员吗