将声明转发为struct vs class

时间:2016-11-22 09:40:11

标签: c++ struct forward-declaration

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

Book.h:

class Book {
    ...
};

Library.h:

struct Book;

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

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

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

1 个答案:

答案 0 :(得分:18)

就前瞻性声明而言,

structclass完全可以互换。即使对于定义,它们也仅影响对象成员的默认访问说明符,其他所有内容都是等效的。你总是定义&#34;类&#34;对象。

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

关于你的编辑:

  

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

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

可以找到关于此警告的讨论,以及为什么在纪律严明时可以忽略的警告here