インスタンスへのポインターについて話しているのではなく、クラス自体へのポインターが必要です。
9 に答える
C++ では、クラスは「ファースト クラス オブジェクト」ではありません。取得できる最も近いものは、そのtype_info
インスタンスへのポインターです。
いいえ。ポインタは、実行時のコンピュータのメモリ内の何かのアドレスです。クラスは、コンパイラに対する一連の命令にすぎません。
他の誰もがすでに言っているように、クラスへのポインタを持つことはできません。
ただし、実行時に選択したクラスから新しいインスタンスを作成することが重要な場合は、ファクトリメソッド(または抽象ファクトリ)のデザインパターンを確認することをお勧めします。
「クラス」は存在しません。あなたが指摘できる唯一のものはデータです。
「クラス」の残りの部分は、実際にはディスパッチテーブルです。クラス内のメソッドごとに、ディスパッチテーブルにはポインタがあります。このように、クラスは、現在キャストされているタイプに関係なく、クラスの正しいメソッドを指します。これはアクセスするのに役に立たないでしょう。
クラス内のメソッド(ディスパッチテーブルが指すもの)は、実際にはクラスデータポインターで渡される単なる「関数」です。メソッドの定義は、クラスデータをパラメーターとして受け取る関数であるということとほぼ同じです。ほとんどのCスタイルの言語では、そのデータポインタは非表示になっていますが、「this」と呼ばれます。
クラスのメソッドは、コードベース全体に分散している場合があります。親クラスがあるため、これらのメソッドが互いに隣接していることすら見つからない可能性があります。
クラスへの(実行時)ポインターを持つことはできませんが、C ++には同様のコンパイル時の概念(テンプレートパラメーター)があります。 Boostには、それらを操作するための専用のライブラリと、クラスに関する情報を取得するためのトレイトライブラリがあります。
はい、いいえ。これは、達成しようとしている内容のコンテキストによって異なります。単に型へのポインタが必要な場合は、方法がありません。型は、ポインタの意味でメモリ内に存在しません。
私が「はい」と言ったのには理由がありますが、仮想テーブルを型へのポインタと見なす人もいるからです。仮想テーブルはメモリ内に存在し、ちょっとしたトリックで仮想メソッドを呼び出すために使用できるため、このポインターを取得することは可能です。
真のオブジェクトベースの言語とは異なり、C++ ではクラスはオブジェクトではありません。「クラスへのポインター」に最も近いのは RTTI です。
const std::type_info &info = typeid(オブジェクト式);
type_info には name() メンバ関数があり、それらを比較することができます。
ポインターについてどのように考えたいかによって、ポインターが何らかの整数値を意味する場合、クラスへの「ポインター」を持つことができます。Boost を使用すると、タイプを登録し、登録するすべてのタイプに一意の整数を割り当てることができます。登録する型がすべてクラスの場合、必要な型の値があれば、必要な型のオブジェクトを作成するために必要なコードを実行時に検索できます。しかし、一般に、クラスは言語のファースト クラス オブジェクトではありません。期待できる最善の方法は、必要な動作をシミュレートすることです。
確かに、C++ に組み込まれているリフレクション/イントロスペクションのサポートはありませんが、Java のクラス機能などの多くを追加し、プログラマーがクラスを表すオブジェクトを取得したり、インスタンスを作成したりできるようにするライブラリが多数あります。 . google c++ リフレクション。