I have static library which contains such singleton definition:
class InstrumentsStorage
{
public:
static InstrumentsStorage& getInstance() {
static InstrumentsStorage instance;
return instance;
}
// methods
private:
InstrumentsStorage();
InstrumentsStorage(InstrumentsStorage const&);
void operator=(InstrumentsStorage const&);
// fields
};
I've added such tracing:
InstrumentsStorage::InstrumentsStorage() {
std::cout << "InstrumentsStorage constructor called!" << std::endl;
...
And in my logs I find this string twice. Why? How to fix my singleton so only one instance is created. I can use C++11.
I'm using singleton from different projects from different threads but I have only one process.
upd adding full listing:
#pragma once
#include <string>
#include <iostream>
#include <boost/unordered_map.hpp>
#include "CommonsNative.h"
class InstrumentsStorage
{
public:
static InstrumentsStorage& getInstance() {
static InstrumentsStorage instance;
return instance;
}
int GetInstrumentId(std::string& instrument);
std::string& GetClassCode(int instrumentId) {
return classcodes[instrumentId];
}
std::string& GetTicker(int instrumentId) {
return tickers[instrumentId];
}
private:
InstrumentsStorage();
InstrumentsStorage(InstrumentsStorage const&);
void operator=(InstrumentsStorage const&);
boost::unordered_map<std::string, int> instrument2id;
std::string classcodes[MAX_INSTRUMENTS_NUMBER_IN_SYSTEM];
std::string tickers[MAX_INSTRUMENTS_NUMBER_IN_SYSTEM];
};
cpp:
#include "InstrumentsStorage.h"
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/ini_parser.hpp>
#include <iostream>
InstrumentsStorage::InstrumentsStorage() {
std::cout << "InstrumentsStorage constructor called!" << std::endl;
boost::property_tree::ptree pt;
boost::property_tree::ini_parser::read_ini("config_generated/instruments_gate_0.txt", pt);
for (auto& section : pt)
{
std::string instrument = section.first;
int id = section.second.get_value<int>();
instrument2id[instrument] = id;
std::cout << "InstrumentsStorage Assigned instrument = " << instrument << " id = " << id << std::endl;
classcodes[id] = instrument.substr(0, 4);
tickers[id] = instrument.substr(4, std::string::npos);
std::cout << "InstrumentsStorage id " << id << " classcode = " << classcodes[id]
<< " ticker = " << tickers[id] << std::endl;
}
}
int InstrumentsStorage::GetInstrumentId(std::string& instrument)
{
// std::cout << "InstrumentsStorage GetInstrumentId called, instrument = " << instrument << std::endl;
boost::unordered_map<std::string, int>::iterator i = instrument2id.find(instrument);
if (i == instrument2id.end())
{
// std::cout << "InstrumentsStorage GetInstrumentId not found, result == -1 " << std::endl;
return -1;
} else
{
// std::cout << "InstrumentsStorage GetInstrumentId found, result = " << i->second << std::endl;
return i->second;
}
}