我在类的C ++前向声明中发现了一个错误,它被错误地声明为struct Book
而不是class Book
。我认为Book曾经是一个结构,变成了一个类,但前向声明仍然存在。
Book.h:
class Book {
...
};
Library.h:
struct Book;
class Library {
std::vector<Book*> books;
};
没有编译器警告,结果程序似乎工作正常。这让我很好奇:理论上,这会不会引起问题?它只是一个指针,是的,但是,例如,如果类有虚方法,多继承,指针就可以了是不同的?
我知道关于默认公共/私人的类/结构之间的区别,但我特别询问了前向声明和交换它们的可能后果。
答案 0 :(得分:18)
struct
和class
完全可以互换。即使对于定义,它们也仅影响对象成员的默认访问说明符,其他所有内容都是等效的。你总是定义&#34;类&#34;对象。
struct
必须使用class
的唯一地方是前向声明c绑定的不透明数据。
关于你的编辑:
我知道关于默认公共/私人的类/结构之间的区别,但我特别询问了前向声明和交换它们的可能后果。
Visual C ++产生警告C4099。它这样做,因为其功能的名称装饰包含您使用的关键字。因此,程序可能无法正确链接。因此,在使用VC ++时,完全符合标准的兼容代码可能无法链接(在Microsoft的部分,AFAIC上进行了傻瓜移动)。
可以找到关于此警告的讨论,以及为什么在纪律严明时可以忽略的警告here