2016-03-31 3 views
-1

Когда мне следует определять члены в структуре внутри класса и когда я должен определять элементы в вложенном классе?Вложенный тип: struct vs class

Например:

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 является veeery C style (не C++), используйте просто «struct» – Hcorg

+1

Я даже не знал, что можно было объявить класс внутри класса. Это обычное применение? – steffen

+0

@steffen да, думаю, итераторы – OMGtechy

ответ

6

В C++ нет никакой разницы между классом и структуры для видимости членов (частных для класса, общественности для структур) по умолчанию, за исключением.

Если ваш объект будет использоваться только для хранения (без большой логики, реализованной сам по себе), то обычной практикой является создание его как структуры и использование класса только для более сложных объектов.

BTW: в C++ вам не нужно использовать обозначение typedef struct {...} StructName;, простое struct StructName {...}; достаточно.

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

private: 
    class SkypeProtocolDateTime* m_pimpl; 
}; 

Я предпочитаю не подвергать своих рядовых.

+0

SkypeProtocolDateTime не нужно определять в той же области, что и SkypeProtocol, - это также может быть вложенный класс (определенный в .cpp как «класс SkypeProtocol :: SkypeProtocolDateTime {...};'). Но да, это мой предпочтительный способ создания Pimpls :) – Hcorg

+0

Согласитесь, мне известно, что они оба. – dgsomerton

+1

Было бы даже лучше сделать 'std :: unique_ptr m_dateTime_pimpl;' – dgsomerton

0

Вложенные классы не являются предпочтительными, которые иногда могут смутить. Если вы действительно хотите использовать, таким образом, ударить в порядке.

Когда вы вставляете класс, вы, вероятно, входите в него и как-то храните больше данных в секрете, но проекты классов oop также предлагают разделить каждый класс, даже если вы хотите использовать некоторые в другом.

Частные функции памяти является предметом, который может решить вашу проблему, так что читать и закопать;)

0

Общая практика заключается в использовании-структуру для поведения менее или пассивных объектов. Он может содержать CONSTANTS, но при этом отсутствует функциональность. Предполагается, что члены-члены получают доступ напрямую, вместо использования метода getter и setter, поскольку он имеет общедоступную видимость по умолчанию. На самом деле это часть руководства по стилю google C++, а также очень чистый способ обработки пользовательских типов.