2016-03-31 17 views
-1

クラス内の構造体にメンバーを定義する必要がありますか、いつネストされたクラスにメンバーを定義する必要がありますか?ネストされた型:struct vsクラス

例えば:Cで

class SkypeProtocol 
{ 
public: 
    SkypeProtocol(); 
    virtual ~SkypeProtocol(){} 

private: 

    class SkypeProtocolDateTime 
    { 
    private: 
     UI32 uDate; 
     ERROR GetDateString(PUCHAR pcBuffer,PUI32 uBufLen); 
    }; 

}; 

又は

class SkypeProtocol 
{ 
private: 
    SkypeProtocol(); 
    virtual ~SkypeProtocol(){} 

    typedef struct SkypeProtocolDateTime 
    { 
    private: 
     UI32 uDate; 
     ERROR GetDateString(PUCHAR pcBuffer,PUI32 uBufLen); 
    }SSKYPE_STRUCT; 

}; 
+5

typedef struct {...} structnameはVeery Cスタイル(C++ではありません)で、 "struct"を使用してください。 – Hcorg

+1

クラス内でクラスを宣言することが可能であるかどうかわかりませんでした。それは一般的な使用ですか? – steffen

+0

@steffenはい、イテレータと思う – OMGtechy

答えて

6

++(クラスのプライベート、構造体のパブリック)メンバーのデフォルトの可視性を除くクラスと構造体の間に違いはありません。

あなたのオブジェクトが(それ自体に実装されたロジックを多く持たない)ストレージとしてのみ使用される場合は、それを構造体として作成し、より複雑なオブジェクトに対してのみクラスを使用することが一般的です。

BTW:C++ではtypedef struct {...} StructName;という表記を使用する必要はありません。struct StructName {...};で十分です。

1
class SkypeProtocolDateTime; 
class SkypeProtocol 
{ 
public: 
    SkypeProtocol(); 
    virtual ~SkypeProtocol(){} 

private: 
    class SkypeProtocolDateTime* m_pimpl; 
}; 

私のプライベートを公開しないことをお勧めします。

+0

SkypeProtocolDateTimeは、SkypeProtocolと同じスコープで定義する必要はありません。ネストされたクラス( 'class SkypeProtocol :: SkypeProtocolDateTime {...};'として.cppに定義されています)でもかまいません。しかし、ええ、それはPimplsを作成する私の好みの方法です:) – Hcorg

+0

同意する、私は両方を行うことが知られています。 – dgsomerton

+1

'std :: unique_ptr m_dateTime_pimpl;を実行する方が良いでしょう。 – dgsomerton

0

ネストされたクラスは、時には本当に混乱する可能性があります。あなたが本当にこの方法で使用したい場合は、大丈夫です。

クラスをネストすると、おそらくより多くのデータを秘密にしておく必要がありますが、oopクラスの設計では、他のクラスを使用したい場合でも各クラスを分割することを提案しています。

プライベートメモリ機能あなたの問題を解決することができます対象であるので、読んで掘る;)

0

一般的な方法は、動作レスまたはパッシブオブジェクトのための構造体を使用することです。それにはCONSTANTSが含まれている可能性がありますが、すべての機能が不足しています。 Dateメンバは、デフォルトのpublic可視性を持っているので、getterおよびsetterメソッドを使用する代わりに、直接アクセスすることになっています。実際には、それはGoogle C++のスタイルガイドの一部であり、ユーザー定義の型を処理するための非常にクリーンな方法です。

関連する問題