1

編集:ばかげたタイトルで申し訳ありません。「ポインターオブジェクト」とは、逆参照されたオブジェクトポインターを意味すると思います(それが明確化されている場合)。

私は C++ を初めて使用し、その特異性 (Java 由来) に慣れようと努めてきました。

通常は必要ないことはわかっていますが、オブジェクトをポインターで渡してみたかったのです。もちろん機能しますが、これも機能することを期待していました:

void test(Dog * d) {
*d.bark();
}

そして、そうではありません。どうしてこれなの?次のことができることがわかりました。

void test(Dog * d) {
Dog dawg = *d;
dawg.bark();
}

そしてそれは完璧に動作します。私にはとても冗長に思えます。

明確化をいただければ幸いです。ありがとう!

4

6 に答える 6

9

イモ。間接参照*よりも優先されるため、次のようになります。

(*d).bark();

または、他の返信で述べられているように、ポインタの場合は、->

d->bark();

nullを確認してください:)

于 2012-07-04T04:25:17.667 に答える
7

状況を明確にするために、または--のいずれか を使用できます。(*pointer).member()pointer->member()a->b(*a).b

もちろん、これは「実際の」(組み込みの) ポインターを扱っていることを前提としています。オーバーロードして別のことoperator->をすることは可能です。ただし、のオーバーロードoperator->はある程度制限されているため、一般的に、オーバーロードを使用してあまり奇妙なことを行うことはできません。(たとえば、いくつかの反復子の古い実装で) 遭遇する可能性があることの 1 つは、まったくサポートoperator->されていないことです。そのため、それを使用しようとするとコンパイル エラーが発生します。(*iterator).whateverそのような実装は (ほとんど?) ずっと前になくなりましたが、これが原因で、代わりにを使用する (通常は古い) コードがまだいくつか見られる場合があります->

于 2012-07-04T04:31:54.577 に答える
6

そのすべてが括弧内にあります:

(*d).bark();
于 2012-07-04T04:25:29.863 に答える
6

->ポインタに対して演算子を使用する必要があります。演算子は.非ポインタオブジェクト用です。

最初のコードスニペットで、を試してくださいd->bark();。うまくいくはずです!


編集:他の答えは示唆して(*d).bark();います。それも機能します。(*d)ポインタを逆参照する(つまり、通常のオブジェクトに変換する)ため、演算子が機能.します。元のポインタを使用するには、単に、私が説明したように演算子をd使用する必要があります。->

お役に立てれば!

于 2012-07-04T04:25:31.027 に答える
3

誰もが答えるべき 1 つの点を欠いています: Operator Precedenceです。

の優先順位はoperator.、(単項) ポインター間接化 ( *) 演算子の優先順位よりも高くなります。そのため、ブラケットが必要です。+ を括弧で囲んで正しい平均を取得するのと同じです。

int nAverage = (n1+n2) / 2;

ポインターの間接化の場合、コンパイラーがエラーを出しているのは幸運です!

于 2012-07-04T05:10:03.453 に答える
2

ポインタを使用する場合は演算子を使用する必要があります。->つまり、コードはである必要がありますd->bark();

于 2012-07-04T04:25:31.570 に答える