0

私はACEフレームワークのマニュアルを見ていましたが、この宣言に出くわしました

int ACE_Stream<>::get   (ACE_Message_Block *&   mb, ACE_Time_Value * timeout = 0)

何を*&表しているのか理解できません。* はポインター用で、& は参照用です。この宣言の意味を説明できる人はいますか。

前もって感謝します

したがって、@NPEが言ったように、 *& はポインターへの変更を反映させます。しかし、理解するために、他の人がこれを正しく理解するのに役立つように、それを共有するコードを書き留めました

#include <iostream>

using namespace std;

class DoSomething
{
public:
  int n;
  DoSomething(int i){
    n = i;
  }
  virtual ~DoSomething();
};

DoSomething::~DoSomething()
{

}

int dosomething(DoSomething * a)
{
  cout << "Got value from caller: (in dosomething) = " << a << endl;
  a = new DoSomething(25);

  return 0;
}

int dosomethingElse(DoSomething *& a)
{
  cout << "Got value from caller: (in dosomethingElse) = " << a << endl;
  a = new DoSomething(15);
  return 0;
}

int main(int argc, char *argv[])
{
  DoSomething *d = new DoSomething(10);

  cout << "Pointer to DoSomething: " << d << endl;

  dosomething(d);
  cout << "After dosomething value of d: " << d << endl << endl;

  dosomethingElse(d);
  cout << "After dosomethingElse value of d: " << d << endl << endl;  

  delete d;
  return 0;
}

@NPEが言ったように、ここはこれのアウトプットです

Pointer to DoSomething: 0x955f008
Got value from caller: (in dosomething) = 0x955f008
After dosomething value of d: 0x955f008

Got value from caller: (in dosomethingElse) = 0x955f008
After dosomethingElse value of d: 0x955f028

したがって、実際に関数内に新しいインスタンスを作成すると、それは使用する場合にのみ伝播されます*&*

回答ありがとうございます。

4

2 に答える 2

6

*はポインター用であり、&参照であることを知っています。

正しい。したがって、ここにあるのは、参照によって渡されるポインターです。

于 2013-03-29T08:31:54.010 に答える
2

mb参照によって渡されるポインターです。これはget()、ポインターの値を変更した場合、その変更が呼び出し元に反映されることを意味します。

于 2013-03-29T08:30:29.410 に答える