簡體   English   中英

C++14 Static class map初始化

[英]C++14 Static class map initialization

right now I'm creating a static class (yes, c++ does not have static classes, but to my knowledge creating a class with a private constructor gives the same result) like the following returning to me a map:

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

這種方法可能非常頻繁,在我看來這看起來不是很有效,因為每次創建一個 map 的新實例然后返回它。 我嘗試創建一個 static 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" }},
    }
}

但這會返回以下錯誤: Static data member of type 'const std::map<MyEnum, SomeInfo>' must be initialized out of line

我真的不知道該怎么做,經過一些研究,我沒有發現任何真正有用的東西..

有什么猜測嗎?

在此先感謝大家!

在“聲明”之后,您需要“定義”您的 map:請參閱: 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;刪除編譯器生成的默認構造函數。 - 它不能是私人的。

當你聲明一個 static 成員變量時,它的空間沒有分配給它,你只是聲明它。 您必須在 class 實現中為static變量分配空間。 在 C++17 中,您可以使用static inline ,但在此之前,您必須為 static 變量分配空間,如下所示:

   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"}},
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM