C++ 생성자 안에서 멤버변수 값을 설정할 때 유효성 검사에 관하여 질문 드립니다.
글쓴이: yserzero / 작성시간: 수, 2009/09/16 - 2:38오후
다음과 같은 코드가 있습니다.
#include <iostream> using std::cout; using std::endl; class A { private: int a; int b; public: A(int a, int b) { if (a < 0) { std::cout<<"a값 입력 오류"<<std::endl; return; } this->a = a; this->b = b; } int getA() { return a; } int getB() { return b; } }; int main() { A a(-1, 0); std::cout<<a.getA()<<std::endl; std::cout<<a.getB()<<std::endl; return 0; }
클래스 A 객체 생성하여 생성자에 멤버변수 값을 설정해 주는데,
위와 같이 생성자 안에서 유효성 검사하고 return을 하는게 올바른 것인가요?
일단 컴파일도 잘 되고 제가 원하는 결과를 보여주긴 합니다만,
전문가의 눈으로 봤을 때 어떤 문제라던가 개선점이 있는지가 궁금합니다.
많은 답변 부탁드립니다.
Forums:
...
별 문제는 없는 듯.
본론과 관계
본론과 관계 없습니다만
using std::cout; 이라는 구문은
std::cout << ...; 을
cout << ...; 로 줄여 쓰기 위한 구문입니다.
따라서 using 식별자를 쓰셨으면
본문 중에 굳이 std::cout 이라고 지정해 줄 필요가 없습니다.
지금처럼 cout 이나 endl 이 많이 쓰이는 경우
std:: 부분을 떼어주는 게 가독성이 훨씬 좋아질 겁니다.
문제는...
이러한 방법의 문제는
생성자를 호출한 ... 그러니까, 초기값을 부여하여, new 연산자 등을 호출한... 측에서
이놈이 정상적으로 호출되었는지, (초기화 되었는지) 아닌지를
알 수 있는 방법이 모호하다는 것입니다.
안좋은 방법이죠.
예외를 던지거나 하는 방법 등을 찾는게 좋을 듯 합니다.
몇가지 방법
생성자의 파라미터 입력이 여기서는 상수로 되어 있는데, 불특정의 변수도 올수 있겠져...
예외를 검출하는 방법을 쓰는게 좋을듯..
콘솔에서만 사용하는 목적이라면 위의 코드가 별탈은 없겠지만...그렇지 않다면 예외검출 함수를 별도로 만드는게 좋겠죠..
어차피 생성자이니깐 멤버의 초기값은 쓰레기이든 입력값이 그대로 넣는 무관할 꺼구요...
생성자의 경우 성공 실패를 리턴하는 방법이 파라미터를 이용하거나...try~catch
저의 경우엔 try~catch 의 예외처리 방법은 별로 좋아하지 않기에 ... 아래 방법처럼 하고...
또 다른 방법으로는 생성자를 다음과 같이 작성하는거..
또는
이런게 있을수 있는데....
try~catch사용이 많으면 개발자가 코드의 흐름을 이해 못할 경우도 있고...try~catch는 개발할때 철처하게 따져서 작성해야되기 땜에
실수하면 코드 복잡해지면 버그 잡기 힘듭니다...ㅋㅋ..
답변 감사합니다.
답변 주신 분들 감사드립니다.
많은 공부가 되었습니다.
댓글 달기