I don\'t know what is wrong with my code and it won\'t run and I don\'t know wha
ID: 3819556 • Letter: I
Question
I don't know what is wrong with my code and it won't run and I don't know what to do? can someone please help thanks.
template<typename T>class CMemoryManager
{
private:
template<typename T> class Pointer
{
friend class CMemoryManager;
T* P;
DWORD* pdwRefCount;
public:
template<typename Type> void operator = (Type value)
{
*p = value;
}
template<typename Type> bool operator == (Type value)
{
return (*p == value);
}
operator T* () { return p;}
};
Pointer<T> p;
public:
CMemoryManager()
{
Init();
}
CMemoryManager(T* pNew)
{
Init();
SetNewPointer(pNew);
}
CMemoryManager(int val)
{
Init();
SetNewPointer((T*)val);
}
CMemoryManager(const CMemoryManager& rmm)
{
Init();
UpdateMemoryManager(rmm);
}
~CMemoryMangger()
{
if (p.pdwRefCount == NULL) return;
if(*p.pdwRefCount == 0 || --(*p.pdwRefCount) == 0)
{
delete p.p;
delete p.pdwRefCount;
Init();
}
}
void Init()
{
p.pdwRefCount = NULL;
p.p = NULL;
}
void AssignNewPointer(const T* pNew)
{
p.p = (T*)pNew;
}
void CheckRefCount()
{
if(p.pdwRefCount == NULL) NewRefCounter();
}
void SetRefCount(DWORD dwNewCount)
{
CheckRefCount();
*p.pdwRefCount = dwNewCount;
}
void IncreaseRefCount()
{
CheckRefCount();
(*p.pdwRefCount)++;
}
void NewRefCounter()
{
p.pdwRefCount = new DWORD;
*p.pdwRefCount = 0;
}
void SetNewPointer(const T* pNew)
{
Delete();
AssignNewPointer(pNew);
IncreaseRefCount();
}
void Delete()
{
this ->~CMemoryManager();
Init();
}
void UpdateMemoryManager(const CMemoryManager& rmm)
{
Delete();
AssignNewPointer(rmm.p.p);
p.pdwRefCount = rmm.p.pdwRefCount;
IncreaseRefCount();
}
void operator = (int val)
{
SetNewPointer((T*)val);
}
void operator = (const T* pmm)
{
SetNewPointer(pmm);
}
void operator = (const CMemoryManager* pmm)
{
UpdateMemoryManager(*pmm);
}
void operator = (const CMemoryManager& rmm)
{
UpdateMemoryManager((CMemoryManager&)rmm);
}
void SetNewAddr(T* pNewAddr, DWORD dwRefCount)
{
Delete();
SetNewPointer(pNewAddr);
SetRefCount(pdwRefCount);
}
void Detach()
{
if(*p.pdwRefCount == 1)
{
delete p.pdwRefCount;
delete p.p;
}
p.pdwRefCount = NULL;
p.p = NULL;
}
int GetSize() { return sizeof(*p.p);}
Pointer<T>& operator * () { return p;}
T* operator -> () { return p.p;}
operator T* () { return p.p;}
operator void* () { return p.p;}
void operator delete(void* p) {}
//Do nothing if attempting to delete the object.
//Object will automatically be deleted by the class.
T*GetPointer() {return p.p;}
bool operator == (int nCompare) {return (p.p == (T*)nCompare);}
operator bool () { return(p.p != NULL); }
};
Explanation / Answer
Hi , I have resolved your errors. The updated code is as below. Add a main method or use the cpp to some other class having main method to run it. I have resolved all compilation errors for this and it was compiled successfully.
Here is the code: -
#include <windows.h> // for using DWORD
template<typename T>class CMemoryManager
{
private:
template<typename T1> class Pointer /* A template-parameter shall not be redeclared within its scope (including nested scopes).*/
{
friend class CMemoryManager;
T* P;
DWORD* pdwRefCount;
public:
template<typename Type> void operator = (Type value)
{
*p = value;
}
template<typename Type> bool operator == (Type value)
{
return (*p == value);
}
operator T* () { return p;}
};
Pointer<T> p;
public:
CMemoryManager()
{
Init();
}
CMemoryManager(T* pNew)
{
Init();
SetNewPointer(pNew);
}
CMemoryManager(int val)
{
Init();
SetNewPointer((T*)val);
}
CMemoryManager(const CMemoryManager& rmm)
{
Init();
UpdateMemoryManager(rmm);
}
~CMemoryManager() // There was some typing error here. the destructor name should be same as that of class
{
if (p.pdwRefCount == NULL) return;
if(*p.pdwRefCount == 0 || --(*p.pdwRefCount) == 0)
{
delete p.p;
delete p.pdwRefCount;
Init();
}
}
void Init()
{
p.pdwRefCount = NULL;
p.p = NULL;
}
void AssignNewPointer(const T* pNew)
{
p.p = (T*)pNew;
}
void CheckRefCount()
{
if(p.pdwRefCount == NULL) NewRefCounter();
}
void SetRefCount(DWORD dwNewCount)
{
CheckRefCount();
*p.pdwRefCount = dwNewCount;
}
void IncreaseRefCount()
{
CheckRefCount();
(*p.pdwRefCount)++;
}
void NewRefCounter()
{
p.pdwRefCount = new DWORD;
*p.pdwRefCount = 0;
}
void SetNewPointer(const T* pNew)
{
Delete();
AssignNewPointer(pNew);
IncreaseRefCount();
}
void Delete()
{
this ->~CMemoryManager();
Init();
}
void UpdateMemoryManager(const CMemoryManager& rmm)
{
Delete();
AssignNewPointer(rmm.p.p);
p.pdwRefCount = rmm.p.pdwRefCount;
IncreaseRefCount();
}
void operator = (int val)
{
SetNewPointer((T*)val);
}
void operator = (const T* pmm)
{
SetNewPointer(pmm);
}
void operator = (const CMemoryManager* pmm)
{
UpdateMemoryManager(*pmm);
}
void operator = (const CMemoryManager& rmm)
{
UpdateMemoryManager((CMemoryManager&)rmm);
}
void SetNewAddr(T* pNewAddr, DWORD dwRefCount)
{
Delete();
SetNewPointer(pNewAddr);
SetRefCount(dwRefCount); // Again some typing error here you have added p in front of dwRefCount
}
void Detach()
{
if(*p.pdwRefCount == 1)
{
delete p.pdwRefCount;
delete p.p;
}
p.pdwRefCount = NULL;
p.p = NULL;
}
int GetSize() { return sizeof(*p.p);}
Pointer<T>& operator * () { return p;}
T* operator -> () { return p.p;}
operator T* () { return p.p;}
operator void* () { return p.p;}
void operator delete(void* p) {}
//Do nothing if attempting to delete the object.
//Object will automatically be deleted by the class.
T*GetPointer() {return p.p;}
bool operator == (int nCompare) {return (p.p == (T*)nCompare);}
operator bool () { return(p.p != NULL); }
};
Related Questions
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.