Niedawno opublikowałem pytanie na SO dotyczące użycia klasy, która nosi nieco oddzielnej funkcjonalności, która powinna, idealnie. Polecono mi zapoznać się z pojedynczym wzorcem, aby utworzyć tylko jedną instancję klasy i zarządzać zbiorem operacji obracających się wokół danych, które on obejmuje. Tutaj możesz zobaczyć pytanie - using Static Container for base and derived classes.używanie przestrzeni nazw zamiast pojedynczych
Rozważmy teraz ten kod -
#include <iostream>
#include <string>
#include <unordered_map>
class A{
std::string id;
public:
A(std::string _i): id(_i){}
virtual void doSomething(){std::cout << "DoSomethingBase\n";}
};
class B : public A{
std::string name;
public:
B(std::string _n):name(_n), A(_n){}
void doSomething(){std::cout << "DoSomethingDerived\n";}
};
namespace ListA{
namespace{
std::unordered_map<std::string, A*> list;
}
void init(){
list.clear();
}
void place(std::string _n, A* a){
list[_n] = a;
}
}
int main() {
ListA::init();
ListA::place("b1", new B("b1"));
ListA::place("a1", new A("a1"));
return 0;
}
ignorując fakt, że nadal jestem przy użyciu surowych wskaźników, które są nieszczelne pamięci, jeśli program nie kończy, ponieważ jest, jest to dobry alternatywa do korzystania z globalnych zmiennych statycznych, czy singleton?
W odniesieniu do poprzedniego pytania, mam reorganizacji klasy A (klasa bazowa) i klasy B (klasy pochodne), niezależnie od przestrzeni nazw, która zarządza listę tych obiektów. Czy to dobry pomysł, czy też całkowicie zła praktyka? Czy są jakieś niedociągnięcia?
Dobrym Singleton realizacja I Zasugerowano była następująca -
class EmployeeManager
{
public:
static EmployeeManager& getInstance()
{
static EmployeeManager instance; // Guaranteed to be destroyed.
// Instantiated on first use.
return instance;
}
private:
EmployeeManager() {};
std::unordered_map<std::string, Employee&> list;
public:
EmployeeManager(EmployeeManager const&) = delete;
void operator=(const&) = delete;
void place(const std::string &id, Employee &emp){
list[id] = emp;
}
};
class Employee
{
public:
virtual void doSomething() = 0;
};
class Writer : public Employee
{
private:
std::string name_;
public:
Writer(std::string name) : name_(name) {};
void doSomething() { };
};
Szczerze mówiąc nigdy nie próbowałem Singleton i mam shying go używać bezpośrednio, ponieważ nie mam wcześniejszego doświadczenia i wolałbym go najpierw użyć w moich domowych projektach.
Twoja reakcja na kogoś polecającego wzór singletonu powinna być taka, kiedy spotkałeś kogoś, kto zabiera cię do zadymionego pokoju i po kilku rundach pokera sugeruje, że "powinniśmy sprawić, by było ciekawie". –
Wzorzec singleton jest sposobem na * wymuszenie * utworzenia tylko jednej instancji. Czy czujesz potrzebę tworzenia wielu instancji, gdy naprawdę potrzebujesz tylko jednego? Jeśli nie, po prostu stwórz potrzebny przedmiot i skończ go! –
@ BoPersson czy naprawdę muszę utworzyć obiekt dla mojego przypadku użycia? Czy nie potrzebuję po prostu mapy std :: map z powiązanymi z nią specjalnymi funkcjami? –