2017-01-20 3 views
0

私は、いくつかのレガシーコードの多くで次のパターンを見ています。私はそれに精通していないので、それがなぜそこにあるのかわからない。ヘッダファイルで奇妙な構成パターン

struct ook 
{ 
    bool func_called; // Not declared as const! 
    bool func(); 
    ook(); 
}; 

ソースファイルで:

ook::ook(): 
    func_called(func()) 
    {} // ← Nothing there whatsoever. 

bool ook::func() 
{ 
    // … ← Some stuff without a "return" statement of any kind. 
    return true; // This does mean that func_called is always true. 
} 

が、これは何か役に立つか、単に奇数判定からいくつかの恐ろしいコピー&ペーストのエラーですか?

今や、func_calledはコンストラクタでのみ呼び出され、コードでは決して呼び出されません。もしそれがあったとしたら、Florian Castellaneで指摘されているように、his answerであれば意味があります。それが一度だけ起こったなら、私はこれが使用されていたと想像することができます。しかし、それはコードベースで数十回起こるので、他のどのような用途があるのだろうかと思います。

これは私のコードではありません。私は、ロジックが何を書いているのかを(歴史、コメント、単体テストなしで)理解しようとしているだけです。多分それは絶望的でしょうか?

+0

名前があるかどうかはわかりませんが、コンストラクタは空でなければならないというコンセプトに従います。したがって、 'func_called'をコンストラクタ本体に入れるべきかどうかを決定するコードを入れ、その値をデフォルトの構築された変数に代入するのではなく、それを関数に入れて、メンバを直接構築するメンバ初期化子で関数を呼び出します。私は関数が静的である必要があると思います。 – NathanOliver

+3

@Nathan静的である必要はありません。 –

+0

@ PeterA.Schneiderしたがって、クラスが完全に構築される前に非静的関数を呼び出すのは合法ですか? – NathanOliver

答えて

4

true == func_calledのコードテストの残りの部分を想定すると、構造体がコンストラクタを使って確実に初期化されるようにするために使用できます。

+0

コードには問題はありません。何も起こらなくなりました - 不注意によって履歴が消去されました☹ – Sardathrion

+0

はこのfunc_calledブール値がまったく使われていませんか? –

+0

いいえ、そうではありません。それは古いコードとして説明しますが、それは数十回起こります – Sardathrion

1

何を言っていることは事実であると誰もook::func_calledを使用しない場合、あなたのコードは、以下の、シンプルなコードと同等の場合:

struct ook 
{ 
    ook() { func(); } 

    void func() { /* Some stuff */ } 
}; 

として動作しますが、どうかコピーの構築とコピー割り当てに大きな注意を払う必要があります意図されました。

+0

'grep'はそれが本当だと思われます... – Sardathrion

+0

@Sardathrion:あなたのgrepはマクロと行継続を見ますか? clang-queryを使うほうが良いでしょう。 –

+0

RedHatで利用可能だった場合、clang-queryを使いたいです。そうではない。 'grep'に関しては、私はそれがすべてをキャッチすることを確信しています。 – Sardathrion