2016-11-29 1 views
3

メンバー関数の後ろにある関数を呼び出して戻り値を変更し、どのように書きますか?私は正常に言い換えるメンバー関数の後に続くメンバー関数とは何を呼びますか?どのように記述しますか?

を書くのですか:

std::cout << box.getVolume().inCubicFeet(); 

std::cout << box.getVolume().inCubicCentimeters(); 
+1

[連鎖](http://jamie-wong.com/2012/02/01/stop-returning-void/)。 – StoryTeller

+0

これに非常に類似しているのは、メソッドがメソッド連鎖を可能にする 'this'を返すところの[流暢なインターフェース](https://en.wikipedia.org/wiki/Fluent_interface)の概念です。しかし、あなたが別のクラスを返すことを考えれば、まったく同じではありません。 –

答えて

4

:コードは次のように書くことができます前記オブジェクトに対してそれを呼び出す。例えば :これは、方法/メンバ関数と呼ばれる

class Volume{ 
    ... 
    int inCubicFeet() const { 
     //convert it and return it 
    } 
    int inCubicCentimeters() const { 
     //convert it and return it 
    } 
}; 


class Box{ 
    Volume v; //volume object that is initialized somewhere 
       //(either in the constructor of Box or in a method like setVolume) 
    ... 
    Volume const& getVolume() const { 
     return v; 
    } 
}; 
+1

'Volume&getVolume(){..'または 'const Volume&getVolume(){..'? – user463035818

+0

実際、私はしませんでした。それは必要ではないが、あなたの編集前にボリュームインスタンス –

+0

が占有する目的とサイズによっては役に立つかもしれないので、テキストは "...あなたは参照を返す必要がある"と言った。これはコードと一致しなかった。しかし、今私はもう苦情はありません;) – user463035818

0

box.getVolume()ニーズがstd::ostream<<演算子をオーバーロードしているの値を返す関数inCubicFeet()が定義されているclassオブジェクトを返すために、 (ただし、独自のオーバーロードを定義することはできます)。その2番目の部分については、doubleで十分です。

+0

おそらく、「メソッド連鎖」または「関数連鎖」という言葉に言及しておきましょう。パターン連鎖と呼ばれるものです。 – Gerard

+0

@ジェラード:それはC#のキッシュを食べるセットはそれを呼び出すものではありませんか? – Bathsheba

+2

それは言語のパターンに依存しません。これはC++なので、わかりにくい4文字の頭字語を思いつくことができます。おそらく「FNCN」または「MFMC」。 – Gerard

0

「戻り型のメンバ関数」と呼ばれます。これらのメソッドには特別なものは何もありません。それはあなたがすることができます以下のどんな方法ように、タイプVolume(またはタイプVolume &の対象にさえ参照)のオブジェクトを返すようにgetVolume()ニーズを動作させるために

const Volume& v = box.getVolume(); // my guess on what the return type is 
std::cout << v.inCubicFeet(); 
+1

'const Volume&v'が良いと思われます。あるいは 'auto && v'。 – Jarod42

+0

@ Jarod42 'auto &&'は、スニペットの全体を敗北させました。別のタイプが含まれていることを示すことを意味していました。しかし、 'const&'のために同意しました – user463035818

関連する問題