2016-10-31 1 views
1

Возможно ли это?C++ singleton in constructor

class A { 
    static A *instance = NULL; 

public: 
    A() { 
     if (instance) { 
      this = instance; 
     } else { 
      instance = this; 
     } 
    } 
} 

Имеет ли утечка память?

Нужно ли мне oveload new?

+2

Я рекомендую вам изучить этот ответ, который описывает, как сделать синглтон: http://stackoverflow.com/a/1008289/3807729 – Galik

ответ

2

No. С видом ваших ошибок компилятора, ваш класс не будет работать.

@Galik has provided invaluable sources как вы на самом деле хотите построить синглтон. Но давайте посмотрим на ваши.

class A { 
    static A *instance = NULL; // NULL isn't even a thing, but assuming you mean nullptr you can't assign a static like this 

public: 
    A() { 
     if (instance) { 
      this = instance; // this can't be assigned 
     } else { 
      instance = this; // this is correct 
     } 
    } 
}; 

который даст вам следующее:

class A { 
    static A *instance; 

public: 
    A() { 
     // if there's no instance, this is the one we'll use 
     if (!instance) { 
      instance = this; 
     } 
    } 
}; 

A* A::instance = nullptr; 

Что не мешает вам строить более чем один в любом случае.

1

Вы не можете присвоить значение для этого

1

Невозможно. Если конструктор открывается и вызывается, новый объект A неизбежно создается. Самые изящные и широко используемые реализации синглтон-классов C++ используют статические методы для возврата одного статического экземпляра, скрывая (например, make private) конструктор.

Вот пример:

class A { 
private: 
    static A *instance_; // use nullptr since C++11 
    A() {} 
public: 
    static A& instance() { 
     if (!instance_) 
      instance_ = new A(); 
     return *instance_; 
    } 
}; 

A* A::instance_ = nullptr; 
+1

Если вы должны показать Singleton, использование [Meyers 'one] (http://stackoverflow.com/documentation/c%2b%2b/2713/singleton-design-pattern/11369/thread-safe-singeton#t=201610310900159732795). – Jarod42