2012-07-27 59 views
2

我正在学习ns-3 tutorial。我无法理解下面的代码片断:从静态方法访问非静态成员的工作示例

class MyObject : public Object 
{ 
public: 
    static TypeId GetTypeId (void) 
    { 
    static TypeId tid = TypeId ("MyObject") 
     .SetParent (Object::GetTypeId()) 
     .AddConstructor<MyObject>() 
     .AddTraceSource ("MyInteger", 
        "An integer value to trace.", 
         MakeTraceSourceAccessor (&MyObject::m_myInt)) 
     ; 
    return tid; 
    } 

    MyObject() {} 
    TracedValue<int32_t> m_myInt; 
}; 

据我所知,为MyObject :: m_myInt是从静态方法来非静态类成员m_myInt接入和&借此构件的地址。此代码已成功编译并执行。怎么可能?静态方法使用什么类的实例?

+0

这实际上是一个指向成员的指针(不是指向实例成员的指针)。看[这个问题](http://stackoverflow.com/q/670734/1272627);它有一些很好的答案。 – Kaiged 2012-07-27 21:00:55

回答

2

成员指针可以指向任何一名成员方法或者成员变量,并不需要一个类的实例来声明或分配。但这并不意味着你可以在没有实例的情况下做很多事情。你仍然需要一个实例来使用它们。考虑下面的代码:

class A 
{ 
public: 
    void SomeMethod(); 
    int someVar; 
}; 

void (A::*pSomeMethod)() = &A::SomeMethod; //Declares a member pointer to method and assigns 
int A::*pSomeVar = &A::someVar; //Declares a member pointer to int variable and assigns 

A a; //Defines an instance 
(a.*pSomeMethod)(); //Uses an instance with the pSomeMethod member pointer. 
int var = (a.*pSomeVar); //Uses an instance with the pSomeVar member pointer. 

这是可能的,它允许一些非常酷的东西。

+0

非常感谢! – user1558573 2012-07-27 21:41:32