如何访问静态函数内的其他类实例变量

时间:2010-11-17 22:39:33

标签: c++ static

//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”。有一个简单的方法吗?或者还有其他方法或解决方法吗?对不起,如果这是一个愚蠢的问题。请帮帮我们......

5 个答案:

答案 0 :(得分:1)

你有一个静态功能。你打算如何访问成员变量?将变量设为静态或使函数为非静态。

答案 1 :(得分:1)

静态成员函数与相关,而不与该类的任何实例相关。它非常像一个全局函数,已经被声明为该类的朋友(有一种奇怪的名称,包括前面添加的类名)。

底线:要访问(非静态)数据,您需要指定要使用其数据的类的实例(就像使用友元函数一样)。

答案 2 :(得分: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())
    {
        ....
    }
}

答案 3 :(得分:1)

类的静态函数实际上是元函数:作为整体对类使用的函数,但不对类的任何特定对象有用。因此,他们没有办法访问特定对象的成员,特别是他们缺少大多数成员函数包含的隐含this指针。

如果需要静态类来访问对象的成员,则必须显式传递指向对象的指针或引用。通常最好将函数设置为非静态函数。

P.S。您对IsValid的定义不正确,应为inline bool ClassA::IsValid(char c)

答案 4 :(得分:0)

如果没有先创建类的实例,则无法访问实例变量。要么使IsValid非静态,要么将代码添加到静态方法,如

一级; a.utilityCls.ProcessData();