C++:静态成员的循环依赖

C++: Circular dependency with static members

我有以下代码:

class B;

class A {
public:
    static int somethingStatic;

    int func() {
        return B::somethingStatic;
    }
};

class B {
public:
    static int somethingStatic;

    int func() {
        return A::somethingStatic;
    }
};

构建失败,因为 B 未定义。
那我该如何解决呢?

将成员函数的定义移出class 声明:

// declarations go into a header file
class A {
public:
    static int somethingStatic;
    int func();
};

class B {
public:
    static int somethingStatic;
    int func();
};

// definitions go into a cpp file
int A::func() {
    return B::somethingStatic;
}

int B::func() {
    return A::somethingStatic;
}

// don't forget to define static member variables:
int A::somethingStatic;
int B::somethingStatic;

分离声明和定义应该是您的“默认操作模式”,因为从 header 中删除实现会使您的代码更易于浏览。

您不能 定义 A::func() 在至少声明 B 之前引用 B 的成员。B 的前向声明只是说 class 调用B 将存在,与 B 的成员无关。但是,您可以 声明 A::func().

执行此操作的一种方法是典型的 .h 文件/.cpp 文件组合。如果出于某种原因你想要所有的 A 和 B -- 声明和定义 -- 在一个文件中,可以按如下方式完成:

class A {
public:
    static int somethingStatic;

    int func();
};

class B {
public:
    static int somethingStatic;

    int func() {
        return A::somethingStatic;
    }
};

int A::func() {
    return B::somethingStatic;
}

int A::somethingStatic = 42;
int B::somethingStatic = 5;

请注意,在这种情况下甚至不再需要转发声明 B,因为 A 的声明根本不依赖于 B。如果将两者的定义分解为单独的 .cpp 文件,情况也是如此。