代码之家  ›  专栏  ›  技术社区  ›  Neil Williams

C++中一个类的目的是什么?

  •  10
  • Neil Williams  · 技术社区  · 15 年前

    在一些C++代码中,我经常看到如下代码:

    typedef class SomeClass SomeClass;
    

    我很难说这到底能达到什么效果。这似乎什么都改变不了。做什么 typedef 像这样吗?如果这是有用的,值得付出额外的努力吗?

    7 回复  |  直到 15 年前
        1
  •  7
  •   Community Egal    7 年前

    请参阅前面对相关问题的回答。这是一篇来自丹萨克斯的文章的长引述,它像我遇到的任何事情一样清楚地解释了这个问题:

    Difference between 'struct' and 'typedef struct' in C++?

    这项技术可以防止实际问题(尽管公认的是很少出现问题)。

    这是一个廉价的保险-它在运行时或代码空间是零成本(唯一的成本是源文件中的几个字节),但您得到的保护是如此之小,以至于很少看到有人一直使用它。我有一个包含typedef的“new class”代码段,但是如果我真的从头开始编写一个类而不使用该代码段,我几乎不会费心(或者它还记得吗?)添加typedef。

    所以我想说,我不同意这里给出的大多数观点——把这些类型化的东西放进去是值得的,但不足以让任何人(包括我自己)为不放进去而感到悲伤。

    有人问我一个例子,说明没有类名typedef会导致意外的行为——下面是一个从SAKS文章中或多或少提出来的例子:

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    #if 0   // change to #if 1 to get different behavior
            // imagine that this is buried in some header
            // and even worse - it gets added to a header 
            //     during maintenance...
    string foo()
    {
        return "function foo... \n";
    }
    #endif
    
    class foo
    {
    public:
        operator string() {
            return "class foo...\n";
        }
    };
    
    int main()
    {
        string s = foo();
    
        printf( "%s\n", s.c_str());
        return 0;
    }
    

    当函数声明可见时,由于函数之间没有名称冲突,程序的行为将静默地更改。 foo 和班级 .

    但是,如果您包括 typedef class foo foo; “您将得到一个编译时错误,而不是行为上的静默差异。

        2
  •  20
  •   Adam Rosenfield    15 年前

    它防止这样的代码编译:

    class SomeClass { ... };
    int SomeClass;
    

    这是完全合法的C++,尽管它是 可怕的 . 如果你这样做,那么任何对 SomeClass 请参阅变量。要引用类,需要明确地说 class SomeClass 每次使用时。如果创建一个 typedef :

    class SomeClass { ... };
    typedef class SomeClass SomeClass;
    int SomeClass;
    

    然后编译器标记 int SomeClass 作为一个错误,它应该是正确的。

        3
  •  6
  •   anon    15 年前

    亚当提供了正确的理由,但关于你的问题“值得麻烦吗”我会给出一个响亮的“不!”。可能的问题代码:

    class SomeClass { ... };
    int SomeClass;
    

    稍后有人说:

    SomeClass sc;
    

    诚然,编译器会指出“错误”的一行,但这种情况很少发生(我认为我从未在真正的代码中看到过),以至于它无法证明一个近乎多余的typedef林是正确的。

        4
  •  0
  •   T.E.D.    15 年前

    似乎注释试图说明typedef使符号someclass成为全局符号,从而阻止任何人使用隐藏原始someclass的相同名称声明本地对象。

    我尝试用VC6(不是一个真正的C++编译器,我知道,但最好的我有ATM),它似乎没有太多。某些类仍然被具有相同名称的本地声明隐藏。也许它会更改错误消息的内容,以使某些编译器更有用。

        5
  •  0
  •   David Thornley    15 年前

    在我看来,你的同事可能还没有完全从C毕业。

    如果你申报 struct foo {int a;}; 你没有什么可以打的电话 foo 但更确切地说 struct foo . 因此,typedef很常见 结构体 作为 .

    这在C++中被改变了,原因应该相当明显。

        6
  •  0
  •   Joakim Elofsson    15 年前

    要么是真正坏了的编译器,要么是不知道自己在做什么的人,或者我会这样想。

        7
  •  -2
  •   Charlie Martin    15 年前

    我理解 标记和 标识符存在,但这是 真的值得麻烦 打字吗?

    不。