2013-05-10 2 views
3

) 아래의 방법을 사용하여 벡터 A를 만들고 다른 클래스의 벡터 B에 복사하려면 올바른 방법입니까? 벡터 A가 파괴 될 수 있습니다! Google에서 검색했지만 좋은 해결책과 의미있는 설명을 찾을 수 없습니다. 모두에게 감사합니다벡터 <pointer*>에서 벡터 <pointer*> (C++의 경우

+0

네, 그 말이 맞습니다 ... 한 두 포인터가 동일한 개체를 가리킬 수 있습니다 기억하십시오. – Beta

+0

'void StateInit (const vector & listBtn)'함수를 작성하는 것이 좋습니다. 이제 작성된 방식으로 벡터는 두 번,'listBtn'에 한 번,'_m_pListBtn'에 다시 복사됩니다. 그 점은 없습니다. – john

+0

@john 및 Beta 벡터 A가 향후 파괴 될 수 있지만 B에서 액세스 할 때 null 예외가 발생합니까? 그렇지 않다면 우리가 '_m_pListBtn = listBtn;'을 수행했기 때문에 추측합니다. listBtn의 모든 요소를 ​​_m_pListBtn에 복사 만하면 벡터 A의 포인터를 벡터 B에 복사하지 않습니다. ??? 나는 C++의 새로운 녀석이다. 어리석은 질문을한다.^ –

답변

4

예와 아니오, 당신이 전달하는 벡터 :

는 예제 코드를 참조

void StateInit(vector<CButton*> listBtn) 
{ 
    _m_pListBtn = listBtn; 
}; 

느릅 나무가 listBtn 벡터 A의 사본 (asuming 우리는 벡터 a를 호출하는 것을 의미 하나는 StateInit의 매개 변수로 전달됨), 벡터 A를 삭제하면 벡터 B는 여전히 포인터 컬렉션을 가지며 포인터 벡터 벡터의 파기가 뾰족한 객체를 지울 수 없으므로 유효한 것입니다. 삭제, 삭제 [], 무료?).

벡터 A에서 요소 중 하나를 수정/삭제하면 (벡터에 대한 포인터 사용) 해당 요소는 벡터 B에서 수정됩니다 (동일한 요소에 대한 포인터이기 때문에). 단지 그런

class cloneFunctor { 
public: 
    T* operator() (T* a) { 
     return a->clone(); 
    } 
} 

:

임 확실하지 않은 그들 변환을 사용하여 복사 한 다음이 함께하고자하지만, 전체 벡터를 복사 할 경우, 당신은 개체의 복제 메커니즘을 구현해야하고 무엇을 :

void StateInit(vector<CButton*> listBtn) 
{ 
    transform(listBtn.begin(), listBtn.end(), back_inserter(_m_pListBtn), cloneFunctor()); 
}; 

당신의 의도를 복제하지만 당신은 포인터 나 레퍼런스로 벡터 통과해야 포인터를 공유 할 수없는 경우 :

void StateInit(const vector<CButton*>& listBtn) 
{ 
    _m_pListBtn = listBtn; 
}; 
,691을
+0

의미있는 설명, 답변 해 주셔서 감사합니다! –

관련 문제