warning 자꾸납니다.
글쓴이: nayana / 작성시간: 월, 2004/04/19 - 4:04오후
소스는 다음과 같습니다.
#include <iostream> using namespace std; class Point { public : Point(); Point( int ax, int ay ); void SetPoint( int ax, int ay ); friend ostream& operator << ( ostream& co, Point pt ); friend Point& operator+( const Point& pt1, const Point& pt2 ); friend Point& operator-( const Point& pt1, const Point& pt2 ); private : int x, y; }; Point::Point() { x = y = 0; } Point::Point( int ax, int ay ) { SetPoint( ax, ay ); } void Point::SetPoint( int ax, int ay ) { x = ax; y = ay; } ostream& operator << ( ostream& co, Point pt ) { co << "(" << pt.x << "," << pt.y << ")"; return co; } Point& operator+( const Point& pt1, const Point& pt2 ) { Point ptSum( pt1.x + pt2.x, pt1.y + pt2.y ); return ptSum; } Point& operator-( const Point& pt1, const Point& pt2 ) { Point ptSub( pt1.x - pt2.x, pt1.y - pt2.y ); return ptSub; } int main( void ) { Point pt1( 100, 100 ), pt2( 100, 200 ); Point pt3, pt4; pt3 = pt1 + pt2; pt4 = pt1 - pt2; cout << pt1 << "+" << pt2 << "=" << pt3 << endl; cout << pt1 << "-" << pt2 << "=" << pt4 << endl; return 0; }
다음과 같은 warning 납니다.
upoperator.cpp: In function `Point& operator+(const Point&, const Point&)': upoperator.cpp:47: warning: reference to local variable `ptSum' returned upoperator.cpp: In function `Point& operator-(const Point&, const Point&)': upoperator.cpp:53: warning: reference to local variable `ptSub' returned
Forums:
큰 실수 입니다.
컴파일러가 똑똑한 경우죠.
저렇게 하면 플그램이 잘 동작하지 않죠
{
안의 지역변수를
}
&넘겨서 밖에서 참조를 해서 워닝을 띄운 것입니다.
곧 {}이 끝나고 지역에서 썼던 스택이 모두 풀리고
거기에 다시 밖에서 전역 변수들을 스택에 올리게 되면
&참조하던것이 엉뚱한 값을 가르키겠죠?
한번 The C++ Programming Langauge나
Effective C++시리즈를 보셔요
레퍼런스가 필요한 시점이 아닌가 생각이 되네요
C++, 그리고 C++....
죽어도 C++
혹시나 제 답변이 엉성해서요 ^^
노파심에 정확한 설명을 덧 붙이자면
위에서 ptSum은 {}내에서만 유효한 지역변수 인데
이를 return하니 문제가 되는 것이죠
좋지 않습니다.
&를 이용하려면
return this;
이런식으로 식을 쓰셔야 합니다.
C++, 그리고 C++....
죽어도 C++
static 키워드를 사용하셔도..
다음처럼 static 키워드를 사용해도 돼요.
Point& operator+( const Point& pt1, const Point& pt2 )
{
static Point ptSum( pt1.x + pt2.x, pt1.y + pt2.y );
return ptSum;
}
Point& operator-( const Point& pt1, const Point& pt2 )
{
static Point ptSub( pt1.x - pt2.x, pt1.y - pt2.y );
return ptSub;
}
명쾌한 답변 감사합니다.^^
명쾌한 답변 감사합니다.^^
operator+ 나 operator- 의 return 값이 레퍼런스라는
operator+ 나 operator- 의 return 값이 레퍼런스라는 것이 통념상 잘못된것 같습니다. 저렇게 static으로 되어 있으면, 한 줄에 두개의 Point 끼리의 + 연산이 일어나면 원치 않는 결과를 줄 수 있습니다.
---
http://coolengineer.com
댓글 달기