Define factory class in C++ -
i have "like factory" class:
class specialreader { private: handle specialfile; specialreader(handle specialfile); public: static specialreader create(tchar* filename); ~specialreader(); } //where specialreader::create(tchar* filename) { // ... // ... return specialreader(inputfile); }
i want define object in program body this:
specialreader myreader;
but not:
specialreader myreader = specialreader::create(anyfile);
if try define object in first case i've got compiler error:
error c2512: 'specialreader' : no appropriate default constructor available.
how define class right?
you can use smart pointer so, simplest choice using std::unique_ptr<specialreader>
, transfer ownership of instance caller:
class specialreader { private: handle specialfile; specialreader(handle specialfile); public: static std::unique_ptr<specialreader> create(tchar* filename); // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ~specialreader(); } std::unique_ptr<specialreader> specialreader::create(tchar* filename) { // ... return std::unique_ptr<specialreader>(new specialreader(inputfile)); }
to delayed creation can write follows. syntax different op, achieves same:
std::unique_ptr<specialreader> myreader; // .... myreader = specialreader::create(filename);
as comments, want handle failure within create()
factory function, can return empty std::unique_ptr<specialreader>
, , let client check it:
std::unique_ptr<specialreader> specialreader::create(tchar* filename) { try { // ... return std::unique_ptr<specialreader>(new specialreader(inputfile)); } catch(...) { // ignore exceptions } return std::unique_ptr<specialreader>(); }
std::unique_ptr<specialreader> myreader; myreader = specialreader::create(filename); if(!myreader.get()) { // error handling, create() couldn't create instance of specialreader }
Comments
Post a Comment