c++ 생성자에서 패러미터 유효성 체크에 관한 질문입니다.

hwayak의 이미지

c++ 생성자로 넘겨진 패러미터의 유효성을 체크해서, 유효하지 않으면 객체를 생성시키지 못하게 하고 싶을 땐 어떤 기법을 사용하나요?

예를 들어, 아래와 같은 코드가 있다고 할 때,

class A {
public:
    A(char *c);
}

생성자 A(char *c)를 구현할 때, c의 NULL체크를 해서 NULL이면 객체를 생성하지 못하게 하고 싶습니다.

생성자에서 예외를 발생시키는 것은 좋지 않다는 걸 어디서 들었던거 같아서 그렇게는 못하겠고요.
아니면 생성자 자체를 private 막은 다음, 객체를 생성해서 리턴해내는 함수를 만들면 될거 같기도 한데...

뭔가 이런 경우에 널리 알려진 좋은 방법이 있을 거 같아서, 이렇게 질문 드립니다.

klara의 이미지

적으신 방법은 일종의 factory 패턴으로 좋은 방법이라고 생각합니다.
그외에는 유효하게 생성된객체인지 아닌지를 알려주는멤버함수를 작성해서, 생성후 체크하게 할수도 있겠구요..
factory패턴이라고 해도, 동적할당으로 반환하기보다는, 마찬가지로 유효성체크 함수를 넣어서 돌려받은 객체에 대해 체크하도록 하는게 좋아보입니다.
객체의 생성자체를 막고 싶다면 애시당초 NULL이 될수 없는 인자(레퍼런스 혹은 다른 char*를 대체할 클래스)를 받도록 하는수밖에 없어보입니다.

semmal의 이미지

레퍼런스로 받으면 안되나요?
생각해보니 그래도 똑같군요;;
------------------------------
How many legs does a dog have?

------------------------------
How many legs does a dog have?

netionics의 이미지

생성자야 말로 예외를 던지는 가장 흔한 예입니다.
effective c++ 항목 8을 읽어보세요
널체크를 강요하고 싶은 경우에는 윗분 말씀처럼 레퍼런스로 받는게 정석입니다 :)

:)

kaeri17의 이미지

예외 던져도 되고요 레퍼런스로 받아도 되긴 하지만 이건 char*가 char형 *보다 char배열인 문자열을 받고 싶은 경우는 해당이 되지 않네요...

댓글 달기

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