Каковы плюсы / минусы этого стиля определения класса? - PullRequest
3 голосов
/ 15 ноября 2010

Я видел следующее определение класса стиля несколько раз. Каковы плюсы / минусы этого стиля?

typedef class _MyClass
{
public :
  _MyClass();
} MyClass;

Ответы [ 3 ]

3 голосов
/ 15 ноября 2010

Это довольно редко в C ++, но часто встречается в C (где struct Foo автоматически не псевдоним просто Foo.) Вы можете увидеть это в библиотеке, которая имеет разные классы для разных платформ (например, класс "Canvas", что очень зависит от реализации.) Библиотека будет использовать typedef, чтобы позволить своим пользователям упростить свой код:

#if WINDOWS
    typedef class WindowsCanvas {
        private: HWND handle;
    } Canvas;
#elif MAC
    typedef class MacCanvas {
        private: CGContextRef context;
    } Canvas;
#endif

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

2 голосов
/ 15 ноября 2010

Одно возможное преимущество проиллюстрировано очень надуманным примером, но, поскольку стандарт говорит об этом, он наверняка имеет значение.

$ 7.1.3 / 6- «Аналогично, вданная область, класс или перечисление не должны объявляться с тем же именем, что и имя typedef, которое объявлено в этой области и ссылается на тип, отличный от самого класса или перечисления. [

typedef struct S{} MYS;

int MYS;                     // Error due to $7.1.3/6

struct A{};

int A;                       // No error, subsequent use required fully elaborated name

int main(){}
2 голосов
/ 15 ноября 2010

В C ++ нет плюсов. Этот стиль пришел из C, где вы не могли просто использовать имя структуры в качестве типа. Э.Г.

struct X
{
   int x;
};

X a; //compiler error
struct X b; //OK

во избежание использования разработанного спецификатора типа, такого как struct X a, или enum E e; и т. Д. В C, обычной практикой является ввод имени по умолчанию Е.Г.

typedef struct X_ { ... } X;

Теперь X a; тоже в порядке.

Естественно, в C ++ нет необходимости делать это.

...