2013-03-19 8 views
10

なぜtypedef class {} Nameを使用するのですか?C++ typedefクラスを使用する

私はこれをIBM C++ docで学びましたが、ここで使用するヒントはありません。

+6

C.の遺産は使用しないでください。 –

+1

私は個人的にこの質問がdownvotesに値するとは思わない。私はそれを使用することに対してもアドバイスをしますが、公正な質問です。たぶん説明**なぜ**ここで良いでしょう。 –

+0

@IvayloStrandjev - 同意した、私は同じことを書いていただけだった。それは本当に醜く不必要で、私はちょっと驚いています。これはIBMの文書で使われています。 –

答えて

22

これは 'C'言語の二日酔いです。あなたはその後、

struct Pt { int x; int y; }; 

は、この構造体の変数を宣言する必要がある場合はCで

は、あなたがのtypedefは、あなたが

typedef struct { int x; int y; } Pt; 
C

でこれを避ける助け

struct Pt p; 

を行う必要があります

今できること

C++ではC.

、それはCで行うようにそれは、C++には表記の利点を提供していないあなたは

Pt p; 

を行うことを許可され

class Pt { int x; int y; }; 

ので、これは必要ではなかったですOTOHでは、この構文は構築や破壊のメカニズムを提供しないため、制限が生じます。

つまり、コンストラクタまたはデストラクタで名前のtypedef名を使用することはできません。

typedef class { int x; int y; } Pt; 

Ptというコンストラクタやデストラクタも使用できません。 本質的に、ほとんどの場合、C++でこれを行うべきではありません。

+0

ありがとう!どのようなCのbeneficeについて? Steve Jessopによって記述されたもののみ? – octoback

+0

あなたは確かに 'Pt'から継承することができます –

+0

" Cハングオーバー "のために"継承のためのメカニズムを提供していません "と –

3

この回答は、単に{}ではなく、クラス内に興味深いコンテンツがいくつかあると仮定しています。

C++では、(Cとの互換性のために)クラスと同じ名前の関数を持つことができますが、決して望むことはほとんどありません。

typedefと同じ名前の関数を持つことはできません。これにより、厳格な名前の選択から保護されます。ほとんど誰も気にしない、とあなたが気にするつもりだ場合でも、あなたはおそらくそれを記述します

class Name {}; 
typedef Name Name; // reserve the name 

あなたが参照しているコードが実際に書かれたようであれば(私はあなたに従うことによってそれを見ることができませんあなたが空のクラスNameを呼び出すのはなぜですか?)しかし、上記の考慮のために修正されました。

+0

typedefの名前のこの特別な扱いについて私は知らなかった。知っているGrood!また、私はそれが驚くべきことであり、おそらく 'typedef A A; 'が許されていることに気づいています。 – Agentlien

+0

ちょっと遊んだあと、ほとんどのコンパイラが説明したように実装されているようですが、標準で関連するセクションが見つかりません。あなたは参考に役立つと思いますか? – Agentlien

+0

@Agentlien:typedefではなくクラス名の特別な扱いです。 C++ 11の関連ビットは3.3.10/2([basic.scope.hiding])です。 –

関連する問題