2012-08-23 3 views
2

에 해당 주소를 누른 후 개체를 변경 : 나는 두 벡터에 클래스 B의 객체를 다시 밀어 경우나는 질문이 벡터

class B : public class A { 
public: 
    vector<int*> vec; 
}; 

class A { 
}; 

vector<A*> vec_a; 
vector<B*> vec_b; 

합니다. 그 후, 나는 클래스 B의 대상이 안에 뭔가를 변경

B* b = new B; 
vec_a.push_back(b); 
vec_b.push_back(b); 

,

같은 :

int* i = .... 
vec_b[0].push_back(i); 

vec_a 변화를합니까?

벡터 push_back 때만 사본을 생성한다는 것을 확인한 이후 혼란 스럽습니다. 그러나 위의 코드를 확인하면 변경됩니다. 두 벡터가 객체 b의 공유 메모리를 가지고 있습니까?

감사

+0

'vec_a'는 바뀌지 않으며, B 객체 안에있는'vec'는 바뀌지 않습니다. – jrok

답변

1

벡터에는 공통 개체에 대한 포인터가 들어 있습니다. 따라서 포인터 중 하나의 derefence를 통해 해당 오브젝트 내부에서 변경 한 내용은 가리키는 오브젝트에 반영됩니다. 벡터에 포인터를 추가하면 포인터가 가리키는 객체가 아닌 포인터 자체의 복사본이 생성됩니다. 인스턴스이 두 벡터에 모두 B 인 경우 각 벡터에 해당 개체의 복사본이 포함됩니다. 포인터를 추가하면 원래 벡터 포인터의 복사본이 각 벡터에 추가되지만 두 복사본은 모두 동일한 값을 가지며 포인터가 가리키는 개체의 메모리 주소가됩니다.

+0

나는 당신과 동의했다, 당신은 지금 나를 분명하게한다.그러나 위의 사람들에게는 다른 옵션이있는 것 같습니다. –

+0

@ forester2012 어쩌면 당신은 내 대답을 오해했을 것입니다. 여기에있는 모든 대답은 똑같은 말입니다. 약간 다른 방식으로 말입니다. – mathematician1975

1

당신은 너무, 너무 개체에 어떤 변화가 vec_b의 요소에 영향을 미칠 것 vec_a의 요소에서 지적 두 벡터에 동일한 개체에 대한 포인터를두고 있습니다.

+0

나는 당신에게 동의하며, 그것이 옳았다는 것을 보여 주었다. 이제 나는이 이론들로 더욱 분명 해졌다. –

1

예. 결국 하나의 객체 만 만듭니다. 포인터를 밀었습니다. 따라서 std::vector 복사본 포인터가 가리키는 메모리를 변경합니다. 그런 이유로 당신은 당신의 결과를 얻는다. 포인터에 대해 좀 더 읽으시 길 바랍니다.

+0

예, 포인터를 더 읽습니다. 사실 저는 vec_b를 원합니다. 왜냐하면 []을 사용하여 쉽게 내 물건을 참조 할 수 있기 때문입니다. 그러나 vec_a는 많은 다른 종류의 물건을 가지고 있습니다. 그게 내 문제가되는 이유입니다. –

2

예, vector으로 푸시하면 사본이 만들어집니다. 그러나 귀하의 경우에는 포인터 사본이며 실제 개체의 사본이 아닙니다.

0

벡터 푸시 백 메소드는 실제로 사본을 작성합니다. 그러나 vec_a 및 vec_b에 대한 포인터 벡터를 지정 했으므로 해당 포인터를 복사해도 실제로 원래 객체가 변경되지는 않습니다. 대신

vector<A> vec_a; 
vector<B> vec_b; 

을 사용하는 경우

B b; 
vec_a.push_back(b); 
vec_b.push_back(b); 

실제로 벡터에 B의 콘텐츠를 복사 할 함께하는 벡터를 작성, 원래 기대했던 얻을 것입니다. 하나를 변경해도 다른 하나에는 영향을주지 않습니다.

관련 문제