클래스의 객체를 리턴하는 함수

GameofThrones의 이미지

클래스 객체를 리턴할 때 궁금한 점이 있습니다.

클래스의 객체를 리턴하는 함수에서
리턴할 객체가 없을때 리턴값을 어떻게 해야하나요?
포인터의 경우 NULL을 리턴하면 되는데
객체의 경우는 모르겠네요.

예를 들면 A라는 클래스의 vector 컨테이너를 멤버로 가진 클래스에서
컨테이너에서 하나의 A 객체를 찾아서 리턴할 때
찾지 못하는 경우 리턴값을 어떻게 하면 되나요?

swish95의 이미지

Null 이죠

------------------------------------------------------------
ProgrammingHolic

GameofThrones의 이미지

하지만 Null은 정의되지 않은 문자입니다, 언어가 C++입니다.

swish95의 이미지

NULL 쓰심 되죠

답글이 짧아서 오해 하실까봐 덧붙입니다.

어차피 Null, NULL, NUL 조금씩 다르지만 의미하는 바는 초기화로 보시면 될겁니다.

그게 클래스든 기본 자료형이든지요

일단 변수 생성시 초기화 해놓고 반환할 값이 없으면 해당 변수를 안바꾸는 방식을 쓰셔도 되구요

------------------------------------------------------------
ProgrammingHolic

GameofThrones의 이미지

int 에서 사용자 정의 클래스로의 형변환 에러가 납니다.

jick의 이미지

어떻게 할지 미리 정해놔야죠. "int를 리턴하는 함수에서 돌려줄 int가 없으면 어떻게 하나요?"와 동일한 질문입니다.

특정한 "에러값 객체"를 정해놔서 "돌려줄 객체가 없음"의 의미로 그런 객체를 리턴할 수도 있고요. (보통 정수형을 돌려주는 함수에서 에러 상황이면 -1을 돌려주는 경우가 많죠. 비슷한 식입니다.)

아니면 C++14(?) 이후라면 T를 돌려주는 대신 std::experimental::optional<T>를 쓰면 진짜로 "T가 없는 상태"를 표현할 수도 있습니다.

(C++17 이후에는 그냥 std::optional이라고 쓰면 된다는 것 같군요.)

GameofThrones의 이미지

뭔가 NULL 보다 좀 복잡한 느낌이네요.
다른 방법이 있을까요?

#include <list>
 
class AAA
{
	int aaa1;
	int aaa2;
public:
	AAA(int a1, int a2) : aaa1(a1), aaa2(a2) {}
        bool IsValid(){return aaa1 != -1 && aaa2 = -1};
};
 
class BBB
{
	std::list<AAA> adata;
public:
	BBB() {}
	~BBB() {}
 
	AAA& GetAAA()
	{
		//if (adata.empty()) throw std::invalid_argument("empty");
                //if (adata.empty()) return NULL;
 
                if(adata.empty()) return AAA(-1, -1);
 
		return *adata.begin();
	}
};
jick의 이미지

정확히 어떤 상황인지는 모르겠는데, 위의 소스와 같은 container 객체라면 굳이 값이 없는 객체를 만드는 수고를 할 필요도 없이 그냥 API 상 "이 함수는 돌려줄 값이 있을 때만 부를 수 있습니다. 그렇지 않은 경우 부르면 undefined behavior가 발생하니 알아서 하쇼." 해버려도 됩니다.

list, vector, 기타 등등 거의 모든 STL 컨테이너들이 그런 식으로 동작하고 있죠.

익명 사용자의 이미지

C++17을 사용하는 미래(?)지향적인 환경이라면 std::optional이 좋은 선택입니다. "값의 부재"를 나타내는 표준적인 방법이죠.

https://en.cppreference.com/w/cpp/utility/optional

한국어로 친절하게 설명해주신 분들도 있습니다:

http://occamsrazr.net/tt/317
http://ohyecloudy.com/pnotes/archives/cpp-boost-optional/

C++17을 사용할 수 없는 여건이라면, 흠.

https://www.boost.org/doc/libs/1_61_0/libs/optional/doc/html/index.html

GameofThrones의 이미지

c++17이나 boost는 환경이 안되고, boost는 따로 공부 좀 해보려고 하는데, 잘 안되네요.

ㅇㅇ의 이미지

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.