2017-09-23 15 views
0

メンバ関数の委任のようなものをたくさん検索しましたが、何も見つかりませんでした。メンバ関数の委任

class Foo1 { 
     int bar(int a, int b = 1, bool c = false); 
     int bar(int a, bool c); 
    } 

    // Can I write it like: 
    class Foo2 { 
     int bar(int a, int b = 1, bool c = false); 
     // This line is my question: 
     int bar(int a, bool c) : bar(a, 1, c); 
    } 

私のコンパイラは、唯一のコンストラクタは、初期化リストを取ると言ったが、私はどこかに上記のようなものを読んで思う:たぶん私は

は、私は次のような何かをしようと...間違った言葉を探しました。ルールからコンストラクタだけがinitリストを取るという例外はありますか?

答えて

0

init-listは、クラスオブジェクトの基底とメンバを初期化するためのもので、クラスコンストラクタにのみ意味があります。関数は初期化するものがありません(各呼び出しで渡された引数から自動的に初期化される関数のパラメーターを除く)。

しかし、ある関数を別の関数に遅らせるのは簡単です。最初の関数の本体で他の関数を呼び出すだけです。

class Foo2 { 
    int bar(int a, int b = 1, bool c = false); 
    int bar(int a, bool c) { return bar(a, 1, c); } 
}; 
+0

10以上の機能を「デリゲート」する必要があるとパフォーマンスが低下する可能性があると私は考えました。私は関数本体の中に入って実際の関数を呼び出すのではなく、実際のbar関数を呼び出すべきだとコンパイラに伝えればもっと速くなると思っていました。私は間違っていると思った? –

+0

@HenrikViebrockコンパイラが最適化を有効にすると、コンパイラはしばしば小さな関数をインライン化し、関数呼び出しのオーバーヘッドを排除します。また、コンストラクタのmem-initializersは実際には関数呼び出しであることがよくあります。 – aschepler

+0

それを知らなかった。ありがとう! –

0

エラーメッセージはかなり明確です。メンバ関数では、そのような委任を行うことはできません。二つのパラメータ付きのバーの呼び出しがパフォーマンスの欠点を持つべきではない

class Foo1 { 
    int bar(int a, int b = 1, bool c = false); 
    int bar(int a, bool c); 
} 

// Can I write it like: 
class Foo2 { 
    int bar(int a, int b = 1, bool c = false); 

    // Should be inlined by default, but won't hurt to specify it explicitly 
    inline int bar(int a, bool c) { 
     return bar(a, 1, c); 
    } 
} 

:あなたは何ができるか

は次のように単純に、引数を渡し、一部のメンバーfuncion内の他のメンバ関数を呼び出すです。

+0

インライン関数の中に* return *を記述する必要はありませんか? –

+0

@HenrikViebrockそうです、私の間違いです。 – Outshined