4

为什么如果我在此代码中重载 -> 运算符

class subobj
{
public:
  void get()
  {
    printf("ea");
  }

};

template<typename T> class testPT
{
public:

  T* operator->()
  {
    return ptr;
  }


  T* ptr;
};


int main()
{
  subobj myobj;

  testPT<subobj> myclass;

  myclass.ptr = &myobj;



  myclass->get();


    return 0;
}

我打印了“ea”字符串?

通过使用“myclass->”,它应该只返回一个 T*,一个指向对象的指针。我应该做类似的事情

我的类->->get()

实际调用 get() 例程。我哪里错了?

4

1 回答 1

11

operator->是魔法。:)

它使用链接,这意味着只要您不返回普通指针,就会再次调用它。当您返回一个普通指针时,它会最后一次调用operator->. 你打电话时operator->

obj->foo;

它转化为:

(obj.operator->())->foo;

除了 whenobj是一个普通的指针。

你甚至可以这样做:

template<typename T> class testPT2
{
public:
  T* operator->()
  {
    return ptr;
  }
  T* ptr;
};

template<typename T> class testPT
{
public:
  testPT2<T> operator->()
  {
    testPT2<T> p2;
    p2.ptr = ptr;
    return p2;
  }
  T* ptr;
};

它仍然可以有效地应用operator->三遍。

于 2013-11-01T11:02:09.040 回答