forward将先前声明为类的类型声明为结构

时间:2016-10-20 07:53:58

标签: c++

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

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

class Bar
{

};

4 个答案:

答案 0 :(得分:3)

没有比使用相同关键字的前向声明用例更多或更少的用例。它对程序的含义没有任何影响。 类 - 密钥标识符仅在定义类时有所不同。

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

好的,这是一个实际的用例。我们假设您已使用struct关键字实施了一个类。随着时间的推移,该类被广泛用于多个代码库,并使用相同的关键字在许多标头中声明。稍后,也许在添加了大量功能之后,您决定class更合适并重构代码。现在,重构所有不相关的依赖代码库以使用new关键字是没有意义的。

答案 1 :(得分:2)

struct Bar;
class Bar;

这些是等价的,没关系。

  

但是存在一些用例?

没有特别的IIRC。

答案 2 :(得分:1)

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

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++?