기본 생성자를 사용할 수 없게 만드는 것이 좋습니까?


14

기본 생성자에 대해 구체적으로 묻습니다.

생성자가 객체의 모든 데이터를 초기화한다고 가정하면, 적절한 초기화없이 사용할 수없는 클래스를 만들면 기본 생성자가 쓸모없는 경우가 아닌가? 치다:

// A class for handling lines in a CSV file
class CSV_Entry {
private:
    unsigned num_entries;
    std::string string_version;
    std::vector<std::string> vector_version;
    ...etc
public:
    CSV_Entry();
    CSV_Entry(const std::string& src_line);

    // returns a vector copy of the original entry
    std::vector<std::string> get_vector_snapshot();
}

int main( void ) {
    ...etc

    CSV_Entry example = CSV_Entry();
    std::vector<std::string> current_entry = example.get_vector_snapshot();

    ...etc
}

그 변수 current_entry는 본질적으로 쓸모 없다? 누군가 나중에 처리하려고하면 오류가 발생할 수 있습니다. 그런 다음 그러한 오류를 처리하는 코드를 작성합니다 ...

불필요한 추가 코드를 완화하려면 기본 생성자를 사용할 수 없게 만드는 이유는 무엇입니까? 이렇게

...etc

CSV_Entry() {
    throw Verbose_Exception( "CSV_Entry: do not use the default constructor" );
}

...etc

추신 : 기본 생성자를 사용할 수 없게 만드는 것이 좋으면 다른 구현 세부 정보가 공개되지 않기 때문에 헤더에 던져 넣는 것이 좋습니까?

답변:


34

예, 인수없이 객체를 초기화하는 합리적인 방법이 없다면 기본 생성자를 사용할 수 없게 만드는 것이 좋습니다 (실제로 좋습니다 ). 그러나 예외를 던져서 "비활성화"하지 마십시오. 대신 비공개로 설정하십시오. 이상적으로 인터페이스에는 사람들이 호출하지 않아야하는 메소드 나 생성자가 포함되지 않습니다.


1
따라서 비공개로 설정하면 기본 생성자를 사용하려고 시도하는 사용자가 컴파일 타임에 오류가 발생합니까?
user2738698

맞습니다.
Doval

8
C ++ 11을 사용할 수 있으면 명시 적으로 삭제 된 것으로 표시하십시오 CSV_Entry() = delete;..
bstamour

13
실제로, 이것보다 쉽지 않습니까? 기본이 아닌 생성자가 정의되어 있으면 컴파일러는 기본 생성자를 암시 적으로 만들지 않습니다. 이 클래스에는 기본이 아닌 생성자가 정의되어 있습니다 ( explicitBTW 권장 ). 따라서 정의하지 않으면 존재하지 않습니다.
Fred Larson

7
@FredLarson 명시 적으로 삭제하는 것은 삭제 의도를 나타내므로 아무도 실수라고 생각하지 않습니다.
Darkhogg
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.