【问题标题】:C++14 Static class map initializationC++14 静态类映射初始化
【发布时间】:2021-12-31 00:30:15
【问题描述】:

现在我正在创建一个静态类(是的,c++ 没有静态类,但据我所知,使用私有构造函数创建一个类会得到相同的结果),如下所示返回给我一张地图:

class Foo()
{
public:
    static std::map<MyEnum, SomeInfo> getMap()
    {
        static const std::map<MyEnum, SomeInfo> fooMap
        {
            {MyEnum::Enum1, SomeInfo{ "info1", "Info 1" }},
            {MyEnum::Enum2, SomeInfo{ "info2", "Info 2" }},
        }
        return fooMap;
    }
}

struct SomeInfo
{
    std::string id;
    std::string name;
}

这种方法可能非常频繁,在我看来这看起来不是很有效,因为每次创建一个新的地图实例然后返回它。我尝试创建一个静态 const std::map 并以下列方式对其进行初始化:

class Foo()
{
public:
    static const std::map<MyEnum, SomeInfo> fooMap
    {
        {MyEnum::Enum1, SomeInfo{ "info1", "Info 1" }},
        {MyEnum::Enum2, SomeInfo{ "info2", "Info 2" }},
    }
}

但这会返回以下错误:'const std::map' 类型的静态数据成员必须在行外初始化

我真的不知道该怎么做,经过一些研究我没有发现任何真正有用的东西..

有什么猜测吗?

提前感谢大家!

【问题讨论】:

  • 对所示代码的仔细阅读没有发现私有构造函数的实例,因此不清楚这究竟是要完成什么。您能否准确阐明“静态类”的含义,以及它与常规的普通类有何不同?这与显示的代码有何关系?这个问题不清楚。
  • Java 的静态类的 C++ 等价物是 namespace
  • 忘记在公共成员下添加一个“private: Foo() {}”,这可以防止调用构造函数

标签: c++ c++14 stdmap


【解决方案1】:

您需要在“声明”地图后“定义”地图: 见:https://en.cppreference.com/w/cpp/language/static

#include <map>
#include <string>

struct SomeInfo
{
    std::string id;
    std::string name;
};

enum MyEnum {
    Enum1, Enum2

};

class Foo
{
private:
    static const std::map<MyEnum, SomeInfo> fooMap;
public:
    static std::map<MyEnum, SomeInfo> getMap()
    {
        return fooMap;
    }
};

const std::map<MyEnum, SomeInfo> Foo::fooMap = {
    {MyEnum::Enum1, SomeInfo{ "info1", "Info 1" }},
    {MyEnum::Enum2, SomeInfo{ "info2", "Info 2" }}
};


int main(){
    auto val = Foo::getMap()[MyEnum::Enum1];
    return 0;
}

如果你想让你的类型不可构造,你可以通过Foo() = delete;删除编译器生成的默认构造函数——它不能是私有的。

【讨论】:

【解决方案2】:

当你声明一个静态成员变量时,它的空间并没有分配给它,你只是声明它。您必须在类实现中为static 变量分配空间。在 C++17 中,您可以使用 static inline,但在此之前,您必须为静态变量分配空间,如下所示:

   class Something {
   private:
    static const std::map<MyEnum, SomeInfo> map_data;

   public:
    static std::map<MyEnum, SomeInfo> getMap() { return map_data; }
};

const std::map<MyEnum, SomeInfo> Something::map_data = {
    {MyEnum::Enum1, SomeInfo{"info1", "Info 1"}},
    {MyEnum::Enum2, SomeInfo{"info2", "Info 2"}},
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    相关资源
    最近更新 更多