如何从C ++中的单独类访问静态映射?

时间:2017-07-05 16:01:20

标签: c++ dictionary c++98

我想访问存储在单独类中的静态地图,并迭代并打印内容。

所以我有三个文件:

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();
}

1 个答案:

答案 0 :(得分:4)

(CW现在这只是一个关于欺骗的提示和提示,留给子孙后代。)

为什么#include .cpp.hpp个文件?不要那样做。看起来这两个文件应该命名为static

你很亲密。由于地图为HasGlobals,因此您无需HasGlobals * globalRetriever = new HasGlobals();的实例来访问它,因此HasGlobals::globalData毫无意义(加上您泄露了它)。

地图被“调用”HasGlobals

虽然你需要找一些地方来添加数据; std::map<int, std:;string> // ^ 构造函数不是正确的位置,因为在实例化类时,每次都称为。最好在定义对象时使用 initialiser ,这是您忘记做的,因此您在评论中提到了“未定义的引用”链接器错误。

从那时起你正在使用地图,除了这里的拼写错误:

oldString.split(/w1/gi).length - 1