我在一个类的 C++ 前向声明中发现了一个错误,它被错误地声明为 struct Book
而不是 class Book
。我认为 Book 曾经是一个结构,已更改为一个类,但前向声明仍然存在。
书.h:
class Book {
...
};
库.h:
struct Book;
class Library {
std::vector<Book*> books;
};
没有编译器警告,生成的程序似乎运行良好。这让我很好奇:理论上,这会导致问题吗?它只是一个指针,是的,但是例如,如果类有虚方法,多重继承,指针会不会不同?
我知道类/结构在默认公共(public)/私有(private)方面的区别,但我特别询问前向声明以及交换它们的可能后果。
更新较新版本的 Xcode 现在会在出现不匹配时发出此警告:
Struct 'Book' was previously declared as a class; this is valid, but may result in linker errors under the Microsoft C++ ABI
最佳答案
struct
和 class
就前向声明而言是完全可以互换的。即使对于定义,它们也只影响对象成员的默认访问说明符,其他一切都是等价的。您总是定义对象的“类”。
struct
必须在 class
之上使用的唯一地方是,当转发声明 c 的不透明数据时绑定(bind)。
关于您的编辑:
I know the differences between class/struct regarding default public/private but I'm asking specifically about the forward declarations and possible consequences of swapping them.
Visual C++ 产生警告 C4099 .它这样做了,因为其功能的名称装饰包含了您使用的关键字。因此,程序可能无法正确链接。因此,在使用 VC++ 时,完全符合标准的代码可能无法链接(AFAIC 是微软的愚蠢举动)。
关于这个警告的讨论,以及如果你遵守纪律,为什么可以忽略它,可以找到 here
关于c++ - 结构与类的前向声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40738351/