[英]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.