我已多次看到以下样式类定义。这种风格的优缺点究竟是什么?
typedef class _MyClass
{
public :
_MyClass();
} MyClass;
答案 0 :(得分:3)
在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
类型,而不是特定于平台的类型。
答案 1 :(得分:2)
在C ++中没有专业人士。这种风格来自C,你不能只使用结构的名称作为一种类型。 E.g。
struct X
{
int x;
};
X a; //compiler error
struct X b; //OK
为了避免在C中使用精心设计的类型说明符,如struct X a
或enum E e;
等,通常的做法是输入名称。
E.G。
typedef struct X_ { ... } X;
现在X a;
也可以。
当然,在C ++中没有必要这样做。
答案 2 :(得分:2)
一个非常人为的例子说明了一个可能的优势,但是既然标准说明了这一点,它必定具有肯定的含义。
$ 7.1.3 / 6-“同样,在给定的 范围,类别或枚举 不得与...同名 一个在其中声明的typedef-name 该范围并指其他类型 比类或枚举本身。 [
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(){}