繁体   English   中英

前向声明为结构与类

[英]Forward declaration as struct vs class

我在一个类的 C++ 前向声明中发现了一个错误,它被错误地声明为struct Book而不是class Book 我认为 Book 曾经是一个结构体,被更改为一个类,但前向声明仍然存在。

书.h:

class Book {
    ...
};

图书馆.h:

struct Book;

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

没有编译器警告,生成的程序似乎运行良好。 这让我很好奇:理论上,这会导致问题吗? 它只是一个指针,是的,但是例如,如果类有虚方法、多重继承,指针会不同吗?

我知道关于默认公共/私有的类/结构之间的差异,但我特别询问了前向声明和交换它们的可能后果。

更新较新版本的 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的唯一地方是前向声明绑定的不透明数据时。


关于您的编辑:

我知道关于默认公共/私有的类/结构之间的差异,但我特别询问了前向声明和交换它们的可能后果。

Visual C++ 产生警告C4099 它做到了,因为其函数的名称修饰包含了您使用的关键字。 因此,程序可能无法正确链接。 因此,在使用 VC++ 时,完全符合标准的代码可能无法链接(微软的一个笨蛋举动,AFAIC)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM