2010-11-17 47 views
0
//ClassA.h 
Class ClassA 
{ 
    private: 

    UtilityClass utilityCls; // this is the instance that I need to access 

    virtual void Read(); 
    static bool IsValid(char c); 

} 

//ClassA.cpp 
void ClassA::Read() 
{ 
    .... 
    string str = "abcdefg"; // sample only 
    if(find_if(str.begin(), str.end(), IsValid) == str.end()) 
    { 
     .... 
    } 
} 

inline bool IsValid(char c) 
{ 
    // There are compile errors When I call functions of Utility class here 
    // Ex: utilityCls.ProcessData(); 

    return (isalpha(c)); // sample only 
} 

我真的需要訪問「IsValid」函數內的「utilityCls」。有沒有簡單的方法來做到這一點?或者還有其他方法或解決方法嗎?對不起,如果這是一個愚蠢的問題。請幫助我們......如何訪問靜態函數內的其他類實例變量

+0

請發佈*真實*代碼。這甚至不會編譯 – 2010-11-17 22:44:36

回答

1

你有一個靜態函數。你將如何訪問成員變量?要麼使變量靜態或功能非靜態。

0

如果不先創建類的實例,則無法訪問實例變量。使IsValid非靜態或向您的靜態方法添加代碼,如

Class a; a.utilityCls.ProcessData();

1

靜態成員函數與有關,而不是與該類的任何實例有關。這幾乎就像是一個全局函數,被聲明爲該類的一個朋友(用一種奇怪的名字,包括前面加上的類名)。底線:要訪問(非靜態)數據,您需要指定將使用其數據的類的實例(就像使用朋友函數一樣)。

1

而不是使IsValid一個全局函數(你不小心在這裏做)或成員函數(我敢肯定是你的真實意圖)的,使它成爲一個functor,並在仿函數的構造函數傳遞比如你想用。

像這樣:

class ClassA 
{ 
    private: 

    UtilityClass utilityCls; // this is the instance that I need to access 

    virtual void Read(); 

    struct IsValid : public std::unary_function<char, bool> 
    { 
    IsValid(UtilityClass& utility) : utility_(utility) {}; 
    bool operator()(char c) const 
    { 
     return utility_.ProcessData(c); 
    } 
    }; 
}; 

使用它像這樣:一類

void ClassA::Read() 
{ 
    .... 
    string str = "abcdefg"; // sample only 
    if(find_if(str.begin(), str.end(), IsValid(utilityCls)) == str.end()) 
    { 
     .... 
    } 
} 
1

靜態函數是真正的元函數:函數,它們使用的類作爲一個整體,但而不是該班級的任何特定對象。因此他們沒有辦法訪問特定對象的成員,特別是他們錯過了大多數成員函數包含的隱含指針(this)。

如果您需要靜態類才能訪問對象的成員,則必須顯式傳遞指向該對象的指針或引用。通常情況下,最好將函數設置爲非靜態的。

P.S.您的IsValid定義不正確,應該是inline bool ClassA::IsValid(char c)