Pergunta

Eu tenho trabalhado recentemente com código que se parece com o seguinte:

using namespace std;

class Singleton {
    public:
        static Singleton& getInstance();
        int val;
};

Singleton &Singleton::getInstance() {
    static Singleton s;
    return s;
}

class Test {
    public:
        Test(Singleton &singleton1);
};

Test::Test(Singleton &singleton1) {
    Singleton singleton2 = Singleton::getInstance();
    singleton2.val = 1;
    if(singleton1.val == singleton2.val) {
        cout << "Match\n";
    } else {
        cout << "No Match " << singleton1.val << " - " << singleton2.val << "\n";
    }   
}

int main() {
    Singleton singleton = Singleton::getInstance();
    singleton.val = 2;
    Test t(singleton);
}

Toda vez que eu o corro, recebo "No Match". No entanto, estou esperando uma partida, pois deve haver apenas uma instância da classe. Pelo que posso dizer ao passar com o GDB, é que há duas instâncias do Singleton. Por que é isso?

Foi útil?

Solução

A primeira linha de teste :: teste cria outra instância de Singleton (na pilha, seu local não é uma referência). Você pode impedir isso definindo o construtor padrão em Singleton e tornando -o privado. Como está, qualquer um pode criar uma instância de Singleton.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top