是否有兴趣将类转发为结构,反之亦然? 它似乎是完全合法的,但是存在一些用例?
struct Bar;
class Foo
{
Bar * bar_;
};
class Bar
{
};
答案 0 :(得分:3)
没有比使用相同关键字的前向声明用例更多或更少的用例。它对程序的含义没有任何影响。 类 - 密钥标识符仅在定义类时有所不同。
以上内容适用于标准兼容编译器。一些不合规的可能会以不同方式处理声明,在这种情况下 特别是使用相同关键字的情况。
好的,这是一个实际的用例。我们假设您已使用struct
关键字实施了一个类。随着时间的推移,该类被广泛用于多个代码库,并使用相同的关键字在许多标头中声明。稍后,也许在添加了大量功能之后,您决定class
更合适并重构代码。现在,重构所有不相关的依赖代码库以使用new关键字是没有意义的。
答案 1 :(得分:2)
struct Bar;
class Bar;
这些是等价的,没关系。
但是存在一些用例?
没有特别的IIRC。
答案 2 :(得分:1)
从语言的角度来看,将class
作为struct
或class
向前声明之间没有区别。
class Foo;
struct Foo;
class Bar;
struct Bar;
class Foo{}; // 100% ok
struct Bar{}; // 100% ok
不幸的是,some compilers以不同的方式破坏了这些关键字。正如here所描述的那样,当你依赖于名称修改是相同的时候,这可能是令人讨厌的。
考虑:
// process.h
struct Foo;
void processIfNotNull(Foo*);
// foo.h
class Foo{};
如果您在共享库中导出此类功能,则除非processIfNotNull
定义为Foo
,否则您的用户将无法拨打select
I.subject1, R.subject2
from
dbo.invoice I
left join
dbo.repayments R on I.subject1 = R.subject2
where
case
when R.subject2 is not null and R.remains_due > 0
then R.remains_due
when R.subject2 is not null and R.remains_due = 0
then I.remains_due
when R.subject2 is not null and R.due_date <= GETDATE()
then R.due_date
when R.subject2 is null and I.due_date <= GETDATE()
then I.due_date
end
。
答案 3 :(得分:0)
没用。
在C ++中,struct和class之间的区别在于结构成员默认是公共的。
考虑到这一点,在您的示例中,它可能会混淆代码阅读器以确定您的类是否将作为结构或类行为。
您可以阅读此帖子以获取更多信息:When should you use a class vs a struct in C++?