前向声明时“struct”和“class”关键字是不是相同? [复制]

Posted

技术标签:

【中文标题】前向声明时“struct”和“class”关键字是不是相同? [复制]【英文标题】:Are "struct" and "class" keywords the same when forward declaring? [duplicate]前向声明时“struct”和“class”关键字是否相同? [复制] 【发布时间】:2020-05-13 15:42:31 【问题描述】:

在过去,我能够将类声明为结构体,反之亦然,或者像在 C 中声明类型,比如:

void function(struct Foo* arg);
void function(class Foo* arg);

我认为出于此目的或前向声明的目的它们是相同的,因为我多次听说结构和类之间的唯一区别是默认访问说明符(结构是公共默认值,而类是私有的)。

我已经将我的一个类中的一个单词从“struct”更改为“class”,这是我第一次看到它破坏了我的代码,链接器说它找不到那个变量在某处定义的类型。这样就不能把“struct”和“class”混在一起了吧?

【问题讨论】:

【参考方案1】:

你有时会侥幸逃脱。而你通常不会。

结构、类和命名空间相同。您绝对确实需要在前向声明时使用正确的关键字。

让我很烦恼,因为没有合法的方式来转发声明嵌套类或结构。

【讨论】:

OP没有询问命名空间,结构/类是一样的。 Visual Studio 可能不这么认为,但 C++ 标准却这么认为。而前向声明嵌套类型与structclass是否相同无关。 @NicolBolas 一些程序员似乎认为,因为他们的编译器没有将类、结构和命名空间标记为不同的类型,所以允许他们将嵌套类转发声明为命名空间中的类。他们错了,但他们认为“编译器允许它一定没问题!” @NicolBolas 即使标准声称它们是等效的,至少有一个编译器不同意,并且在我看来,在前向声明中使用错误的关键字是 只是马虎 . "一些程序员似乎认为,因为他们的编译器没有将类、结构和命名空间标记为不同的类型,所以允许他们将嵌套类转发声明为命名空间中的类.”没有程序员这么想。并且没有编译器允许您将嵌套类转发声明为命名空间中的类。再说一遍,OP 没有提到命名空间,所以我不知道你为什么要提出它们。 "即使标准声称它们是等效的,至少有一个编译器不同意" ...那又如何?这并不能使他们正确。你可以不同意偷东西是否可以,但这不会成为审判中的有效辩护。

以上是关于前向声明时“struct”和“class”关键字是不是相同? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Swift class和struct异同点

C++关键字struct

4——class和struct

class 类前向声明

循环依赖结构,使用前向声明时重新定义结构错误

两个类(C++)中的类到类转换 - 前向声明?