Bạn có thể thử điều này:
MyClass.h
class MyClass {
private:
static const std::map<key, value> m_myMap;
static const std::map<key, value> createMyStaticConstantMap();
public:
static std::map<key, value> getMyConstantStaticMap( return m_myMap );
}; //MyClass
MyClass.cpp
#include "MyClass.h"
const std::map<key, value> MyClass::m_myMap = MyClass::createMyStaticConstantMap();
const std::map<key, value> MyClass::createMyStaticConstantMap() {
std::map<key, value> mMap;
mMap.insert( std::make_pair( key1, value1 ) );
mMap.insert( std::make_pair( key2, value2 ) );
// ....
mMap.insert( std::make_pair( lastKey, lastValue ) );
return mMap;
} // createMyStaticConstantMap
Với việc triển khai này, bản đồ tĩnh hằng số các lớp của bạn là một thành viên riêng và có thể được truy cập vào các lớp khác bằng phương thức public get. Nếu không, vì nó không đổi và không thể thay đổi, bạn có thể loại bỏ phương thức public get và chuyển biến bản đồ vào phần public của các lớp. Tuy nhiên, tôi sẽ để phương thức createMap ở chế độ riêng tư hoặc được bảo vệ nếu yêu cầu kế thừa và hoặc đa hình. Dưới đây là một số mẫu sử dụng.
std::map<key,value> m1 = MyClass::getMyMap();
// then do work on m1 or
unsigned index = some predetermined value
MyClass::getMyMap().at( index ); // As long as index is valid this will
// retun map.second or map->second value so if in this case key is an
// unsigned and value is a std::string then you could do
std::cout << std::string( MyClass::getMyMap().at( some index that exists in map ) );
// and it will print out to the console the string locted in the map at this index.
//You can do this before any class object is instantiated or declared.
//If you are using a pointer to your class such as:
std::shared_ptr<MyClass> || std::unique_ptr<MyClass>
// Then it would look like this:
pMyClass->getMyMap().at( index ); // And Will do the same as above
// Even if you have not yet called the std pointer's reset method on
// this class object.
// This will only work on static methods only, and all data in static methods must be available first.
Tôi đã chỉnh sửa bài đăng ban đầu của mình, không có gì sai với mã gốc mà tôi đã đăng vì nó được biên dịch, xây dựng và chạy chính xác, chỉ là phiên bản đầu tiên của tôi mà tôi trình bày dưới dạng câu trả lời, bản đồ được khai báo là công khai và bản đồ const nhưng không tĩnh.