2010-11-17 50 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)