gpt4 book ai didi

c++ - C++ 中的循环依赖帮助

转载 作者:行者123 更新时间:2023-11-28 08:13:18 25 4
gpt4 key购买 nike

我有一个类似于下面的代码,但我不知道如何让它工作。

我已经搜索过了,看起来是关于循环依赖的,但现在,我已经尝试了一些例子,但只适用于 2 的依赖。

相反,这个,我有许多类依赖于它们的“Ctrl”类(CtrlA 和 CtrlB 相互依赖,Ax 类需要两个 Ctrl),但其中一些类也需要 Ctrl 文件( CtrlA 需要 Ax 类)。另外,我有一个继承类(A2 继承 A3)。

CtrlA.h

#ifndef CTRLA
#define CTRLA
#include "CtrlB.h"
#include "A1.h"

class CtrlB;
class A1;

class CtrlA{
protected:
A1 x;
public:
void op1(CtrlB b){
a.op1(this, b);
}
void op2(){}
};
#endif

CtrlB.h

#ifndef CTRLB
#define CTRLB
#include "CtrlA.h"

class CtrlA;

class CtrlB{
protected:
public:
void op1(){}
void op2(CtrlA a){
a.op1(this);
}
};
#endif

A1.h

#ifndef A1
#define A1
#include "CtrlA.h"
#include "CtrlB.h"
#include "A2.h"

class CtrlA;
class CtrlB;

class A1{
protected:
A2 x1;
public:
void op1(CtrlA a, CtrlB b){
x1.op1(this, b);
}
};
#endif

A2.h

#ifndef A2
#define A2
#include "CtrlA.h"
#include "CtrlB.h"
#include "A3.h"

class CtrlA;
class CtrlB;

class A2:public A3{
protected:

public:
void op1(CtrlA a, CtrlB b){
a.op2();
b.op1();
}
};
#endif

A3.h

#ifndef A3
#define A3
#include "CtrlA.h"
#include "CtrlB.h"

class CtrlA;
class CtrlB;

class A3{
protected:

public:
virtual void op1(CtrlA a, CtrlB b) = 0;
};
#endif

主要.cpp

#include "CtrlA.h"
#include "CtrlB.h"

int main(){
int i;
}

如果有人可以帮助我更正代码以使其正常工作,我将不胜感激。

最佳答案

对于 CtrlA.h、CtrlB.h、A1.h 和 A3.h,如果您使用前向声明(您有点这样做)并使用引用或指针(您没有这样做),则不需要 #include 任何内容):

CtrlA.h

#ifndef CTRLA
#define CTRLA

class CtrlB;
class A1;

class CtrlA {
protected:
A1* x;
public:
/* Use a CtrlB reference instead -- probably wanted to do this anyway
/* since you don't want to copy CtrlB when called */
void op1(CtrlB& b); /* Move function body to .cpp file */
void op2(){}
};
#endif

A1.h

#ifndef A1
#define A1

class CtrlA;
class CtrlB;
class A2; /* You have to use forward declaration on every class you use below */

class A1{
protected:
A2* x1;
public:
void op1(CtrlA& a, CtrlB& b); /* Again, use references and move function
bodies to .cpp */
};
#endif

但是对于 A2.h,您是从 A3 继承的,所以您必须#include A3.h

A2.h

#ifndef A2
#define A2
#include "A3.h"

class CtrlA;
class CtrlB;

class A2:public A3{
protected:

public:
void op1(CtrlA& a, CtrlB& b);
};
#endif

剩下的就是 main.cpp,您需要在其中包含所有内容:

main.cpp

#include "CtrlA.h"
#include "CtrlB.h"
#include "A1.h"
#include "A2.h"
#include "A3.h"

int main(){
int i;
}

希望对您有所帮助! Here is a quick reference转发声明以及何时/如何使用它。

编辑:感谢 Pablo 指出我的错误。您不能使用前向声明的类作为成员对象,只能使用引用或指针。我已经将上面的示例更改为使用指针。

关于c++ - C++ 中的循环依赖帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8453737/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com