2

私の友人が言ったことをよく理解していません:

C ++では、オブジェクトのタイプを知らずにオブジェクトのメソッドを呼び出すことはできません。動的ではありません。Objective Cでは、[オブジェクトメッセージ]のようなことを行うことができますが、Qtでは、シグナルとスロットを使用してそれを行うことができます。C++11ではそれもできます

私の質問は:それは正しいですか?

可能であれば、オブジェクトのタイプがわからないのに、C ++(C ++ 11ではない)でオブジェクトのメソッドを呼び出せない理由をわかりやすい英語で説明してください。

4

2 に答える 2

5

はい、それは正しいです(ほとんどの場合)。C++のオブジェクトメソッドは、多かれ少なかれ通常の関数呼び出しのように実装されます(関数ポインター呼び出しのような仮想関数呼び出しを除く)。関数ポインタを取得してに格納し、それを使用できる型がわからないstd::functionものに渡します。それはあなたの友人が言及しているものかもしれません、そしてQt信号/スロットに似ています。

関数呼び出しが仮想であるかどうか、および仮想関数を配置するvtable内の場所を知るには、クラスのタイプを知る必要があります。

Qtでは、これは。でのみ実行できますQObjectQ_INVOKEマクロを使用しmocて、メタコールシステムを介して関数にアクセスできるようにする必要があることを通知できます。次に、それを呼び出すために使用できますがQMetaObject::invokeMethod、基本クラスがであることがわかっているだけですQObject(もちろん、タイプを知る必要があることに注意してくださいQObject)。Qtは、名前でメソッドを呼び出すために使用できるメタコードを内部的に作成しているだけです。 (Q_SLOTまたは、、Q_INVOKABLEまたはslotsセクションでマークされている場合。)

于 2012-11-08T10:09:40.960 に答える
0

真実はその中間にあります。厳密に言えば、主張は間違っていると言えます。

基本的に、C ++は強く型付けされているため、変数にはプログラム実行全体に対して定義された型があります。動的言語では、変数のタイプはプログラムの実行中に変更される場合があります。

ただし、仮想関数とポインターを使用すると、正確な型を知らなくても、C++でオブジェクトのメソッドを呼び出すことができます。その場合、基本言語といくつかの派生クラスがあります。基本クラスへのポインターを使用してメソッドを呼び出す場合、派生クラスへのポインターを変数に格納することもできるため、メソッドが呼び出されるクラスが正確にわかりません。

動的言語では、オブジェクトに対して定義されていないオブジェクトでメソッドを呼び出すと、メッセージを理解するオブジェクトにメッセージを転送する(しようとする)委任メカニズムがあります。これは一般的なランタイムメカニズムであり、C++には存在しません。

現在、QtはC++と同様に一般的に強く型付けされています。物事を動的に行う唯一の方法は、基本/派生のクラス化された関数と仮想関数の同じメカニズムによるものです。

そして非常に鋭いことです。オブジェクトのタイプを知らずにメソッドを呼び出すことは、実際にはメソッドが何をするのかを知らないと見なすことができます。動的に型付けされた言語でも、通常、少なくともオブジェクトの可能な型についての考えはあります。そのように、オブジェクトのタイプを知らずにメソッドを呼び出すことが有用なアプリケーションはないと私は主張します。注:動的型付けが役に立たないと言っているわけではありません(Objective C、Ruby、Javascriptに非常に満足しています...)-しかし、あなたが何も知らないわけではないと言っています動的言語でのオブジェクトの型について。

于 2012-11-08T10:27:55.523 に答える