2012-09-29 65 views
0

部分代碼: 請參閱下面的myClass類。它有一個構造函數和一個公共遞歸函數find。請參閱代碼:C++靜態對象類功能

#include <iostream> 
using namespace std; 

class myClass{ 
    public: 

    myClass() { 
     //do stuff 
    } 

    int find(int i) { 
     static int j = 10; 

     if (i > 15) 
      return i; 

     j = j + 1; 
     return i * find(j + 1); 
    } 
}; 

int main() 
{ 

    myClass mC1 ,mC2; 

    cout<< " 1.... return value = "<< mC1.find(10); 
    cout<< " \n 2... return value = "<< mC2.find(10); 

    return 1; 
} 

輸出:

1.... return value = 5241600 
2.... return value = 170 

以上progemn具有功能找到。 「找到」 函數具有variabe一個MyClass類。這是靜態的,因爲我想要一個遞歸函數。問題是靜態變量有一個綁定到類的程序&的生命。

但是我希望靜態爲對象 specfic而不是範圍。我希望這兩個函數調用都能返回相同的值。

簡而言之,如何使靜態varable一類功能,爲每對象,而不是對整個班級...

回答

1

你需要一個成員變量?

希望以下代碼有所幫助。

問候 薩姆

class myClass{ 
    public 
    myClass() { 
    m_j = 10; 
    } 

    private: 
    int m_j; // private member variable for find algorithm; 


    int find(int i) { 
    if(i>15) 
     return i; 
    m_j= m_j+1; 
    return i * find(m_j+1); 

    } 

};

1

如果你想要一個對象變量,你需要使它成爲相應對象的成員。沒有辦法在一個函數內部聲明一個特定於對象的變量。您使用static成員的方式無論如何都可以更改爲非靜態的,即您將獲得必要的上下文:使該函數成爲非靜態的,並根據需要將數據存儲在對象中。

這就是說,僅僅因爲函數是遞歸的並不意味着它需要任何種類的static上下文。通常,所有必要的上下文都作爲參數傳遞給遞歸函數,在這種情況下,系統將必要的狀態保留在堆棧上。由於堆棧的大小相對有限,因此要確保在深層調用堆棧的遞歸函數中不需要太多的上下文。

由於您可能不想要求用戶通過某些內部上下文,接口中的find()函數可能只是委託給提供必要上下文的遞歸函數。例如:

int find(int j, int i) { 
    if (15 < i) { 
     return i; 
    } 
    ++j; 
    return i * find(j, j + 1); 
} 
int find(int value) { 
    return find(10, value); 
} 

(我不知道如果我得到了想要的邏輯正確的,因爲我並沒有獲得什麼功能是爲了做......)。