代码之家  ›  专栏  ›  技术社区  ›  Dan

不使用class关键字转发声明

c++
  •  1
  • Dan  · 技术社区  · 3 年前
    class Wheel
    {
        Car* car;
    };
    
    int main(){
     return  0;
    }
    

    但是,如果我添加 class 然后编译工作:

    class Wheel
    {
        class Car* car;
    };
    

    class Car;
    class Wheel
    {
       Car* car;
    };
    
    2 回复  |  直到 3 年前
        1
  •  4
  •   Fantastic Mr Fox    3 年前

    就像你一样,编译器从上到下读取。如果你有一个类的对象指针而没有声明这个类,编译器(和你一样)会问“等等,这个类是什么?”


    (编者说“这是什么”像:

    error: ‘Car’ does not name a type; did you mean ‘char’?
    

    它是说,我不知道这个类型,我怎么能声明一个指向它的指针。它甚至试图提供一个有用的建议,多么可爱


    因此,您需要转发声明,而且它们是专门允许的。

        2
  •  3
  •   bolov    3 年前

    可能是错的。

    class Wheel
    {
        class Car* car; // 1
    };
    

    这是在宣告吗 ::Car Wheel::Car ? 老实说,这根本不重要。重要的是,绝大多数人不会知道答案,他们要么猜测,要么做广泛的研究来找出答案。

    ●汽车 .

    有趣的是:

    class Wheel
    {
        class Car* car; // 1
    
        class Car {};   // 2
    };
    

    Car 在1和2中相同? ●汽车 而2显然是 车轮:汽车

    让我们扩大乐趣。哦,孩子!

    class Wheel
    {
        class Car* car_1; // 1
    
        class Car {};     // 2
    
        Car* car_3;       // 3
        class Car* car_4; // 4
    };
    

    你头晕了吗?

    1是 ●汽车 ,而2、3和4是 车轮:汽车 . 请注意1和4的确切形状 完全相同的 ,但变量有2个 不同的 类型。

    class Wheel
    {
        class Car {};   // 1
    
        class Car* car; // 2
    };
    

    现在2不包含转发声明,类型为 车轮:汽车 . 请注意2看起来与第一个示例完全相同,但非常不同。

    总之,不要用这个!