1

重複の可能性:
静的メンバーを強制的に初期化する方法は?
作成時にクラスを自動的に登録する方法

ファクトリを使用してこのクラスを作成できるように、彼女の作成メソッドをファクトリに登録する必要があるクラスがあります。ただし、メイン メソッドでクラスをインスタンス化する場合にのみ、初期化が機能します。

ここで私が登録したいクラス:

class CDESolverD2Q5 : public CDESolver
{
public:

    static CDESolver* create()
    {
        return new CDESolverD2Q5;
    }
private:
    static const std::string name_;
    /**
     * @brief registered_ if true then class is registered w/ Solver Factory
     */
//only for accessing this element from the main method
public:
    static const bool registered_;
    /**
     * @brief registerLoader Registers the Solver with the factory.
     * @return A boolean that indicates if the registration was successful
     */
    static bool registerLoader();

};

cpp ファイルのコードは次のとおりです。

const std::string CDESolverD2Q5::name_ = "CDESolverD2Q5";


bool CDESolverD2Q5::registerLoader()
{
    return SolverFactory.registerType(CDESolverD2Q5::name_, CDESolverD2Q5::create);
}

const bool CDESolverD2Q5::registered_ = CDESolverD2Q5::registerLoader();

そして、ここに私の工場の registerType メソッドがあります:

bool registerType(const IdentifierType& id,
                      ProductCreatorSignature creator)
    {
        return productMap_.insert(typename ProductMap::value_type(id, creator)).second;
    }

ただし、静的メンバーは、メイン メソッドでアクセスした場合にのみ初期化されます。

int main(int argc, char* argv[]) {
    //how can I avoid the next line?
    bool blub = CDESolverD2Q5::registered_;

    CdeSolver* solver =SolverFactory.createObject("CDESolverD2Q5");
}

行を削除すると、 bool blub = CDESolverD2Q5::registered_;クラスは工場に登録されていません。しかし、メインメソッドが実行される前に静的メンバーが自動的に初期化されると思ったのに、なぜこの行が必要なのですか?どうすればこの行を回避できますか?

4

0 に答える 0