Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

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); }
};

Dr Jack
Hire Me For All Your Tutoring Needs
Integrity-first tutoring: clear explanations, guidance, and feedback.
Chat Now And Get Quote