두 개의 인스턴스 변수와 해당 클래스에 대한 참조를 가져 와서 인스턴스 변수를 변경하는 B 클래스가 있습니다. B 클래스가 이러한 변수를 변경 한 후에는 클래스의 원래 인스턴스에서 변경 될 것이라고 생각할 수 있지만이 경우에는 변경되지 않습니다. 왜 이런 일이 일어나고 어떻게 해결할 수 있습니까?참조로 전달 된 클래스를 수정하는 C++은 원본 객체를 변경하지 않습니다.
class Foo {
public:
int x;
int y;
Foo() {
}
Foo(int x, int y) {
this->x = x;
this->y = y;
}
};
class Bar {
public:
Foo foo;
Bar() {
}
Bar(Foo& foo) {
this->foo = foo;
}
void Swap() {
int tmp = foo.x;
foo.x = foo.y;
foo.y = tmp;
}
};
int main()
{
Foo foo(4, 8);
Bar bar(foo);
std::cout << "this is x: " << foo.x << std::endl; //prints 4
std::cout << "this is y: " << foo.y << std::endl; //prints 8
bar.Swap();
std::cout << "this is x: " << foo.x << std::endl; //prints 4, but should print 8
std::cout << "this is y: " << foo.y << std::endl; //prints 8, but should print 4
}
스택 오버플로에 오신 것을 환영합니다. [The Tour] (http://stackoverflow.com/tour)를 읽으신 후 [Help Center] (http://stackoverflow.com/help/asking)의 자료를 참조하십시오. 여기에 물어보십시오. –
이러한 문제를 해결하는 올바른 도구는 디버거입니다. 스택 오버플로를 묻기 전에 코드를 단계별로 실행해야합니다. 자세한 도움말은 [작은 프로그램 디버깅 방법 (Eric Lippert 작성)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)을 참조하십시오. 최소한 디버거에서 관찰 한 내용과 함께 문제를 재현하는 [Minimal, Complete, Verifiable] (http://stackoverflow.com/help/mcve) 예제를 포함하도록 질문을 편집해야합니다 . –
'Bar'는'Foo' 소스에 대한 참조가 아닌'Foo' 소스의 사본을 보유합니다. 'Foo'는 참조로 함수에 전달되었지만 복사되었습니다. – user4581301