//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 :(得分: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();