Original Post
I am implementing a memory manager in my engine, and so I have "MemoryObject" objects that are referenced by "MemPtr" smart pointers.
MemoryObject is an abstract class, and so I''m getting some errors while trying to make MemPtr.
class MemoryObject
{
public:
MemoryObject();
virtual ~MemoryObject();
void attach();
void release();
int getRefs();
int size();
virtual bool Load(char *szFilename)=0;
protected:
int m_refs; // the references to the object
unsigned int m_size; // the size of the object''s data
};
class MemPtr
{
public:
MemPtr();
MemPtr(MemoryObject *p);
MemPtr(MemPtr &p);
~MemPtr();
void operator=(MemoryObject *p);
void operator=(MemPtr &p);
bool operator!();
bool operator==(const MemPtr &p);
bool operator==(const MemoryObject &p);
bool operator!=(const MemPtr &p);
bool operator!=(const MemoryObject &p);
const MemoryObject operator ->();
const MemoryObject* operator *();
bool isValid();
protected:
MemoryObject *mem;
};
MemPtr::MemPtr()
:mem(NULL)
{
}
MemPtr::MemPtr(MemoryObject *m)
:mem(m)
{
if(mem != NULL)
mem->attach();
}
MemPtr::MemPtr(MemPtr &p)
:mem(p.mem)
{
if(mem != NULL)
mem->attach();
}
MemPtr::~MemPtr()
{
if(mem != NULL)
mem->release();
}
void MemPtr::operator =(MemPtr &p)
{
// release old pointer
if(mem != NULL)
mem->release();
// get new pointer and attach it
mem=p.mem;
if(mem != NULL)
mem->attach();
}
void MemPtr::operator =(MemoryObject *p)
{
// release old pointer
if(mem != NULL)
mem->release();
// get new pointer and attach it
mem=p;
if(mem != NULL)
mem->attach();
}
const MemoryObject *MemPtr::operator ->()
{
assert(mem != NULL);
return mem;
}
const MemoryObject &MemPtr::operator *()
{
assert(mem != NULL)
return *mem;
}
bool MemPtr::operator ==(const MemoryObject &p)
{
return (mem==p);
}
bool MemPtr::operator ==(const MemPtr &p)
{
return (mem==p.mem);
}
bool MemPtr::operator !()
{
return (mem != NULL);
}
bool MemPtr::operator !=(const MemoryObject &p)
{
return (mem!=p);
}
bool MemPtr::operator !=(const MemPtr &p)
{
return (mem!=p.mem);
}
I get the following errors when I try to compile this:
--------------------Configuration: CurrentErikEngine - Win32 Debug--------------------
Compiling...
MemPtr.cpp
c:\program files\microsoft visual studio\opengl\strnad\project\recent\currenterikengine\memptr.h(32) : error C2259: ''MemoryObject'' : cannot instantiate abstract class due to following members:
c:\program files\microsoft visual studio\opengl\strnad\project\recent\currenterikengine\memoryobject.h(13) : see declaration of ''MemoryObject''
c:\program files\microsoft visual studio\opengl\strnad\project\recent\currenterikengine\memptr.h(32) : warning C4259: ''bool __thiscall MemoryObject::Load(char *)'' : pure virtual function was not defined
c:\program files\microsoft visual studio\opengl\strnad\project\recent\currenterikengine\memoryobject.h(23) : see declaration of ''Load''
c:\program files\microsoft visual studio\opengl\strnad\project\recent\currenterikengine\memptr.cpp(12) : error C2065: ''NULL'' : undeclared identifier
c:\program files\microsoft visual studio\opengl\strnad\project\recent\currenterikengine\memptr.cpp(13) : error C2440: ''initializing'' : cannot convert from ''int'' to ''class MemoryObject *''
Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
c:\program files\microsoft visual studio\opengl\strnad\project\recent\currenterikengine\memptr.cpp(13) : error C2439: ''mem'' : member could not be initialized
c:\program files\microsoft visual studio\opengl\strnad\project\recent\currenterikengine\memptr.h(38) : see declaration of ''mem''
c:\program files\microsoft visual studio\opengl\strnad\project\recent\currenterikengine\memptr.cpp(19) : error C2446: ''!='' : no conversion from ''int'' to ''class MemoryObject *''
Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
c:\program files\microsoft visual studio\opengl\strnad\project\recent\currenterikengine\memptr.cpp(19) : error C2040: ''!='' : ''class MemoryObject *'' differs in levels of indirection from ''int''
c:\program files\microsoft visual studio\opengl\strnad\project\recent\currenterikengine\memptr.cpp(26) : error C2446: ''!='' : no conversion from ''int'' to ''class MemoryObject *''
Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
c:\program files\microsoft visual studio\opengl\strnad\project\recent\currenterikengine\memptr.cpp(26) : error C2040: ''!='' : ''class MemoryObject *'' differs in levels of indirection from ''int''
c:\program files\microsoft visual studio\opengl\strnad\project\recent\currenterikengine\memptr.cpp(32) : error C2446: ''!='' : no conversion from ''int'' to ''class MemoryObject *''
Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
c:\program files\microsoft visual studio\opengl\strnad\project\recent\currenterikengine\memptr.cpp(32) : error C2040: ''!='' : ''class MemoryObject *'' differs in levels of indirection from ''int''
c:\program files\microsoft visual studio\opengl\strnad\project\recent\currenterikengine\memptr.cpp(39) : error C2446: ''!='' : no conversion from ''int'' to ''class MemoryObject *''
Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
c:\program files\microsoft visual studio\opengl\strnad\project\recent\currenterikengine\memptr.cpp(39) : error C2040: ''!='' : ''class MemoryObject *'' differs in levels of indirection from ''int''
c:\program files\microsoft visual studio\opengl\strnad\project\recent\currenterikengine\memptr.cpp(44) : error C2446: ''!='' : no conversion from ''int'' to ''class MemoryObject *''
Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
c:\program files\microsoft visual studio\opengl\strnad\project\recent\currenterikengine\memptr.cpp(44) : error C2040: ''!='' : ''class MemoryObject *'' differs in levels of indirection from ''int''
c:\program files\microsoft visual studio\opengl\strnad\project\recent\currenterikengine\memptr.cpp(51) : error C2446: ''!='' : no conversion from ''int'' to ''class MemoryObject *''
Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
c:\program files\microsoft visual studio\opengl\strnad\project\recent\currenterikengine\memptr.cpp(51) : error C2040: ''!='' : ''class MemoryObject *'' differs in levels of indirection from ''int''
c:\program files\microsoft visual studio\opengl\strnad\project\recent\currenterikengine\memptr.cpp(56) : error C2446: ''!='' : no conversion from ''int'' to ''class MemoryObject *''
Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
c:\program files\microsoft visual studio\opengl\strnad\project\recent\currenterikengine\memptr.cpp(56) : error C2040: ''!='' : ''class MemoryObject *'' differs in levels of indirection from ''int''
c:\program files\microsoft visual studio\opengl\strnad\project\recent\currenterikengine\memptr.cpp(61) : error C2556: ''const class MemoryObject *__thiscall MemPtr::operator ->(void)'' : overloaded function differs only by return type from ''const clas
s MemoryObject __thiscall MemPtr::operator ->(void)''
c:\program files\microsoft visual studio\opengl\strnad\project\recent\currenterikengine\memptr.h(32) : see declaration of ''->''
c:\program files\microsoft visual studio\opengl\strnad\project\recent\currenterikengine\memptr.cpp(61) : error C2373: ''->'' : redefinition; different type modifiers
c:\program files\microsoft visual studio\opengl\strnad\project\recent\currenterikengine\memptr.h(32) : see declaration of ''->''
c:\program files\microsoft visual studio\opengl\strnad\project\recent\currenterikengine\memptr.cpp(62) : error C2065: ''assert'' : undeclared identifier
c:\program files\microsoft visual studio\opengl\strnad\project\recent\currenterikengine\memptr.cpp(62) : error C2446: ''!='' : no conversion from ''int'' to ''class MemoryObject *''
Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
c:\program files\microsoft visual studio\opengl\strnad\project\recent\currenterikengine\memptr.cpp(62) : error C2040: ''!='' : ''class MemoryObject *'' differs in levels of indirection from ''int''
c:\program files\microsoft visual studio\opengl\strnad\project\recent\currenterikengine\memptr.cpp(67) : error C2556: ''const class MemoryObject &__thiscall MemPtr::operator *(void)'' : overloaded function differs only by return type from ''const class
MemoryObject *__thiscall MemPtr::operator *(void)''
c:\program files\microsoft visual studio\opengl\strnad\project\recent\currenterikengine\memptr.h(33) : see declaration of ''*''
c:\program files\microsoft visual studio\opengl\strnad\project\recent\currenterikengine\memptr.cpp(67) : error C2372: ''*'' : redefinition; different types of indirection
c:\program files\microsoft visual studio\opengl\strnad\project\recent\currenterikengine\memptr.h(33) : see declaration of ''*''
c:\program files\microsoft visual studio\opengl\strnad\project\recent\currenterikengine\memptr.cpp(68) : error C2446: ''!='' : no conversion from ''int'' to ''class MemoryObject *''
Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
c:\program files\microsoft visual studio\opengl\strnad\project\recent\currenterikengine\memptr.cpp(68) : error C2040: ''!='' : ''class MemoryObject *'' differs in levels of indirection from ''int''
c:\program files\microsoft visual studio\opengl\strnad\project\recent\currenterikengine\memptr.cpp(69) : error C2143: syntax error : missing '';'' before ''return''
c:\program files\microsoft visual studio\opengl\strnad\project\recent\currenterikengine\memptr.cpp(74) : error C2679: binary ''=='' : no operator defined which takes a right-hand operand of type ''const class MemoryObject'' (or there is no acceptable co
nversion)
c:\program files\microsoft visual studio\opengl\strnad\project\recent\currenterikengine\memptr.cpp(84) : error C2446: ''!='' : no conversion from ''int'' to ''class MemoryObject *''
Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
c:\program files\microsoft visual studio\opengl\strnad\project\recent\currenterikengine\memptr.cpp(84) : error C2040: ''!='' : ''class MemoryObject *'' differs in levels of indirection from ''int''
c:\program files\microsoft visual studio\opengl\strnad\project\recent\currenterikengine\memptr.cpp(89) : error C2679: binary ''!='' : no operator defined which takes a right-hand operand of type ''const class MemoryObject'' (or there is no acceptable co
nversion)
Error executing cl.exe.
CurrentErikEngine.exe - 32 error(s), 1 warning(s)