Skip to main content
GameDev.net gamedev.net
🔒 Locked

Errors with my smart pointers

Started by sirSolarius Apr 29, 2004 at 6:06 PM 0 replies 650+ views
Original Post
sirSolarius
sirSolarius
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)
Thrump
Thrump
1) operator -> is defined differently than it''s declared.
const MemoryObject operator ->(); and
const MemoryObject *MemPtr::operator ->()
One''s returning a MemoryObject, the other a pointer to a MemoryObject. These 2 functions must return the same value.

2) Same for operator*

3) Use 0 in place of NULL

4) In operator* you''re missing an ; after your assert.

5) In your comparison operators, you''re comparing references to MemoryObjects to pointers to MemoryObjects.
bool MemPtr::operator ==(const MemoryObject &p)
{
return (mem==p);
}
Should be return *mem==p or return mem==&p

Topic Locked

This topic has been locked by a moderator. New replies are not allowed.

Sign in to reply to this topic.