2016-04-12 4 views
1

'this'キーワードなどを使用して現在のオブジェクト型のポインタを作成する方法はありますか?'this' /現在のオブジェクト型のポインタを作成する

私は、他のGraphicObjectsやGraphicObjectsから派生したオブジェクトのコンテナとして機能する基本クラスGraphicObjectsを持っています。クラス内の型を明示的に指定するよりも優れていると思ったので、クラス名を変更したりクラス名を変更したりすることができます。

class GraphiObjects { 
    typeid(*this) *a; // Fails. 
    GraphicObjects *b; // This works. 
    GraphicObjects *children_[]; 
}; 

可能であれば、これを使用しない理由はありますか?

+5

達成したいことは何ですか? 'typeid'は' std :: type_info'オブジェクト*を返します。あなたはC++ 11の['decltype'](http://en.cppreference.com/w/cpp/language/decltype)と混同しましたか? 'typename std :: remove_reference :: type a;'のようなものは、* methods *では完全に有効ですが... ... – dhke

+0

テンプレートはおそらくあなたを救うことができますが、なぜですか'Alpha *'と書くことだけではないのですか?それがちょっとしたことや好みだとすれば、 "それは言語の一部だ、それをハックしない"と言うだろう。 – MicroVirus

+0

@ Michael私は、他のGraphicObjectsやGraphicObjectsから派生したオブジェクトのコンテナとして機能する基本クラスGraphicObjectsを持っています。クラスの型を明示的に指定するよりも優れていると思っていますので、クラス名を変更したりクラス名を変更したりすることができます。 –

答えて

1

C++は、ほとんど静的型のシステムを持つコンパイル言語です。特に、すべての式はコンパイル時に決定される型を持ちます。例えば、GraphiObjectsの機能では、ポインタのタイプはGraphiObjects*であり、おそらくconstおよび/またはvolatileが追加されています。

C++はOO言語であるため、「実行時の型」というものもあります。 thisGraphiObjects*ポインタであるため、GraphiObjectsオブジェクトだけでなく、派生クラスのオブジェクトも指すことができます。 typeidは実行時のクエリをサポートしていますが、コンパイル時に使用しようとしています。

メンバー関数でdecltype(*this)を使用できますが、メンバーデータには使用できません。これは理にかなっています:constメソッドはconst修飾されたthisポインタを持っていますが、非constメソッドはそうではありませんが、データメンバの場合はthisがconst修飾されるべきかどうかを判断する方法はありません。

+0

ありがとうございます。 –

+0

C++は「OO言語」ではありませんが(サポートしている1つのパラダイムですが)、実行時の型がないわけではありません。 PythonはOO言語で実行時の型を持っているので、2番目の段落で何を言おうとしているのか分かりません。 –

+0

@TobySpeight:C++では、「動的型」は実行時に型が作成されるという意味ではありません。式がオブジェクトを参照し、オブジェクトの型が式の型と一致しないコンテキストで特に使用されます。この場合、式の型は静的型、オブジェクトの型は動的型と呼ばれ、前者は後者の基本クラス( 'void *'を無視する)です。これはC++の 'dynamic_cast'に関連しています。 – MSalters

1

現在のオブジェクトタイプのポインタを作成する方法はありますか?

はい、thisです。 thisを複製するメンバ変数を作成するのは、せいぜい無駄です。

私は他のGraphicObjectsのコンテナとして機能することができ及びGraphicObjects

から派生したオブジェクトは、これを実行しないでくださいベースclass GraphicObjectsを持っています。オブジェクト階層を作成し、標準のコンテナを使用してそれらを格納します。さもなければ、あなたのオブジェクトの全ては、非ベースオブジェクトでさえ空のchildren_のメンバーだけでなく、それを操作するために必要な他のメンバーと機能も含みます。これは無駄で混乱します。

これは、クラス内の型を明示的に指定するよりも優れている可能性があるので、別の場所で使用したり、クラス名を変更することができます。

クラスがすべてGraphicObjects '階層にあるため、polymorphisimを利用する必要があります。この階層のすべてのオブジェクトをGraphicObjects*で参照することができます。オブジェクトタイプを取得するのは、dynamic_castのように簡単です。http://ideone.com/XSjMHW

EDIT:

  1. ないすべてのオブジェクトが他のオブジェクト、これらのノードオブジェクトが含まれています、私はここに、容器とpolymorphisimの使用を証明するために、むしろ大規模な例を書いた

    他のオブジェクトを含まないclass Nodeと呼びます。

  2. 他のオブジェクトが持つ可能性があるものその発現自身が、また、他のオブジェクトを含む、これらは別々のタイプである必要があり、我々はclass Containerそれを呼び出すよ、ContainerNodeから継承するか、メンバーNodeを有することができるのいずれか、それはまた、他のNode S/Container
が含まれています
+0

情報と例をありがとう。私は現在のオブジェクトの** **ではなく**現在の型のポインタ**を意味しました。私の元の質問の範囲をはるかに超えていますが、私はGraphicObjectから継承するTextグラフィックオブジェクトを持っています。次に、ボタンオブジェクトにはTextオブジェクトが含まれています。ボタンオブジェクトの描画コードもあります。次に0個以上のGraphicオブジェクトを含むScreen/Formオブジェクト。あなたはコンテナなしでGraphicObjectを保持し、派生したオブジェクトのそれぞれにコンテナを置くだけですか?私は.NET Controlクラスの非常に細かいバージョンを考えていました。 –

+0

@ mattb5906あなたが描いているクラス構造をセットアップするための客観的な方法を明確にしようと編集しました。それが意味をなさないかどうか私に教えてください。 –

+0

それは素晴らしいです。有難うございます。 –

関連する問題