This question already has answers here:
Undefined reference to static class member
                                
                                    (7个答案)
                                
                        
                                2年前关闭。
            
                    
我想访问存储在单独类中的静态地图,并遍历并打印内容。

所以我有三个文件:

具有全局地图的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();
}


现在,此代码无法编译,并给了我


  未定义对“ 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] = "Stackoverflow";
            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编辑.cpp个文件?不要那样做看起来这两个文件应改为.hpp

你近了由于地图是static,因此您不需要HasGlobals实例即可访问它,因此HasGlobals * globalRetriever = new HasGlobals();是毫无意义的(而且还泄漏了它)。

该映射被称为“ HasGlobals::globalData”。

尽管您将需要找到一些地方向其中添加数据; HasGlobals构造函数不合适,因为每次实例化该类时都会调用它。定义对象时最好使用初始化程序,而忘记这样做,因此在注释中提到了“未定义的引用”链接器错误。

从那时起您一直在正确使用地图,但此处的错字除外:

std::map<int, std:;string>
//                ^

09-28 11:30