这种类定义风格有哪些优缺点?

3

我已经多次看到以下样式类的定义。这个样式类的优缺点是什么呢?

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

1
首要注意:_MyClass是一个被实现(编译器+标准库)保留的标识符。在用户代码中使用它是不正确的。这里有一个相关的问题(链接:https://dev59.com/L3I-5IYBdhLWcg3wxruQ)。该问题被标记为C,第一个答案既适用于C也适用于C++,并解释了两者之间的区别。 - David Rodríguez - dribeas
1
这是一位C开发人员的遗留问题,他还没有学会如何正确使用C++。请忽略它。在C++中,为类或结构体定义类型别名绝对没有任何好处。 - Martin York
另外:除非您真的知道它什么时候不好,否则不要使用前缀_:请参阅https://dev59.com/KHVC5IYBdhLWcg3woSxW#228797。 - Martin York
3个回答

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类型,而不是特定于平台的类型。

我认为你的例子并没有证明什么。在这两种情况下,人们都可以用Canvas来命名类。 - Armen Tsirunyan
1
我知道。 :) 但有些人更喜欢那种风格。在调试时这确实会有所影响,调试器通常会知道一个类的名称,但不知道它的typedef别名,这可能使得更容易知道正在使用哪个实现。 - Jonathan Grynspan

2
在C ++中没有优点。这种风格来自于C语言,因为你不能仅仅使用结构体的名称作为类型,例如:
struct X
{
   int x;
};

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

为了避免在C语言中使用复杂的类型说明符,例如struct X aenum E e;等,通常的做法是对名称进行typedef。例如:

typedef struct X_ { ... } X;

现在 X a; 也可以了。

在C++中,自然不需要这样做。


在C语言中,typedef struct foo foo;是合法的。而typedef struct _foo foo;这种写法实际上是为了解决C++中的问题,因为C++对于每个struct/class声明都有一个隐式的typedef,所以typedef不能与struct同名。 - asveikau
在 C++ 中没有什么优点 - 一些解释会很有帮助。 - Chubsdad
2
@asveikau:什么?在C ++中,typedef struct foo foo; 也是有效的。 - Armen Tsirunyan
@Chubsdad:这种风格在C语言中的原理以及在C++中不需要这样做的解释。 - Armen Tsirunyan
@Armen Tsirunyan:哦,好的。我不确定,但似乎发现$7.1.3/6是一种优势。 - Chubsdad
1
@asveikau:这是一个常见的误解,简短的回答是否定的。在C++中没有隐式的typedef。不同之处在于,在非类型名称空间中无法匹配标识符后,它将继续在用户定义的类型名称空间中查找标识符(此处的名称空间并不表示C++“命名空间”,而是编译器中给定种类的标识符集合)。请参见此答案 - David Rodríguez - dribeas

2

一个可能的优势可以通过一个高度虚构的例子来说明,但由于标准提到了它,它一定有一个含义。

$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(){}

1
不要把它视为优势。 - Martin York

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接