warning 자꾸납니다.

nayana의 이미지

소스는 다음과 같습니다.

#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
ixevexi의 이미지

컴파일러가 똑똑한 경우죠.

저렇게 하면 플그램이 잘 동작하지 않죠

{
안의 지역변수를
}

&넘겨서 밖에서 참조를 해서 워닝을 띄운 것입니다.
곧 {}이 끝나고 지역에서 썼던 스택이 모두 풀리고
거기에 다시 밖에서 전역 변수들을 스택에 올리게 되면
&참조하던것이 엉뚱한 값을 가르키겠죠?

한번 The C++ Programming Langauge나
Effective C++시리즈를 보셔요
레퍼런스가 필요한 시점이 아닌가 생각이 되네요

C++, 그리고 C++....
죽어도 C++

ixevexi의 이미지

노파심에 정확한 설명을 덧 붙이자면

Point& operator+( const Point& pt1, const Point& pt2 ) 
{ 
   Point ptSum( pt1.x + pt2.x, pt1.y + pt2.y ); 
   return ptSum; 
} 

위에서 ptSum은 {}내에서만 유효한 지역변수 인데
이를 return하니 문제가 되는 것이죠
좋지 않습니다.


&를 이용하려면
return this;

이런식으로 식을 쓰셔야 합니다.

C++, 그리고 C++....
죽어도 C++

seoleda의 이미지

다음처럼 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;
}

nayana의 이미지

명쾌한 답변 감사합니다.^^

pynoos의 이미지

operator+ 나 operator- 의 return 값이 레퍼런스라는 것이 통념상 잘못된것 같습니다. 저렇게 static으로 되어 있으면, 한 줄에 두개의 Point 끼리의 + 연산이 일어나면 원치 않는 결과를 줄 수 있습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.