将先前作为类声明的类型向前声明为结构

forward declare a type previously declared as a class as a struct

本文关键字:声明 类型 结构      更新时间:2023-10-16

是否有兴趣将类转发为结构体,反之亦然?这似乎是完全合法的,但有些用例存在?

struct Bar;
class Foo
{
Bar * bar_;
};
class Bar
{
};

与使用相同关键字进行前向声明的用例一样,没有更多或更少的用例。这对节目的意义没有影响。类键标识符仅在定义类时起作用。

以上内容适用于符合标准的编译器。一些不兼容的可能以不同的方式处理声明,在这种情况下,,特别是使用相同的关键字。


好的,这里有一个实际的用例。假设您已经实现了一个带有struct关键字的类。随着时间的推移,这个类在多个代码库中广泛使用,并且在许多头文件中使用相同的关键字声明它。稍后,可能在添加了大量特性之后,您认为class更合适,于是您重构了代码。现在,重构所有不相关的依赖代码库来使用new关键字是没有意义的。

struct Bar;
class Bar;

这两个是等价的,没有关系

但是存在一些用例?

没有特殊的IIRC.

从语言的角度来看,将class前声明为structclass没有区别。

class Foo;
struct Foo;
class Bar;
struct Bar;
class Foo{}; // 100% ok
struct Bar{}; // 100% ok
不幸的是,有些编译器对这些关键字的处理方式不同。正如这里所描述的,当您依赖于名称混淆相同时,这可能会很糟糕。

考虑:

// process.h
struct Foo;
void processIfNotNull(Foo*);
// foo.h
class Foo{};

如果你在你的共享库中导出这样的函数,你的用户将不能调用processIfNotNull,除非他们有Foo的定义。

这没用。

在c++中,结构体和类的区别在于,for结构体成员默认是public的。

考虑到这一点,在您的示例中,它可能会混淆代码读者,以确定您的类将作为结构体还是类。

你可以阅读这篇文章了解更多信息:在c++中什么时候应该使用类而不是结构体?