2017-03-20 3 views
2

저는 C++에 완전히 익숙하며 주어진 리터 퍼즐을 해결하는 프로그램을 작성하는 것이 좋습니다. (3 리터와 5 리터의 용량을 가진 2 개의 컨테이너가 있습니다. 4 리터를 얻는가?)함수는 C++에서 객체 속성을 변경하지 않습니다.

나는 주어진 컨테이너에 대한 클래스와 하나의 컨테이너의 내용물을 다른 것으로 '붓는'기능을 썼다. 그러나 클래스 전체가 공개 임에도 불구하고이 함수는 모든 객체의 내용 값을 변경하지 않습니다. 내가 뭘 잘못하고 있는지 모르겠다.

#include <iostream> 
using namespace std; 

class Container { 
    public: 
     int quantity; //quantity of water in container 
     int size; //max amt of water 
}; 

void pour(Container a, Container b) { 

    int differential = b.size - b.quantity; 

    if (a.quantity <= differential) { 
     b.quantity = a.quantity + b.quantity; 
     a.quantity = 0; 
    } 

    else if (a.quantity > differential) { 
     b.quantity = b.quantity - differential; 
     a.quantity = a.quantity - differential; 
    } 

}; 

int main() { 
    Container bottle1; 
    bottle1.quantity = 5; 
    bottle1.size = 6; 

    Container bottle2; 
    bottle2.quantity = 0; 
    bottle2.size = 2; 

    pour(bottle2, bottle1); 


    cout << bottle1.quantity << ", " << bottle2.quantity << endl; 
    return 0; 
} 

내 실수가 분명하다 확신하지만 난 아무데도 답변을 찾을 수 없습니다

여기 내 코드입니다. 어떤 도움이라도 대단히 감사하겠습니다.

+2

인수 대신 값으로 참조하십시오. 'void pour (Container & a, Container & b)' – Jarod42

답변

5

Container을 사본으로 전달 중입니다. 즉, pour 함수에서 변경 한 컨테이너는 함수 종료시 소멸됩니다.

용액의 참조를 사용하는 것이다 : 타입 기준을 나타낸다

void pour(Container& a, Container& b) 

& 후. 즉, ab의 복사본이 pour 안에 사용되는 대신 해당 함수는 호출자와 동일한 ab에 액세스합니다.

3

이것은 아마도 값으로 개체를 전달하기 때문일 수 있습니다. 참조로 전달할 수 있습니다. 메서드 헤더를 변경하여이 작업을 수행 할 수 있습니다.

기본적으로 메서드 머리글에있는 Container의 각 인스턴스는 Container&이되어야합니다. 통화를 변경할 필요가 없습니다.

포인터를 전달할 수도 있습니다. 그러면 귀하의 주장은 Container *a이되며 전화 할 때 각 변수 이름 앞에 앰퍼샌드 (&)를 추가해야합니다 (예 : a&a). 그런 다음 객체의 모든 참조를 기간 (.)에서 화살표 (->)로 변경해야합니다.

귀하의 방법이 될 것입니다 :

나는 두 있기 때문에 어떤 경우에는 프로그램의 설계자가 모든 참조가 const를 참조있는 규칙을 채택 언급
void pour(Container *a, Container *b) { 

    int differential = b->size - b->quantity; 

    if (a->quantity <= differential) { 
     b->quantity = a->quantity + b->quantity; 
     a->quantity = 0; 
    } 

    else if (a->quantity > differential) { 
     b->quantity = b->quantity - differential; 
     a->quantity = a->quantity - differential; 
    } 

}; 

. 즉, 참조로 전달 된 모든 개체는 수정되지 않으며 메서드 머리글의 형식 이름 앞에 const 키워드를 사용하여 적용되며 다른 모든 개체는 포인터로 전달됩니다. 이렇게하면 함수 호출에서 인수가 수정되는지 여부를보다 명확하게 알 수 있습니다.

해당 규약에서 값 통과에 대한 const 참조를 사용하는 것은 함수 호출의 효율성을 높이는 것입니다. 객체의 복사본을 만드는 것보다 참조를 전달하는 것이 더 빠릅니다.

+1

아니면 그냥'const' 참조와 non-'const' 참조를 가질 수 있고 포인터로 주위를 둘러 볼 필요가 없습니다! – Charles

+0

사실,하지만 일부 사람들은 메소드 호출에서 알 수 있기를 원한다고 불평합니다. 포인터를 사용하여 메소드 호출은 기본적으로 변경 사항을 알립니다.없으면 메소드 호출은 메소드가 변경하지 않을 것을 제안합니다. –

+1

의미가 있지만 그게 무엇을위한 문서인가! – Charles

관련 문제