3


2

main()の前にインスタンス化されないようにクラスを保護する

main()に入る前に、C ++クラスがインスタンス化されないようにします。 これを達成する方法はありますか?

 — --

いくつかの説明:

私は組み込みアプリケーションを書いています。 私のクラスは静的でなければなりません(BSS内にあります)が、インスタンス化時にはmain()の開始時に特定のものが初期化される前に利用できないリソースが必要です。 だから、マイヤーズのシングルトンにしたい。 理想的には、MyClass

instance()がmain()の前に呼び出されないことを保証する何らかの種類のアサートを行いたいと思います。

6 Answer


7


いくつかのメソッドが呼び出される前にクラスの構築を制限することは、負け戦となります。 特にそのメソッドが `main()`の場合。 なぜこの要件があるのか​​尋ねてもいいですか? おそらくあなたが解決しようとしている実際の問題に取り組む別の方法があります。

編集: CTQに感謝します。これから判断すると、おそらく最も簡単な解決策は静的ブール値です。 埋め込まれているので、環境全体をほとんど制御できると仮定します。 静的boolに基づいた `

instance()`での単純なアサートは、おそらく必要なすべてです。

さらに一歩進んで、依存関係の注入またはリソースが正しい順序で初期化されることを保証する他の方法が必要なように思えますが、正直言って、私はC ++で取り組んできた問題ではありません組み込みシステム)。 その場合の最も効果的な手段についてこれ以上の洞察を与えることはできません。この質問に対する他の回答の1つを検討することをお勧めします。


2


クラスに最初のインスタンス化で設定される静的ブールを与え、main()の開始時にそれをチェックします

ファクトリーを使用するか、コンストラクターをプライベートにしても、main()の前にインスタンス化されるクラスのコンストラクターでインスタンス化されるのを停止しません


2


できることの1つは、クラスの静的フラグをオンにする `MyClass

enableConstruction()`のような静的メソッドを使用することです。 このフラグがfalseのときにc’torが呼び出されると、例外がスローされます。 これにより、誰かがルールに違反していることを実行時に示すことができます。

その静的フラグの初期化に注意する必要があることに注意してください。 構築順序の問題を回避するには、最初にアクセスしたときに初期化されるシングルトンにするのがおそらく最善です。


0


これを行うクリーンな方法はありません。 おそらく、この目的を達成するためにできるハックがありますが、すべきではありません

より完全なニーズを説明してください。より良い解決策が見つかるはずです。


0


main()の開始時に実行されるコードを制御できる場合、次のような関数を使用できます。

bool wasMain (bool inMain = false) {
  static bool passedMain = false;
  return passedMain |= inMain;
}

次に、メインの最初の行はwasMain(true)を使用し、それ以降はtrueを返しますが、その時点までfalseを返します。

編集:短いコードが大好きです。上記の実装は次のように簡略化できます。

bool wasMain (bool inMain = false) {
  static bool passedMain = false;
  if (inMain)
    passedMain = true;
  return passedMain;
}


-1


考えられる方法の1つは、main内でクラスをインスタンス化することです。 i.e.

MyClass * g_thing = 0;
int main()
{
    g_thing = new MyClass();
}

それ以外は、コンパイラ特有の厄介な混乱です。 何を達成しようとしていますか?