2010-06-15 4 views
1

개인용 벡터가 두 개인 클래스가 있습니다. 에 액세스하거나이 값을 수정, 처음에 나는 그런push_back 2 개의 메소드가있는 전용 벡터

void classA::pushVector(double i) 
{ 
this->vector.push_back(i); 
} 
double classA::getVector(int i) 
{ 
return vector[i]; 
} 
나는 내가 필요로 무엇을 사업자의 많은 과부하를해야 찾을 때까지 잠시 동안 일

등의 방법을 사용, 그래서 그것을 변경하려고합니다 얻고 자 즉, 값 대신 직접

void classA::setVector(vector<double> vector) 
{ 
this->vector = vector; 
} 
vector<double> classA::getVector() 
{ 
return vector; 
} 

를 벡터를 설정하기 위해, 또한 얻을 읽고 쓸 수있는 방법을 설정할 수있는 개인를 ClassA 요소를 가지고있는 ClassB가,이 말한다. 문제는 클래스 A의 끝 벡터에 값을 푸시하려고 할 때였습니다.

void classB::setFirstValue(double first) 
{ 
this->getClassA().getVector().push_back(first); 
} 

이것은 벡터에 전혀 영향을주지 않습니다. 그것은 변하지 않은 채로 남아 있고 왜 그럴 수 없는지 ... 어떤 아이디어입니까?

답변

3

getVector()에서 값을 기준으로 벡터를 반환합니다. 즉, "this-> getClassA(). getVector(). push_back (first);"라는 호출에서 벡터를 복사 한 다음 복사본의 요소를 푸시합니다. 복사본은 즉시 폐기됩니다.

원하는대로 작동 시키려면 참조로 벡터를 반환해야합니다.

"벡터 &를 ClassA :: getVector()"이 방법

+2

이것이 OP가 경험하는 동작의 이유이기는하지만, 내부 데이터에 대한 const가 아닌 참조는 전달해서는 안됩니다. jmclem을 사용하면 classA의 벡터 사용자에게 저장하는 데이터에 실제로 얼마만큼의 액세스 권한이 필요하며 classA의 멤버로 필요한 기능을 직접 구현해야합니다. – haffax

+0

완벽하게 작동했습니다. 감사합니다. haffax가 말했듯이, const는 제거되어야했습니다. 그것에 대해 무엇을해야할 지 알게 될 것입니다. 어쩌면 그 요소들이 사적 일 필요는 없지만, 나는 "좋은"구조를 형성하려고 노력했을 것입니다. 어쩌면 이것이 최선의 방법이 아닐 수도 있습니다. 도움 주셔서 감사합니다. – jmclem

2

:

void classA::setVector(vector<double> vector) 
{ 
this->vector = vector; 
} 

당신이 벡터의 사본을 전달하는 당신의 방법처럼 보일 것입니다. 실제 벡터를 전달하려면 참조가 필요합니다.

void classA::setVector(vector<double> & vector) 
{ 
this->vector = &vector; 
} 

그리고 벡터 변수는 포인터 여야합니다.

이 모든 것이 제게는별로 바람직하지 않은 것처럼 보입니다. 여러분의 수업이 실제로하는 일에 대해 다시 생각해 보겠습니다. 클래스가 클래스 외부의 포인터를 유지 관리하는 것보다 클래스를 벡터 관리하는 것이 훨씬 더 합리적입니다. 모든 클래스 메서드를 다시 구현해야하는 경우 te 클래스가 필요하지 않고 벡터 만 필요할 수 있습니다.

+0

이것은 가상의 것이 었습니다. 제가 작업하고있는 클래스에는 15 개 이상의 요소가 있으며, 그 중 일부는 벡터이며 이는 특별한 경우에 불과합니다. 위의 답변과 같이 참조를 사용했지만 결국 포인터를 사용할 필요가 없습니다. &는 함수 사본 범위를 벗어나는 변수의 메모리 주소를 가리킨다. 동일한 효과에 대한 포인터를 사용하려면 함수 밖의 변수에 대한 포인터를 작성하고 해당 포인터를 함수 인수로 사용해야합니다 (& s는 자연스럽게 사용하지 않음). 답변 해 주셔서 감사합니다. – jmclem

+0

@jmclem 그 의견에서 말하는 모든 내용이 잘못되었습니다. –

+0

꽤 오래 전 C++ (그리고 일반적으로 프로그래밍)로 시작 했으므로 가능합니다. 그것은 포인터없이 작동했습니다. – jmclem