我喜欢使用私有默认构造函数将对象放入地图中。因此,发现以下代码不起作用:
class DB {
public:
DB(std::string user, std::string password,
std::string db, std::string host, unsigned int port = 3306);
static DB& instance(
std::string const& session_name,
std::string const& user = "user",
std::string const& password = "password",
std::string const& db = "database",
std::string const& host = "localhost",
unsigned int port = 3306) {
auto instance = database_instances.find(session_name);
if (instance == database_instances.end()) {
//database_instances.emplace(session_name, user, password, db, host, port);
//database_instances.insert( std::unordered_map< std::string, DB >::value_type ( session_name, DB{user, password, db, host, port}));
database_instances.emplace(std::piecewise_construct,
std::forward_as_tuple(session_name),
std::forward_as_tuple(user, password, db, host, port));
}
return database_instances[session_name];
}
static std::shared_ptr<DB> instance(
std::string const& session_name);
static DB& instance();
~DB() = default;
private:
DB() = default;
DB(const DB& );
DB & operator = (const DB &);
/** fields: user, password ... **/
static std::map<std::string, DB> database_instances;
};
在C ++中,有没有一种方法可以使用私有默认构造函数来做到这一点?
答案 0 :(得分:2)
您确定给出错误的行不是此行:
return database_instances[session_name];
而不是调用emplace
?
如果键在映射中不存在,则该行将尝试默认构造一个DB
值。