Синглтон шаблон с ++ ошибка - PullRequest
1 голос
/ 29 июля 2011

Привет, я реализовал шаблон синглтона в c ++ с VS2010, и компилятор выдает мне ошибку !!

#ifndef __EgEngine__ 
#define __EgEngine__ 1

#include <esUtil.h>
#include <stdlib.h>
#include <EgGpuManager.h>

class   EgEngine
{
public:
    EgEngine();
    static EgGpuManager GetGpuManager();
    ~EgEngine();
    void EgInit();

private:
    EgEngine(const EgEngine &other){};
    EgEngine* operator = (const EgEngine &other)const {};
    static EgGpuManager GpuManager; // Return this !! 
    ESContext esContext;
};

#endif

Другой класс

#ifndef __EgGpuManager__
#define __EgGpuManager__ 1

#include <EgBuffer.h>
#include <EgProgram.h>


    class EgGpuManager
    {
    public:
        EgBuffer* GetBuffer();
        EgProgram* GetNewProgram();

    private:
        EgGpuManager();
        ~EgGpuManager();
        EgBuffer buffer;
    };

#endif

И когда я пытаюсь скомпилировать, у меня появляется эта ошибка:

1>EgEngine.obj : error LNK2001: 
unresolved external symbol "private: static class
EgGpuManager EgEngine::GpuManager" (?GpuManager@EgEngine@@0VEgGpuManager@@A)

Помогите мне, пожалуйста, и спасибо.

Ответы [ 3 ]

4 голосов
/ 29 июля 2011

static EgGpuManager GpuManager; // Return this !! этот парень должен быть создан где-то в вашем C ++ коде.

static члены класса должны появляться в глобальной области видимости, поэтому в файле C ++ добавьте:

EgGpuManager EgEngine::GpuManager.

Кстати, у вас есть приватный конструктор для класса EgGpuManager, который будет проблемой в этом случае, потому что он создается EgEngine. Вы не правильно внедрили синглтон. Используйте метод static EgGpuManager *EgGpuManager::Get() для возврата экземпляра, и он будет создавать экземпляр класса при первом вызове, а затем вы можете сделать это с помощью частного конструктора. В противном случае сделайте их friend с.

0 голосов
/ 29 июля 2011

Вы должны поместить экземпляр объекта singleton либо в глобальную область, как предложено другими ответами, либо в реализацию GetGpuManager(), например:

EgGpuManager& EgEngine::GetGpuManager()
{
  static EgGpuManager GpuManager;
  return GpuManager;
}

В этом случае вам нужноудалите объявление GpuManager из определения класса.Также обратите внимание на &, чтобы вернуть ссылку, так как вы, конечно, не хотите возвращать копию объекта (что противоречит цели создания синглтона).Преимущество здесь в том, что объект не будет создан до тех пор, пока GetGpuManager() не будет вызван впервые, тогда как все статические данные в глобальной области видимости создаются при запуске программы.

0 голосов
/ 29 июля 2011

Строка «Статический EgGpuManager GpuManager;» внутри объявления класса EgEngine есть только объявление 1002 *: вы говорите, что этот объект где-то будет существовать. Линкер жалуется, что нигде не нашел объект. Чтобы решить эту проблему, поместите экземпляр в один из ваших исходных файлов (в глобальной области видимости):

EgGpuManager EgEngine::GpuManager;
...