Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 这种类定义风格的优点/缺点是什么?_C++_Typedef - Fatal编程技术网

C++ 这种类定义风格的优点/缺点是什么?

C++ 这种类定义风格的优点/缺点是什么?,c++,typedef,C++,Typedef,我已经多次看到下面的样式类定义。这种风格的优缺点是什么 typedef class _MyClass { public : _MyClass(); } MyClass; C++中没有任何优点。这种样式来自C语言,在C语言中,不能只使用结构的名称作为类型。例如 struct X { int x; }; X a; //compiler error struct X b; //OK 为了避免使用复杂的类型说明符,如struct X a或enum E等。在C中,键入定义名称是一种常见做法

我已经多次看到下面的样式类定义。这种风格的优缺点是什么

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

C++中没有任何优点。这种样式来自C语言,在C语言中,不能只使用结构的名称作为类型。例如

struct X
{
   int x;
};

X a; //compiler error
struct X b; //OK
为了避免使用复杂的类型说明符,如
struct X a
enum E等。在C中,键入定义名称是一种常见做法。
例如

现在
xa也可以


<>当然,C++中没有必要这样做。

< P>这在C++中很少见,但是在C中是常见的(其中<代码>结构FoO < /C> >不会自动混淆为<代码> fo。)您可以在一个库中看到它,它有不同的类(例如,“画布”类,这是非常具体的实现)。库将使用
typedef
让用户简化代码:

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

在这样一个示例中,只需要使用
画布
类型,而不需要使用特定于平台的类型。

一个精心设计的示例说明了一个可能的优势,但由于标准提到了它,因此它肯定具有隐含性

$7.1.3/6-“同样,在给定的 范围、类别或列举应 不能使用与相同的名称声明 在中声明的typedef名称 该范围并引用其他类型 而不是类或枚举本身。 [


我认为您的示例并不能证明任何事情。在这两种情况下都可以使用Canvas命名类。我知道。:)但有些人更喜欢这种样式。它确实会在调试中起到作用,调试器通常会知道类的名称,但不知道它的
typedef
别名,从而可能更容易知道在哪种实现在C++中,代码不正确。C++中的TyBuffFr.FooFoo; SyPulfStuttFooFo;习惯用法实际上是C++的一种解决方法,因为C++对于每个代码< Stutt /Cuth>类> <代码>声明都有一个隐含的<代码> TyPulfF/COD>,所以<代码> TyPufF不能有与<代码>结构> /COD相同的名称。E>在C++中,没有任何一个工具-一些解释会有帮助。@ asvikau: Hu.TyPulfFraseFooFo;在C++中有效well@Chubsdad解释是C中这种风格的原理,而C++上没有这种需要。@ asvikau:这是一个常见的误解,简短的答案是否定的,C++中没有隐含的Type,区别是在未匹配非类型名称空间中的标识符之后,将继续查找用户定义的类型名称空间中的标识符(这里的名称空间不表示C++ +代码>命名空间< /代码>,而是编译器中给定类型的标识符集合)。请参阅第一个CON:<代码> yMyCype < /Cord>是为实现保留的标识符(编译器+标准LIBS)。在用户代码中使用它是不正确的。相关问题(问题是标记C,第一个答案是C和C++,解释差异)。这是一个C开发人员的遗留物,没有正确地使用C++。忽略C++中的类或结构类型的绝对好处:除非你真的知道它是坏的,否则不要使用前缀。
#if WINDOWS
    typedef class WindowsCanvas {
        private: HWND handle;
    } Canvas;
#elif MAC
    typedef class MacCanvas {
        private: CGContextRef context;
    } Canvas;
#endif
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(){}