【问题标题】:Working example of accessing non-static member from static method从静态方法访问非静态成员的工作示例
【发布时间】:2012-07-26 13:10:45
【问题描述】:

我正在学习ns-3 tutorial。我看不懂下面的代码sn-p:

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 并且 & 获取该成员的地址。此代码已成功编译并执行。怎么可能?静态方法使用什么类的实例?

【问题讨论】:

  • 这实际上是一个指向成员的指针(不是指向实例成员的指针)。见this question;它有一些很好的答案。

标签: c++ class pointers static non-static


【解决方案1】:

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

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.

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多