http://www.codeproject.com/KB/cpp/cppproperties.aspx
에 있는걸 참고해서 문제가 있었던 object1.prop = object2.prop의 문제를 수정하였으나
그 이외에도 문제가 많다.
에 있는걸 참고해서 문제가 있었던 object1.prop = object2.prop의 문제를 수정하였으나
그 이외에도 문제가 많다.
#include <stdio.h>
#include <atlbase.h>
#include <iostream>
/////////////////////////////////////////////////////////////////////////////
//
// Interface of the CProperty<TContainer,TValue> class
// Ref=http://www.codeproject.com/KB/cpp/cppproperties.aspx
//
/////////////////////////////////////////////////////////////////////////////
template<typename TContainer, typename TValue>
class CProperty
{
public:
typedef TValue (TContainer::*SETPROC)(TValue value);
typedef TValue (TContainer::*GETPROC)(void) const;
private:
TValue m_Value;
SETPROC m_pSetProc;
GETPROC m_pGetProc;
TContainer* m_pContainer;
public:
CProperty() :
m_pSetProc (NULL),
m_pGetProc (NULL),
m_pContainer(NULL)
{
}
CProperty(const CProperty& o)
{
m_Value = o.Get();
}
public:
void Bind (TContainer* container, GETPROC getproc, SETPROC setproc)
{
m_pContainer = container;
m_pGetProc = getproc;
m_pSetProc = setproc;
}
CProperty<TContainer,TValue> operator = (const CProperty& rhs)
{
Set(rhs.Get());
return *this;
}
TValue Get (void) const
{
ATLASSERT(m_pContainer != NULL);
ATLASSERT(m_pGetProc != NULL);
return (m_pContainer->*m_pGetProc)();
}
TValue Set (const TValue& value)
{
ATLASSERT(m_pContainer != NULL);
ATLASSERT(m_pSetProc != NULL);
return (m_pContainer->*m_pSetProc)(value);
}
operator TValue (void) const
{
return Get ();
}
TValue operator = (const TValue& value)
{
return Set (value);
}
};
/////////////////////////////////////////////////////////////////////////////
//
// Interface of the CProperties class
//
/////////////////////////////////////////////////////////////////////////////
class CProperties
{
private:
int m_Count;
public:
CProperty<CProperties,int> Count;
public:
CProperties () : m_Count(0)
{
Count.Bind (this, &CProperties::get_Count, &CProperties::set_Count);
}
public:
int get_Count (void) const
{
printf ("\t\t%08x::get_Count()=%d\r\n", this, m_Count);
return m_Count;
}
int set_Count (int n)
{
m_Count = n;
printf ("\t\t%08x::set_Count(%d)\r\n", this, m_Count);
return m_Count;
}
};
/////////////////////////////////////////////////////////////////////////////
//
// Test
//
/////////////////////////////////////////////////////////////////////////////
static int Test (void)
{
CProperties prop;
prop.Count = 100;
return prop.Count;
}
/////////////////////////////////////////////////////////////////////////////
//
// Startup
//
/////////////////////////////////////////////////////////////////////////////
int _tmain(int argc, _TCHAR* argv[])
{
CProperties Properties1, Properties2;
printf ("\t\tProperties1=%08x\r\n", &Properties1);
printf ("\t\tProperties2=%08x\r\n", &Properties2);
printf ("-------------------------------------------------------------\r\n");
printf ("Test()=%d\r\n", Test());
printf ("-------------------------------------------------------------\r\n");
Properties1.Count = 200;
Properties2.Count = Properties1.Count;
Properties1.Count = 100;
std::cout << "Properties1.Count=" <<Properties1.Count << std::endl;
std::cout << "Properties2.Count=" <<Properties2.Count << std::endl;
printf ("-------------------------------------------------------------\r\n");
int n=Properties2.Count;
printf ("printf() n =%d\r\n",n);
printf ("printf() cast =%d\r\n",(int)Properties2.Count);
printf ("printf() nocast=%d\r\n",Properties2.Count); // 방법없음
return 0;
}
PropertyTest.cpp