将先前作为类声明的类型向前声明为结构
forward declare a type previously declared as a class as a struct
是否有兴趣将类转发为结构体,反之亦然?这似乎是完全合法的,但有些用例存在?
struct Bar;
class Foo
{
Bar * bar_;
};
class Bar
{
};
与使用相同关键字进行前向声明的用例一样,没有更多或更少的用例。这对节目的意义没有影响。类键标识符仅在定义类时起作用。
以上内容适用于符合标准的编译器。一些不兼容的可能以不同的方式处理声明,在这种情况下,是,特别是使用相同的关键字。
好的,这里有一个实际的用例。假设您已经实现了一个带有struct
关键字的类。随着时间的推移,这个类在多个代码库中广泛使用,并且在许多头文件中使用相同的关键字声明它。稍后,可能在添加了大量特性之后,您认为class
更合适,于是您重构了代码。现在,重构所有不相关的依赖代码库来使用new关键字是没有意义的。
struct Bar;
class Bar;
这两个是等价的,没有关系
但是存在一些用例?
没有特殊的IIRC.
从语言的角度来看,将class
前声明为struct
或class
没有区别。
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++中什么时候应该使用类而不是结构体?
相关文章:
- std::enable_if 更改成员 *变量* 声明/类型
- 对前向声明类型进行unique_ptr的解决方法
- 如何将声明类型作为参数发送
- 在 Fortran 中泛化特定声明类型的操作
- 使用 (c++11) 声明类型时放置 __declspec(dllimport) 关键字的位置
- 模板函数可以使用带有删除的构造函数的声明类型
- 声明类型没有任何可变类型
- 如何使用声明类型简化此代码
- 使用声明类型选择函数专业化
- 替代班级内声明类型的别名
- 对于自动键入推论的参数,声明类型(自动)应推导的内容
- 使用 decltype 的条件声明类型
- 您如何声明类型结构的堆栈?在C 中
- 将指向前向声明类型的指针推送到 typedef'd 向量时出现编译器错误
- 声明适用于 auto,但不能显式声明类型?
- 声明类型包含未展开的参数包'Args'
- 课堂上的Typedef.在另一个类错误中:尚未声明类型
- 冲突的声明类型/价值不匹配
- 获取具有AST访问者clang的功能声明类型
- 变量声明类型定义 C 中的约定