C ++でファクトリクラスを定義する

ハリ・セルドン

「ファクトリのような」クラスがあります。

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]

編集
0

コメントを追加

0

関連記事

分類Dev

C ++:複数のファイルでクラスを定義する

分類Dev

静的ライブラリの.hファイルをエクスポートするObj-c-クラス定義を公開したくない

分類Dev

2つのcppファイルでC ++クラスを定義しますか?

分類Dev

C ++ソースファイルでリンクオプションを定義する

分類Dev

C#でVisualStudioプロジェクトファイルの相対パスを定義する

分類Dev

C#でオブジェクトのリストを定義する

分類Dev

C ++のコンストラクターでexternconstを定義する方法

分類Dev

C#<T>で基本クラスを定義する

分類Dev

C ++でクラス定数を定義する場所と方法は?

分類Dev

C ++で派生クラスを定義する方法は?

分類Dev

C ++で新しいコンストラクタ(* this)ファクトリを返す

分類Dev

C#では、依存関係(クラスライブラリや個別のファイルなど)を使用してプロジェクトを設定する際のベストプラクティスは何ですか

分類Dev

C++ で固有ライブラリを使用してグローバル ベクトルを定義する

分類Dev

別々のファイルで宣言および定義された2つのクラスにC ++で同じ名前空間を使用する

分類Dev

TypeScriptプロジェクトで既存のC#クラス定義を再利用する方法

分類Dev

列挙型のリストをDTOクラスC#として定義する

分類Dev

ライブラリ内のC ++ 11で「extern」を使用してクラステンプレートの宣言から定義を分離する方法(dllなど)

分類Dev

空のコンストラクタc ++を定義する必要があるのはなぜですか

分類Dev

C#でMicrosoft Fakesを使用して、インターフェイスでジェネリックメソッド定義をスタブアウトする方法

分類Dev

クラスファクトリメソッドを継承するサブクラスの問題(Objective-C)

分類Dev

C ++でクラススコープの定数を定義する最良の方法

分類Dev

cプログラムで複数のテキストファイルをリダイレクトする方法

分類Dev

Cでデータコントラクトを定義する場所

分類Dev

C ++で同じクラスに異なる型を定義する方法

分類Dev

異なる方法C#でオブジェクトのリストを定義しますか?

分類Dev

C#でオブジェクトのリストを定義するのが難しい

分類Dev

C#でジェネリック型のインターフェイスを実装するクラスのファクトリ?

分類Dev

名前空間の外部でC#クラスを定義する

分類Dev

すでに定義されているクラスC ++

Related 関連記事

  1. 1

    C ++:複数のファイルでクラスを定義する

  2. 2

    静的ライブラリの.hファイルをエクスポートするObj-c-クラス定義を公開したくない

  3. 3

    2つのcppファイルでC ++クラスを定義しますか?

  4. 4

    C ++ソースファイルでリンクオプションを定義する

  5. 5

    C#でVisualStudioプロジェクトファイルの相対パスを定義する

  6. 6

    C#でオブジェクトのリストを定義する

  7. 7

    C ++のコンストラクターでexternconstを定義する方法

  8. 8

    C#<T>で基本クラスを定義する

  9. 9

    C ++でクラス定数を定義する場所と方法は?

  10. 10

    C ++で派生クラスを定義する方法は?

  11. 11

    C ++で新しいコンストラクタ(* this)ファクトリを返す

  12. 12

    C#では、依存関係(クラスライブラリや個別のファイルなど)を使用してプロジェクトを設定する際のベストプラクティスは何ですか

  13. 13

    C++ で固有ライブラリを使用してグローバル ベクトルを定義する

  14. 14

    別々のファイルで宣言および定義された2つのクラスにC ++で同じ名前空間を使用する

  15. 15

    TypeScriptプロジェクトで既存のC#クラス定義を再利用する方法

  16. 16

    列挙型のリストをDTOクラスC#として定義する

  17. 17

    ライブラリ内のC ++ 11で「extern」を使用してクラステンプレートの宣言から定義を分離する方法(dllなど)

  18. 18

    空のコンストラクタc ++を定義する必要があるのはなぜですか

  19. 19

    C#でMicrosoft Fakesを使用して、インターフェイスでジェネリックメソッド定義をスタブアウトする方法

  20. 20

    クラスファクトリメソッドを継承するサブクラスの問題(Objective-C)

  21. 21

    C ++でクラススコープの定数を定義する最良の方法

  22. 22

    cプログラムで複数のテキストファイルをリダイレクトする方法

  23. 23

    Cでデータコントラクトを定義する場所

  24. 24

    C ++で同じクラスに異なる型を定義する方法

  25. 25

    異なる方法C#でオブジェクトのリストを定義しますか?

  26. 26

    C#でオブジェクトのリストを定義するのが難しい

  27. 27

    C#でジェネリック型のインターフェイスを実装するクラスのファクトリ?

  28. 28

    名前空間の外部でC#クラスを定義する

  29. 29

    すでに定義されているクラスC ++

ホットタグ

アーカイブ