0

オブジェクトのインスタンスを渡すことと、逆参照されたオブジェクトを渡すことの違いはわかりません。私は持っています

class A
{
public:
  A() {}

  void m() {}
};

void method(A& a)
{
  a.m();
}

int main(int argc,char** argv)
{
  method(A());
  return 0;
}

上記の呼び出しは、コンパイラエラーでは機能しません。

In function 'int main(int, char**)':
error:no matching function for call to 'method(A)'
note: candidates are:
note: void method(A&)
note: no known conversion for argument 1 from 'A' to 'A&'
note: void method(B&)
no known conversion for argument 1 from 'A' to 'B&'

しかし、私が書くなら

method(*(new A()));

します。

呼び出したいメソッドを変更できない場合、問題の理由と解決方法を教えてもらえますか?

4

4 に答える 4

3

最初のケースでは、に渡そうとする一時オブジェクトを作成しますmethod
一時オブジェクトは変更できません(変更しても意味がありませんmethod。戻った瞬間に消えてしまいます)。したがって、一時的な参照を渡すには、const参照を渡す必要があります。

void method(const A& a)
{

}
于 2013-02-22T22:23:50.427 に答える
2

ここでは、一時オブジェクトを作成しています。

method(A()); // A() here is creating a temporary
             //     ie an un-named object

const&一時的なオブジェクトにしかアクセスできません。
したがって、2つのオプションがあります。

  1. const参照を取得するようにインターフェースを変更します。
  2. 実際のオブジェクトを渡します。

それで:

// Option 1: Change the interface
void method(A const& a)  // You can have a const
                         // reference to a temporary or
                         // a normal object.


// Options 2: Pass a real object
A a;
method(a); // a is an object.
           // So you can have a reference to it.
           // so it should work normally.
于 2013-02-22T22:23:54.560 に答える
1

これが合法だとしたら、恐ろしいことが起こるでしょう。検討:

void addOne(double& j) { ++j; }

int q = 10;
addOne(q);

これにより、一時的なものが作成doubleされ、それに追加され、元のファイルはq変更されません。痛い。

パラメータmethodを変更すると、コードが壊れます。そうでない場合は、const参照する必要があります。

于 2013-02-22T22:27:43.817 に答える
1

表示される問題は、関数がタイプAの左辺値のみを受け入れることです。この問題を解決するには、関数を変更してタイプAを値で受け入れるようにします。

void method( A a ) {}

またはconst参照による:

void method( const A &a ) {}

または右辺値参照(C ++ 11を使用する場合):

void method( A &&a ) {}

または、タイプAの左辺値をメソッドに渡します。

A a; method( a );

問題をより深く理解したい場合は、C++の左辺値について読んでください。

于 2013-02-23T00:14:31.180 に答える