我正在尝试创建一个静态成员函数,该函数返回指向该类的一个实例的指针。这在C ++中是否可行?
class DynamicMemoryLog
{
// Singleton Class:
public:
static DynamicMemoryLog* CreateLog();
void AddIObject( IUnknown* obj );
void ReleaseDynamicMemory();
private:
// static DynamicMemoryLog* instance;
static bool isAlive; // used to determine is an instance of DynamicMemoryLog already exists
DynamicMemoryLog();
~DynamicMemoryLog();
std::vector <IUnknown*> iObjectList;
};
下面这个函数应该创建一个类的新实例&amp;返回一个指向该对象的指针,但是如果它返回一个指针,编译器将不允许我定义该类的静态函数(我认为这就是为什么它不会编译?):
static DynamicMemoryLog* DynamicMemoryLog :: CreateLog()
{
// Post:
if ( !isAlive ) // ( instance == NULL; )
{
DynamicMemoryLog* instance = new DynamicMemoryLog();
return instance;
}
return NULL;
}
答案 0 :(得分:2)
您遇到的特定错误是,在实现静态成员函数时,您不会重复static关键字。修复此问题应解决错误。
独立地,你的代码有些奇怪。您声称此对象是单个对象,但每次调用CreateLog都将创建该类的新实例。你真的想要这种行为,还是你想要那么多副本?我建议在继续之前调查一下。
答案 1 :(得分:1)
这是最简单的解决方案,但不是线程安全的。有关详细分析,请查看this article。
class DynamicMemoryLog
{
public:
static DynamicMemoryLog* GetInstance();
private:
DynamicMemoryLog();
static DynamicMemoryLog* m_pInstance;
}
DynamicMemoryLog* DynamicMemoryLog::GetInstance()
{
if(!m_pInstance)
{
m_pInstance = new DynamicMemoryLog();
}
return m_pInstance;
}
答案 2 :(得分:0)
我通常做这样的事情:
class Singleton
{
public:
static Singleton* get()
{
static Singleton instance;
return &instance;
}
};
这样你就不会有任何讨厌的内存管理问题。