C 为什么在类中可以使用循环依赖性,而不是命名空间或全局范围



我在文章中遇到了以下代码

struct entire_program   
{
    struct B;
    struct A
    {
        B *bbb;
        void Aa() { B bb; bb.Bb(); };
    };
    struct B
    {
        A aaa;
        void Bb() { A aa; aa.Aa(); };
    };
};

在这种情况下,为什么我允许我调用方法Bb(),但是如果将struct entire_program更改为namespace entire_program,则会生成编译器错误?

我已经阅读了这个问题,我在问什么是:是否可以调用在class/structs/unions 中尚未定义的方法对这种行为背后的动机感兴趣。

programmers.se上的相关问题(对于对文章中介绍的编码样式感兴趣的人)

这只是类和名称空间在C 中工作的方式。将整个(类成员)名称作为候选人,因为否则您将承担订购班级成员的巨大负担,并且可能无法方便地订购您的公共界面,因为示例。

另一方面的名称空间几乎与C函数完全一样,并按照源文件中列出的顺序进行顺序处理。不需要特殊功能,因为您可以始终在命名空间/全局范围调用功能之前声明您的功能。

在类和名称空间内都有可能。这只是在循环依赖情况下正确定义事物的问题。

在您的情况下,由于特殊处理中的成员功能定义,代码与struct entire_program编辑:允许它们"参见"封闭类(ES)的整个定义,无论是在当前点上方还是之下。但是他们看不到封闭名称空间的整个定义。使用名称空间,编译器只能看到当前点上方声明的内容。

类和名称空间是非常不同的事物,因此在实践中通常不会出现两者之间自由切换的问题。但是仅出于说明目的,这可以在许多情况下实现,包括您的人造示例

namespace entire_program   
{
    struct B;
    struct A
    {
        B *bbb;
        void Aa();
    };
    struct B
    {
        A aaa;
        void Bb() { A aa; aa.Aa(); }
    };
}
inline void entire_program::A::Aa()
{
  B bb; bb.Bb();
}   

我上面的实现与您的效果相同,但它不依赖于对成员功能的特殊处理。如果您需要的话,您可以在struct entire_programnamespace entire_program之间自由切换。请记住,命名空间定义在关闭}之后没有;

最新更新