c++ - 结构与类的前向声明

标签 c++ struct forward-declaration

我在一个类的 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

最佳答案

structclass 就前向声明而言是完全可以互换的。即使对于定义,它们也只影响对象成员的默认访问说明符,其他一切都是等价的。您总是定义对象的“类”。

struct 必须在 class 之上使用的唯一地方是,当转发声明 的不透明数据时绑定(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/

相关文章:

c++ - 字节交换和 C++/C

c++ - C++ 中的函数 - 13 Sone 游戏

以对象作为数据成员的 C# 结构

C# 枚举、结构和类

c++ - "random does not name a type "错误,即使包含定义

c++ - 我可以在前向声明中默认模板参数吗

c++ - 多个线程可以加入同一个boost::thread吗?

c++ - 轮廓的排序点

c - 使用多个小数组代替大数组

c - 如何在c中不使用头文件编写hello world