2013-08-05 3 views
0

Я хочу создать класс, который предоставит статический метод для создания уникального обработчика (migth be int, может плавать, может быть чем-то, но всегда извлекается как указатель на объект), но im все еще бит запутан в мои соображения, и когда я начал читать об одноэлементных и заводских шаблонах, тогда я вообще путался.уникальный обработчик в C++

Пусть у меня есть класс

CHandle{ 
private: 
     CHandle(const CHandle &hnd); 
     CHandle &operator=(const CHandle &hnd); 
     static int id; 
public: 
     static CHandle *createHandle(){ 
      id++; 
      return this; 
     } 
} 

в основной я хотел бы использовать:

CHandle *c = CHandle::createHandle(); 

Могу ли я сделать так? Или, может, я все испортил?

+1

статические методы не имеют никакого знания 'this' – Borgleader

+0

Вы также могли бы использовать опцию поиска: HTTP://stackoverflow.com/questions/1008019/c-singleton-design-pattern – j4nSolo

+1

Nooooooooooooooo! Не используйте синглтон, они злые! Есть лучшие способы сделать это. Конструкторы и шаблоны для стартеров. Почему вы хотите это сделать, точнее, какую проблему вы пытаетесь решить? – Skizz

ответ

3

Существует две вещи:

  • Первые static методы не имеют никакого знания this. Таким образом, нет this внутри static методов.
  • После вы можете сделать что-то вроде:

    CHandle{ 
    
    public: 
         static CHandle *createHandle(){ 
          s_id++; 
          return new CHandle(s_id); 
         } 
    private: 
         CHandle(int id) : 
          m_id(id) 
         {}; 
    
         CHandle(const CHandle &hnd); 
         CHandle &operator=(const CHandle &hnd); 
    
         int m_id;   // Id of the instance 
         static int s_id; 
    
    }; 
    

И если вы хотите его как одноточечного:

CHandle{ 

public: 
    static CHandle *createHandle(){ 
     if (!s_Instance) 
     { 
      s_id++; 
      s_Instance = new CHandle(s_id); 
     } 
     return s_Instance; 
    } 
private: 
    CHandle(int id) : 
     m_id(id) 
    {}; 

    CHandle(const CHandle &hnd); 
    CHandle &operator=(const CHandle &hnd); 

    int m_id;   // Id of the instance 
    static int s_id; 
    static CHandle s_Instance; 

}; 

не забудьте в .cpp:

int CHandle::s_id = 0; 
CHandle* CHandle::s_Instance = NULL; // if singleton 
0
CHandle{ 
private: 
     CHandle(int id): m_id(id) {}; 
     CHandle(const CHandle &hnd); 
     CHandle &operator=(const CHandle &hnd); 
     int m_id; 
     static int s_id; 
public: 
     static CHandle *createHandle(){ 
      s_id++; 
      return new CHandle(s_id); 
     } 
} 
0

Alwa ys помнить, что this относится к объекту, но static предназначен для всего класса, так static методы не могут получить доступ this.
Вот помощь вам нужно

CHandle{ 
private: 
     CHandle(const CHandle &hnd); 
     CHandle(int iidd); 
     CHandle &operator=(const CHandle &hnd); 
     static int id; 
     static CHandle *obj;//Singleton object 
public: 
     static CHandle *createHandle(){ 
      id++; 
      return obj; 
     } 

} 

И в Project.cpp

int CHandle::id=0; 
CHandle *CHandle::obj=new CHandle(xxx);