向前声明为结构与类

Forward declaration as struct vs class

本文关键字:结构 声明      更新时间:2023-10-16

我在类的C 正向声明中发现了一个错误,该声明被错误地声明为struct Book而不是class Book。我认为书曾经是一个结构,被改为课程,但远期声明仍然存在。

book.h:

class Book {
    ...
};

library.h:

struct Book;
class Library {
    std::vector<Book*> books;
};

没有编译器警告,结果计划似乎很好。这让我很好奇:从理论上讲,这是否会引起问题?这只是指针,是的,但是例如,如果班级具有虚拟方法,多个继承,指示器会有所不同吗?<<<<<<<</p>

我知道类/结构之间关于默认公共/私人的类/结构之间的差异,但我专门询问交换它们的远期声明和可能的后果。

update Xcode的新版本现在在不匹配时发出此警告:

Struct 'Book' was previously declared as a class; this is valid, but may result in linker errors under the Microsoft C++ ABI

structclass就向前声明而言是完全可互换的。即使对于定义,它们也只会影响对象成员的默认访问说明符,其他所有内容都是等效的。您总是定义对象的"类"。

唯一必须在class上使用struct的地方,是当向前声明C绑定不透明数据时。


关于您的编辑:

我知道类/结构之间关于默认公共/私人的类/结构之间的差异,但我专门询问交换它们的远期声明和可能的后果。

视觉C 产生警告C4099。它这样做,因为其功能的名称装饰包含您使用的关键字。因此,程序 May 无法正确链接。因此,当使用VC 时,完全符合标准的代码可能不会链接(Microsoft的部分移动,AFAIC)。

对此警告的讨论,以及如果您受到纪律处分,可以忽略它,可以在此处找到