따라서 포인터로 전환시키면 정상 동작을 하네요.
아... 아까운 내 하루... ^^
관심가져주신 분들께 감사드립니다. 좋은 하루 보내십시오. ^^
xennie 님이 쓰신 글 :
:
: // 우선 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);
: //==============================================================================
: }
: }
: }
: |