2011-01-27 23 views
0

私のクラスで再帰的なconst関数を持つことができますか?可変関数を変更する限り、const関数をC++で再帰的に使用できますか?

+2

まず自分で試してみませんか?どのくらいの努力が必要ですか? – Nawaz

+1

@Nawaz:「それは私のために働く」と「よく定義された行動」は区別が非常に難しい – Flexo

+1

@awoodland:あなたはポイントがあります。しかしタイトルからは彼が試したこともないと思われます。そうでなければタイトルは* "これは私が....であればよく定義されているはずです"#* – Nawaz

答えて

6

はい。 constは常にconst関数を呼び出すことができます。あなたは、それが意味を成すために変数を変更する必要はありません。たとえば、参照によって再帰関数に渡し、あなたの状態のものを修正することができます。 (または静的変数、非メンバー、またはconst以外のものへのポインタまたは非const参照を返すその他の関数)

最小の「有用な」例(他の答えに対するflowntのコメントに触発されています)リンクされたリストを横断する。

:あなたが再書き込み sum()によって、あなたの問題に応じて、結果に対する基準を使用してもを回避することができます

#include <memory> 
#include <iostream> 

class Item { 
public: 
    Item(const int& in, Item *next=NULL) : value(in), next(next) {} 
    void sum(int& result) const { 
    result += value; 
    if (next.get()) 
     next->sum(result); 
    } 
private: 
    int value; 
    std::auto_ptr<Item> next; 
}; 

int main() { 
    Item i(5, new Item(10, new Item(20))); 
    int result = 0; 
    i.sum(result); 
    std::cout << result << std::endl; 
} 

(再帰がかかわらず、通常、リンクリストのトラバースを行うための素晴らしい方法ではありません)

int sum() const { 
    return value + (next.get() ? next->sum() : 0); 
    } 
5

確かに!例:

クラスでconst関数を呼び出すことはできますが、制限はありません。

+1

しかし、これはfooの状態を使用しないので、この関数は決して使用しませんが...使用のより良い例は、バイナリ検索ツリー内の検索です。これは非変形演算であり、再帰を使って最も簡単に実装されます。 – flownt

+0

@flownt:わかった、それは単にconstメソッドが再帰的であることを示すことを意図したものです:-) – Sean

関連する問題