是否可以在静态成员函数中调用非静态数据成员? 是否也可以在静态成员函数中调用非静态成员函数?
你是怎么做到的?
答案 0 :(得分:6)
是 - 你可以,这就是
class Foo
{
public:
static void staticFunc( const Foo & foo)
{
foo.memberFunc();
}
void memberFunc() const
{
staticFunc(*this);
}
};
这是一种设计,除了递归之外,演示了如何调用静态和非静态成员函数。
答案 1 :(得分:5)
由于人们总是倾向于贬低,这是摘要:
如果传入类实例或其指针或引用,则可以从静态成员函数中访问非静态成员。对象的限定条件(换句话说,静态成员签名)将决定您是否只能从内部调用
const
或const
和non-const
成员函数。
非静态成员数据/函数依赖于this
指针 - 它基本上是指向访问/调用成员数据/函数的对象的指针。静态是类级别,不与单个对象关联。但是,如果将类实例/或实例本身的引用/指针传递给静态函数,则可以进行调用。
#include <iostream>
struct Eg {
Eg() : x(42), y(-42) {}
static void foo(Eg const&f) {
std::cout << "foo\n";
f.bar();
// we are good -- x is mutable
std::cout << f.x << std::endl;
f.x = 24;
std::cout << f.x << std::endl;
std::cout << f.y << std::endl;
// you need non-const access for the following
// so they don't work -- see foo signature
//f.y = -24; compile error -- const l-value
// f.barbar(); same as above
}
void bar() const { // const required since we have a const reference
std::cout << "bar\n";
}
void barbar() { // const required since we have a const reference
std::cout << "bar\n";
}
// note well the members
mutable int x;
int y;
};
int main() {
Eg ex;
Eg::foo(ex); // or ex.foo(ex);
}
看看Singleton / factory方法模式 - 你会对它们感兴趣。
答案 2 :(得分:4)
您需要对象的实例才能调用非静态成员函数或访问非静态数据成员。静态不具备它,所以通常它们不能,除非它们从某个地方得到一个(即,你有一个静态函数用来获取指向对象的指针的全局表。)
但静态不应该访问非静态数据。 。 。如果他们必须,他们不应该是静态的。你能告诉我们你想要做什么吗?
答案 3 :(得分:2)
您需要一些现有对象来调用其非静态成员函数或访问其非静态数据成员。
答案 4 :(得分:0)
通常情况下,除非你有一个指向实例的静态指针。
问题是静态方法没有特定的实例。如果传入实例,则可以调用非静态成员函数,否则调用no。
答案 5 :(得分:0)
不,除非你能以某种方式获得对定义类的实例的访问权,否则这是不可能的。
答案 6 :(得分:0)
两者都是:
class A {
int x;
void f() {
staticfunc();
}
static void staticfunc() {
A a;
a.x = 42;
a.f();
}
};
当然上面的相互递归会引起一些问题: - )
答案 7 :(得分:0)
这种情况的典型用例是将C API回调交给C ++项目中的对象实例。
// declared in some external C API
typedef void __stdcall EnumDataCallback( void* context, void* data );
void EnumData( EnumDataCallback* callback, void* context );
// in consuming C++ Project
class MyDataManager
{
public:
void PollData()
{
::EnumData( &MyObject::StaticEnumData, this );
}
private:
static void __stdcall StaticEnumData( void* context, void* data )
{
MyDataManager* instance = (MyDataManager*)(context);
instance->EnumData( data );
}
void EnumData( void* data )
{
// actual callback code
}
};
答案 8 :(得分:-1)
静态成员是类的一部分。这些是独立于任何其他类变量的数据成员。由于它们独立于其他类成员,因此可以使用范围解析运算符。这些是班上的全球成员。 而非静态成员是为类的实例创建的。