2013-01-16 4 views
0

초보자는 이런 질문을하는 것이 유감입니다.C++ 메서드 인수 클래스 참조

MyClass* c = new MyClass("test"); 
method(c);//error cannot convert MyClass* to MyClass 

정의는 :

method(MyClass c); 

나는 또한 정의해야합니다 여기 내 문제입니까?

method(MyClass* c); 

나는 코드를 복제하고 싶지 않습니다. 적절한 방법은 무엇입니까? 당신이 method(MyClass c)

같은 방법을 정의하지만 다음 method(MyClass *c);

처럼 당신에게 방법을 정의하는 경우는 두 가지 대안이 결과가에 따라 한

MyClass *c = new MyClass("test"); 
method(c); 

할 필요가있는 경우 작동

+0

달성하려는 작업은 무엇입니까? 메모리가 걱정된다면, 필요한 것에 따라'method (MyClass & c)'또는'method (const MyClass & c)'를 시도해보십시오. – RageD

+0

그것은 당신이하려는 일에 달려 있습니다. –

+2

당신은'MyClass * c = new MyClass ("test")를 의미 했습니까? –

답변

2

분명히 자바 프로그래머입니다! 우선, 당신은 수행해야합니다 c는 "MyClass 포인터"입니다

MyClass* c = new MyClass("test"); 

하는 것으로 - new 표현이 당신에게 동적으로 할당 된 개체에 대한 포인터를 제공하기 때문에이 필요가.

이제 이것을 MyClass 인수를 사용하는 함수로 전달하려면 포인터를 역 참조해야합니다. 함수가 값에 의한 MyClass (안 참조)이 걸리기 때문에, 객체가 함수에 복사됩니다

method(*c); 

참고 : 그것은 당신이 할 것입니다. method 안에있는 MyClass 개체는 이전에 할당 한 개체의 복사본이됩니다. 인수의 유형은 함수가 수행하고 전달하고자하는 대상에 따라 달라집니다. 대신 함수 내부의 객체를 수정하면 함수 외부의 c 객체가 수정되므로 MyClass& 인수 (MyClass 참조)가 필요합니다. 당신이 인수 유형 MyClass* 될 가지고 있다면

, 당신은 간단하게 할 수있는 :

method(c); 

포인터 c 함수에 복사됩니다 때문, 참조를 전달하는 당신에게 유사한 의미를 줄 것이다 포인터가 참조하는 객체는 여전히 동적으로 할당 된 MyClass 객체입니다. 즉, 함수 내부에서 *d을 수정하면 c이 가리키는 개체도 수정됩니다.

이렇게 원시 포인터를 전달하는 것은 일반적으로 좋은 방법이 아닙니다. 이 함수는 포인터가 null이 아니라는 것을 명시 적으로 확인해야합니다. 그렇지 않으면 프로그램이 특정 조건 하에서 충돌 할 수 있습니다. 참조를 통한 시맨틱을 원한다면 참조 유형을 사용하십시오.

그러나 처음에는 MyClass 개체를 동적으로 할당하지 않는 것이 좋습니다. 당신이 자바로 많이했기 때문에 당신은 new만을 사용하고있는 것 같습니다. C++에서 new 식은 에 동적으로 개체를 할당하는 데 사용됩니다. 종종 동적으로 객체를 할당하고 싶지는 않습니다. 당신과 같이 할 것입니다 자동 저장 기간, 함께 만드는 완벽하게 괜찮 :

MyClass c("test"); 
method(c); 

그것은 당신이 좋은 이유가없는 포인터와 동적 할당을 방지하기 위해 C++에서 아주 좋은 연습 간주됩니다. 오류 및 버그가 많은 더 복잡한 코드로만 안내합니다. 사실 delete c;이 아니기 때문에 이미 제공 한 코드에 문제가 있습니다. 방금 제안한대로 수행하면 범위를 벗어날 때 개체가 파괴되므로 명시 적으로 삭제할 필요가 없습니다.

1
MyClass *c = new MyClass("test"); 

method(*c); 

당신이 만든 객체로 무엇을하고 싶습니까?

+0

이렇게하면 c의 * COPY *가 메소드로 전달됩니다. 그것이 옳은 일이라고 확신합니까? 이것은 단지 나쁜 충고 일뿐입니다. 어떤 사람이 "이 사각형의 못을 둥근 구멍에 집어 넣는 법"을 묻는다면 그 대답은 "망치로." 대답은 "당신은 무엇을하려고합니까?" 그래서 여기에서 당신은 그가 실제적으로 성취하려는 것을 설명하도록 영업 사원에게 요구해야합니다. –

+0

나는 동의한다. 그러나 나는 그와 같은 응답을 위해 투표했다. :( –