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 文件,情况也是如此。
我有以下代码:
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 文件,情况也是如此。