// 우선 C++Builder 게시판에 올리게 돼 매우 조심스럽습니다.
// 물어볼 만한 곳이 이곳 밖에 없어서 올립니다.
// 행여 문제가 된다면 댓글주시면 삭제하겠습니다.
// 아래의 소스튼 VS 2008 SP1에서 작성했습니다.
// composite 패턴을 사용해 본건데요.
// 문제가 되는 부분은 아래의 주석 부분입니다.
class super
{
public:
int GetName()
{
return 0;
}
int SetName(int n)
{
n_age = n;
return 0;
}
protected:
int n_age;
};
typedef std::vector super_vector;
typedef super_vector::iterator super_iter;
class leaf : public super
{
};
class composite : public super
{
public:
super_vector* get_vector()
{
return &m_sv;
}
private:
super_vector m_sv;
};
void setup_sub(composite* pC)
{
leaf lf1;
leaf lf2;
lf1.SetName(11);
lf2.SetName(12);
pC->get_vector()->push_back(lf1);
pC->get_vector()->push_back(lf2);
}
void CrttiDlg::OnBnClickedOk()
{
// TODO: Add your control notification handler code here
super_vector sv;
leaf lf1;
leaf lf2;
composite c;
lf1.SetName(1);
lf2.SetName(2);
c.SetName(100);
sv.push_back(lf1);
sv.push_back(lf2);
sv.push_back(c);
setup_sub(&c);
for(int i=0; i < sv.size(); i++)
{
if(i==2)
{
//=============================================================================
// 바로 이부분인데요.
// 여기에서 형변환해서 보면 super의 형태는 정상으로 보이는데.
// reinterpret_cast, dynamic_cast, static_cast 포함해서
// composite로 명시적인 변환을 시도하면 composite의 멤버 super_vec이
// 비정상적인 데이터입니다.
// 예상했던는 2개의 데이터가 들어있어야 하는데, 쓰레기 데이터가...
// 어제 하루종일 이문제로... ㅠㅠ
composite* p_c = (composite*)(&sv[i]);
super_vector* p_sv = p_c->get_vector();
CString s_msg;
s_msg.Format("sizeof composite:[%d]", p_sv->size());
AfxMessageBox(s_msg);
//==============================================================================
}
}
}
|