「ファクトリのような」クラスがあります。
class SpecialReader {
private:
HANDLE specialFile;
SpecialReader(HANDLE specialFile);
public:
static SpecialReader Create(TCHAR* fileName);
~SpecialReader();
}
//where
SpecialReader::Create(TCHAR* fileName) {
// ...
// ...
return SpecialReader(inputFile);
}
次のようにプログラム本体でオブジェクトを定義したいと思います。
SpecialReader myReader;
だがしかし:
SpecialReader myReader = SpecialReader::Create(anyFile);
最初のケースのようにオブジェクトを定義しようとすると、コンパイラエラーが発生します。
error C2512: 'SpecialReader' : no appropriate default constructor available.
このクラスを正しく定義する方法は?
スマートポインタを使用してこれを行うことができます。最も簡単な選択はstd::unique_ptr<SpecialReader>
、インスタンスの所有権を使用して呼び出し元に転送することです。
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));
}
作成を遅らせるには、次のように記述します。構文はOPとは少し異なりますが、効果的に同じことを実現します。
std::unique_ptr<SpecialReader> myReader;
// ....
myReader = SpecialReader::Create(filename);
Create()
ファクトリ関数内で失敗を処理したいというコメントについては、空を返しstd::unique_ptr<SpecialReader>
、クライアントにチェックさせることができます。
std::unique_ptr<SpecialReader> SpecialReader::Create(TCHAR* fileName) {
try {
// ...
return std::unique_ptr<SpecialReader>(new SpecialReader(inputFile));
}
catch(...) {
// ignore any exceptions
}
return std::unique_ptr<SpecialReader>();
}
std::unique_ptr<SpecialReader> myReader;
myReader = SpecialReader::Create(filename);
if(!myReader.get()) {
// Error handling, Create() couldn't create an instance of SpecialReader
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加