내 코드를 컴파일 할 때 경고 메시지가 나타납니다. 경고 : 로컬 변수 'str'에 대한 참조가 반환 됨 [기본적으로 사용 가능] 문제가 무엇인지, m 당신이를 반환하는연산자가 오버로드되는 C++의 MyString 클래스
답변
.. 내가 왜 임 개체를 반환하는 것을 불평 모른다 ..이 경고를 받고 모두 임에
MyString& operator+(MyString &a){
char *tmp=new char[strlen(szArr)+strlen(a.szArr)+1];
strcpy(tmp, szArr);
strcat(tmp, a.szArr);
MyString str(tmp);
delete tmp;
return str;
}
MyString& operator+(char *s){
if(s)
return *this;
char *tmp=new char[strlen(szArr)+strlen(s)+1];
strcpy(tmp, szArr);
strcat(tmp, s);
MyString str(tmp);
delete tmp;
return str;
}
... ..이 내 코드입니다 잘못하고 함수가 반환 할 때 범위를 벗어나는 로컬 (스택) 변수에 대한 참조입니다. 개체가 유효하지 않으므로 컴파일러에서 경고 메시지를 표시하지 않습니다. 복사 생성자를 정의하고 값으로 개체를 반환했는지 확인하십시오 (반환 유형에서 &
을 제거하십시오).
나에게 무엇을 제안합니까? – JV17
객체의 복사본을 반환하는 값으로 반환 할 수 있습니다 ('&'제거). – edtheprogrammerguy
고마워 .. 내 문제는 뭐야 ... – JV17
이미 존재하는 개체가 아닌 새 개체를 반환하는 경우 참조를 반환하면 안됩니다. 참조 토큰을 제거하십시오. (당신이 생성 한 객체는 함수가 반환 될 때 destructed 될 것이므로 참조는 무효 한 객체를 대상으로합니다. 비 참조를 반환한다는 것은 객체가 원하는대로 복사/이동된다는 것을 의미합니다. . 어쨌든 복사)
또한, 당신은 인수를 수정하지 않기 때문에, 그들은 const
를 선언해야하므로 const
객체 (또는 문자열 리터럴)에 전달 될 수
MyString& operator+(MyString &a);
MyString& operator+(char *s);
가되어야한다.
MyString operator+(MyString const &a);
MyString operator+(char const *s);
이 논리 거꾸로입니다
참고 :
if(s)
return *this;
이됩니다 문자열 하지 null의 경우 무 조작. 나는 당신이 의미하는 것을 가정 :
if(!s)
return *this;
당신은 당신의 함수 내 임시 MyString str(tmp);
변수를 만드는 한 다음 범위를 벗어난 간 그 변수의 메모리에 대한 참조를 반환하기 위해 노력하고 있습니다.
이 오류 메시지의 정확한 이유는 확실하지 않지만 그 반환 값을 사용하려고 시도 할 때마다 발생하는 문제입니다.
오류는 컴파일러가 말한 것과 정확히 같습니다. 로컬 변수에 대한 참조가 반환됩니다. 지역 변수는 스택에 저장되고 함수가 끝나면 지역 변수가 범위를 벗어나므로 지역 변수에 대한 참조를 반환하면 정의되지 않은 동작이 발생합니다.
가치에 의한 수익을 사용해야합니다.
또 다른 제안 : 두 개의 함수 매개 변수가있는 연산자 양식을 사용하고 참조 별 결과를 유지할 수 있습니다.
는 예를 들어 살펴 here을 가지고- 1. 템플릿 클래스에 [] 연산자가 오버로드되는 문제
- 2. 오류 : 연산자가 오버로드되는 동안 lvalue가 필요합니다. ++/- etc
- 3. << 연산자가 오버로드되는 동안 개인 클래스 멤버에 액세스하는 데 문제가 있습니다.
- 4. 라우팅으로 오버로드되는 메소드
- 5. python으로 오버로드되는 메소드
- 6. 제네릭 클래스 연산자가 작동하지 않습니다
- 7. C의 클래스 대기열 #
- 8. Objective-C의 테스트 클래스
- 9. Objective-C의 친구 클래스
- 10. C의 구조체와 클래스 ++
- 11. [myString release]를 호출해도 [myString retainCount]가 감소하지 않습니다.
- 12. mvc2 Html.label ("mystring") mangling
- 13. Python 3.5 - @overload로 오버로드되는 메소드
- 14. "<<"연산자가 오버로드되는 동안 내 클래스에서 선언 된 멤버에 액세스 할 수없는 이유는 무엇입니까?
- 15. 대괄호 연산자 [] MyString 연결 목록 클래스 오버로드 C++
- 16. Object C의 클래스 mehod에서 클래스 자체 참조
- 17. 객관적인 c의 싱글 톤 클래스
- 18. Objective-C의 서브 클래스 NSArray
- 19. Objective-C의 클래스 디자인을 추천합니다
- 20. Object C의 클래스 자동 배선
- 21. 일반 클래스 C의 객체에 데이터로드 #
- 22. 목표 C의 하위 클래스 초기화
- 23. 메모리 할당과 C의 상속 클래스 ++
- 24. Objective-C의 델리게이트 클래스 연결하기
- 25. C의 정적 저장소 클래스 이해
- 26. C에 연결 연산자가 있습니까?
- 27. 클래스 개체 비교 연산자가 작동하지 않습니다 파이썬
- 28. 클래스/구조체에 특정 연산자가 있는지 확인하십시오.
- 29. instanceof 연산자가 형제 클래스 instance-ofs를 고려합니까?
- 30. 연산자가 네임 스페이스의 클래스 외부에서 오버로드되었습니다
[로컬 또는 임시 변수의 주소를 반환]의 중복 가능성 (http://stackoverflow.com/questions/2744264/returning-the-address-of-local- 임시 변수 또는 임시 변수) – dyp