2012-07-27 86 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