将声明转发为struct vs class

Tom*_*rle 16 c++ struct forward-declaration

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

Book.h:

class Book {
    ...
};
Run Code Online (Sandbox Code Playgroud)

Library.h:

struct Book;

class Library {
    std::vector<Book*> books;
};
Run Code Online (Sandbox Code Playgroud)

没有编译器警告,结果程序似乎工作正常.这让我很好奇:理论上,这会不会引起问题?它只是一个指针,是的,但是,例如,如果类有虚方法,多继承,指针可能不同吗?

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

Sto*_*ica 20

struct并且class是完全可以互换尽可能向前声明有关.即使对于定义,它们也仅影响对象成员的默认访问说明符,其他所有内容都是等效的.您始终定义对象的"类".

struct必须使用的唯一地方class是向前声明绑定的不透明数据.


关于你的编辑:

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

Visual C++生成警告C4099.它这样做,因为其功能的名称装饰包含您使用的关键字.因此,程序可能无法正确链接.因此,在使用VC++时,完全符合标准的兼容代码可能无法链接(在Microsoft的部分,Ahead是一个傻瓜移动).

可以在此处找到对此警告的讨论,以及为什么在您受到纪律处分时可以忽略的警告