如何在 C++ 中从单独的 class 访问静态地图?
How do I access a static map from a seperate class in C++?
我想访问存储在单独 class 中的静态地图并遍历并打印内容。
所以我有三个文件:
HasGlobals.cpp里面有全球地图。
/* HasGlobals.cpp */
#include <string>
#include <map>
#include <iostream>
class HasGlobals{
public:
static std::map<int, std::string> globalData;
HasGlobals(){
globalData.insert(std::pair<int, std::string>(0, "data"));
};
~HasGlobals(){
};
};
WantsGlobals.cpp 有一个方法需要使用 HasGlobals.cpp 中的映射作为其方法之一。
/* WantsGlobals.cpp */
#include "HasGlobals.cpp"
#include <string>
class WantsGlobals{
public:
WantsGlobals(){
};
~WantsGlobals(){
};
//THIS IS THE METHOD THAT I CAN'T GET TO WORK
void printContentsOfGlobal(){
HasGlobals * globalRetriever = new HasGlobals();
for(std::map<int, std::string>::iterator it = globalRetriever->globalData.begin(); it != globalRetriever->globalData.end(); ++it){
std::cout << it->first << " " << it->second << std::endl;
}
};
};
Main.cpp 只是尝试调用 WantsGlobals.cpp.
中的 printContentsOfGlobal() 方法
/* Main.cpp */
#include <iostream>
#include "WantsGlobals.cpp"
int main(){
WantsGlobals * globalRetriever = new WantsGlobals();
globalRetriever->printContentsOfGlobal();
}
现在这段代码无法编译并给我
undefined reference to 'HasGlobals::globalData'
我将如何实施 printContentsOfGlobal() 以便我可以在单独的 HasGlobals.cpp 文件中检索 map[globalData] 中的数据?
编辑:
感谢大家的帮助。下面是我在大家的帮助下创建的代码。是的,它仍然不完美,但它编译并执行了所需的行为:
HasGlobals.hpp
#include <string>
#include <map>
#include <iostream>
class HasGlobals{
public:
static std::map<int, std::string> globalData;
HasGlobals(){};
~HasGlobals(){};
static std::map<int, std::string> createDummyData(){
std::map<int, std::string> m;
m[0] = "Help";
m[1] = "Me";
m[2] = "Whosebug";
m[3] = "You're my only hope.";
return m;
}
};
std::map<int, std::string> HasGlobals::globalData = HasGlobals::createDummyData();
WantsGlobals.hpp
#include "HasGlobals.hpp"
#include <string>
#include <map>
class WantsGlobals{
public:
WantsGlobals(){};
~WantsGlobals(){};
void printContentsOfGlobal(){
for(std::map<int, std::string>::iterator it = HasGlobals::globalData.begin(); it != HasGlobals::globalData.end(); ++it){
std::cout << it->first << " " << it->second << std::endl;
}
};
};
Main.cpp
#include <iostream>
#include <"WantsGlobals.hpp">
int main(){
WantsGlobals * globalRetriever = new WantsGlobals();
globalRetriever->printContentsOfGlobal();
}
(CW,因为这现在只是关于欺骗的提示和技巧,留给后代。)
你为什么要 #include
ing .cpp
文件?不要那样做。看起来这两个文件应该命名为 .hpp
。
你很接近。因为地图是 static
,你不需要 HasGlobals
的实例来访问它,所以 HasGlobals * globalRetriever = new HasGlobals();
是没有意义的(加上你泄露了它)。
地图是"called"HasGlobals::globalData
.
尽管您需要找个地方向其中添加数据; HasGlobals
构造函数不是合适的位置,因为每次 实例化 class 时都会调用它 。最好在定义对象时使用 initialiser,但您忘了这样做,因此会出现您在评论中提到的 "undefined reference" 链接器错误。
从那时起您将正确使用地图,除了此处的错字:
std::map<int, std:;string>
// ^
我想访问存储在单独 class 中的静态地图并遍历并打印内容。
所以我有三个文件:
HasGlobals.cpp里面有全球地图。
/* HasGlobals.cpp */
#include <string>
#include <map>
#include <iostream>
class HasGlobals{
public:
static std::map<int, std::string> globalData;
HasGlobals(){
globalData.insert(std::pair<int, std::string>(0, "data"));
};
~HasGlobals(){
};
};
WantsGlobals.cpp 有一个方法需要使用 HasGlobals.cpp 中的映射作为其方法之一。
/* WantsGlobals.cpp */
#include "HasGlobals.cpp"
#include <string>
class WantsGlobals{
public:
WantsGlobals(){
};
~WantsGlobals(){
};
//THIS IS THE METHOD THAT I CAN'T GET TO WORK
void printContentsOfGlobal(){
HasGlobals * globalRetriever = new HasGlobals();
for(std::map<int, std::string>::iterator it = globalRetriever->globalData.begin(); it != globalRetriever->globalData.end(); ++it){
std::cout << it->first << " " << it->second << std::endl;
}
};
};
Main.cpp 只是尝试调用 WantsGlobals.cpp.
中的 printContentsOfGlobal() 方法/* Main.cpp */
#include <iostream>
#include "WantsGlobals.cpp"
int main(){
WantsGlobals * globalRetriever = new WantsGlobals();
globalRetriever->printContentsOfGlobal();
}
现在这段代码无法编译并给我
undefined reference to 'HasGlobals::globalData'
我将如何实施 printContentsOfGlobal() 以便我可以在单独的 HasGlobals.cpp 文件中检索 map[globalData] 中的数据?
编辑: 感谢大家的帮助。下面是我在大家的帮助下创建的代码。是的,它仍然不完美,但它编译并执行了所需的行为:
HasGlobals.hpp
#include <string>
#include <map>
#include <iostream>
class HasGlobals{
public:
static std::map<int, std::string> globalData;
HasGlobals(){};
~HasGlobals(){};
static std::map<int, std::string> createDummyData(){
std::map<int, std::string> m;
m[0] = "Help";
m[1] = "Me";
m[2] = "Whosebug";
m[3] = "You're my only hope.";
return m;
}
};
std::map<int, std::string> HasGlobals::globalData = HasGlobals::createDummyData();
WantsGlobals.hpp
#include "HasGlobals.hpp"
#include <string>
#include <map>
class WantsGlobals{
public:
WantsGlobals(){};
~WantsGlobals(){};
void printContentsOfGlobal(){
for(std::map<int, std::string>::iterator it = HasGlobals::globalData.begin(); it != HasGlobals::globalData.end(); ++it){
std::cout << it->first << " " << it->second << std::endl;
}
};
};
Main.cpp
#include <iostream>
#include <"WantsGlobals.hpp">
int main(){
WantsGlobals * globalRetriever = new WantsGlobals();
globalRetriever->printContentsOfGlobal();
}
(CW,因为这现在只是关于欺骗的提示和技巧,留给后代。)
你为什么要 #include
ing .cpp
文件?不要那样做。看起来这两个文件应该命名为 .hpp
。
你很接近。因为地图是 static
,你不需要 HasGlobals
的实例来访问它,所以 HasGlobals * globalRetriever = new HasGlobals();
是没有意义的(加上你泄露了它)。
地图是"called"HasGlobals::globalData
.
尽管您需要找个地方向其中添加数据; HasGlobals
构造函数不是合适的位置,因为每次 实例化 class 时都会调用它 。最好在定义对象时使用 initialiser,但您忘了这样做,因此会出现您在评论中提到的 "undefined reference" 链接器错误。
从那时起您将正确使用地图,除了此处的错字:
std::map<int, std:;string>
// ^