前向声明为结构 vs class
Forward declaration as struct vs class
我在 class 的 C++ 前向声明中发现了一个错误,它被错误地声明为 struct Book
而不是 class Book
。我认为 Book 曾经是一个结构,已更改为 class 但前向声明仍然存在。
Book.h:
class Book {
...
};
Library.h:
struct Book;
class Library {
std::vector<Book*> books;
};
没有编译器警告,生成的程序似乎运行良好。这让我很好奇:理论上,这会导致问题吗? 它只是一个指针,是的,但是例如,如果 class 有虚方法、多重继承,指针可以不同吗?
我知道 class/struct 之间关于默认 public/private 的区别,但我特别询问前向声明和交换它们的可能后果。
UPDATE Xcode 的较新版本现在在出现不匹配时给出此警告:
Struct 'Book' was previously declared as a class; this is valid, but may result in linker errors under the Microsoft C++ ABI
就前向声明而言,struct
和 class
是完全可以互换的。即使对于定义,它们也只影响对象成员的默认访问说明符,其他一切都是等价的。您总是定义 "classes" 个对象。
唯一必须在 class
上使用 struct
的地方是为 c 绑定转发声明不透明数据时。
关于您的修改:
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。它之所以这样做,是因为其函数的名称修饰包含了您使用的关键字。因此,程序 可能 无法正确 link。因此,在使用 VC++ 时,完全符合标准的代码可能不会 link(微软方面的愚蠢举动,AFAIC)。
有关此警告的讨论,以及如果您遵守纪律可以忽略它的原因,请参见 here
我在 class 的 C++ 前向声明中发现了一个错误,它被错误地声明为 struct Book
而不是 class Book
。我认为 Book 曾经是一个结构,已更改为 class 但前向声明仍然存在。
Book.h:
class Book {
...
};
Library.h:
struct Book;
class Library {
std::vector<Book*> books;
};
没有编译器警告,生成的程序似乎运行良好。这让我很好奇:理论上,这会导致问题吗? 它只是一个指针,是的,但是例如,如果 class 有虚方法、多重继承,指针可以不同吗?
我知道 class/struct 之间关于默认 public/private 的区别,但我特别询问前向声明和交换它们的可能后果。
UPDATE Xcode 的较新版本现在在出现不匹配时给出此警告:
Struct 'Book' was previously declared as a class; this is valid, but may result in linker errors under the Microsoft C++ ABI
struct
和 class
是完全可以互换的。即使对于定义,它们也只影响对象成员的默认访问说明符,其他一切都是等价的。您总是定义 "classes" 个对象。
唯一必须在 class
上使用 struct
的地方是为 c 绑定转发声明不透明数据时。
关于您的修改:
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。它之所以这样做,是因为其函数的名称修饰包含了您使用的关键字。因此,程序 可能 无法正确 link。因此,在使用 VC++ 时,完全符合标准的代码可能不会 link(微软方面的愚蠢举动,AFAIC)。
有关此警告的讨论,以及如果您遵守纪律可以忽略它的原因,请参见 here