데이터를 계산하는 데 필요한 모든 매개 변수를 사용하는 생성자와 함께 큰 데이터 테이블을 보유하는 클래스가 있습니다. 그러나 실행하는 데 시간이 오래 걸리므로 스트림을 가져 와서 해당 스트림에서 데이터를 읽는 생성자를 추가했습니다. 나는 두 개의 생성자가 있기 때문에이 클래스를 디자인하는 RAII 방식을 고안하는 데 어려움을 겪고있다. 그리고 런타임에 나는 그들 사이에서 선택해야한다. 이것은 제가 생각해 낸 것입니다 :두 생성자 중 하나를 선택하는 RAII 방법
std::string filename; // Populated by command line arguments
DataTable table; // Empty constructor, no resource acquisition or initialization
if(filename.empty()) {
table = DataTable(/*various parameters*/);
} else {
std::ifstream filestream(filename);
table = DataTable(filestream); // Reads from file
}
저에게는 꽤 상처가 있습니다. 기본 생성자는 객체를 유효한 상태로 유지하지만 쓸모없는 상태로 둡니다. 그것을 사용하는 유일한 방법은 if 문의 분기 중 하나에 할당 할 외부 범위에 "임시"객체를 만드는 것입니다. 또한, 오브젝트가 디폴트로 구축되었거나 완전히 초기화되었는지를 관리하기 위해 "inited"플래그가 있습니다. 이 수업을 설계하는 더 좋은 방법이 있습니까?
합니다. 그는 아마도 그렇게한다면 move 생성자를 추가하기를 원할 것입니다. 물론 C++ 11이있는 경우에만 작동합니다. (그리고 그는 임시'ifstream'을'std :: istream &'에 바인딩 할 수 없으며,'std :: ifstream (filename) .seekg (0, std :: ios_base : : beg)'. 또는 C++ 11 인 경우 생성자에 대한 rvalue 참조를 다시 가져옵니다. –