C++ 如何在c++;

C++ 如何在c++;,c++,templates,object-pooling,C++,Templates,Object Pooling,我想写一个通用的对象池类,对象池应该是单例的,在任何地方访问对象池都很容易 template <class T> class Pool { T* _freeObjs; public: Pool<T>& getInstance() { static Pool<T> instance; return instance; } T* acquire() { ... }

我想写一个通用的对象池类,对象池应该是单例的,在任何地方访问对象池都很容易

template <class T>
class Pool
{
    T* _freeObjs;
 public:
    Pool<T>& getInstance()
    {
        static Pool<T> instance;
        return instance;
    }
    
    T* acquire() { ... }
    
    void release(T* obj) { ... }
    
 private:
    Pool()
    {
        _freeObjs = (T*)malloc(sizeof(T) * 100);
    }
};

class Foo
{
    int i;
public:
    void* operator new(size_t size) 
    { 
        void * p = Pool<Foo>::getInstance().acquire();
        return p; 
    } 
  
    void operator delete(void * p) 
    {  
        Pool<Foo>::getInstance().release(p);
    } 
};

int main()
{
    {
        Foo* f = new Foo();
        delete f;
    }
    
    return 0;
}
模板
班级池
{
T*_freeObjs;
公众:
池&getInstance()
{
静态池实例;
返回实例;
}
T*acquire(){…}
无效释放(T*obj){…}
私人:
池()
{
_freeObjs=(T*)malloc(sizeof(T)*100);
}
};
福班
{
int i;
公众:
void*运算符新(大小\u t大小)
{ 
void*p=Pool::getInstance().acquire();
返回p;
} 
void运算符删除(void*p)
{  
Pool::getInstance().release(p);
} 
};
int main()
{
{
Foo*f=新的Foo();
删除f;
}
返回0;
}
但是编译器会显示以下错误消息

错误:无法在没有对象的情况下调用成员函数“Pool&Pool::getInstance()[with T=Foo]”

void*p=Pool::getInstance().acquire()

更新:谢谢你,保罗·麦肯齐 在我将static添加到getInstance()函数之后,代码就可以正常工作了

现在,我将重载操作符new/delete移动到基类,如果我的以下代码有任何错误

class PooledObject
{
public:
    void* operator new(size_t size) 
    { 
        void * p = Pool<PooledObject>::getInstance().acquire();
        return p; 
    } 
  
    void operator delete(void * p) 
    { 
        Pool<PooledObject>::getInstance().release((PooledObject*)p);
    } 
};

class Foo : public PooledObject
{
    int i;
public:
};
类池对象
{
公众:
void*运算符新(大小\u t大小)
{ 
void*p=Pool::getInstance().acquire();
返回p;
} 
void运算符删除(void*p)
{ 
Pool::getInstance().release((PooledObject*)p);
} 
};
类Foo:公共池对象
{
int i;
公众:
};
您的
池和getInstance()
不是
静态的
。如果要在不创建对象的情况下访问
getInstance
,则需要使用
static
函数:

static Pool<T>& getInstance()
{
    static Pool<T> instance;
    return instance;
}
静态池&getInstance()
{
静态池实例;
返回实例;
}

错误消息说您不能将getInstance作为Pool::getInstance调用,它是静态的(没有对象)。getInstance是一个方法,而不是静态的。将GETPATH声明为静态,当您想将其用作静态时。如果它解决了问题,请考虑接受答案: