gpt4 book ai didi

c++ - 为什么我在这里遭受循环依赖?

转载 作者:行者123 更新时间:2023-11-28 05:23:33 25 4
gpt4 key购买 nike

实用工具.h

#ifndef _UTILITIES_
#define _UTILITIES_

#include "MyFirstCairoPlugin.h"

class PLUG_CLASS_NAME;

class Utilities
{
private:
PLUG_CLASS_NAME *pPlug;

public:
Utilities(PLUG_CLASS_NAME *plug);
~Utilities();
};

#endif // !_UTILITIES_

实用程序.cpp

#include "Utilities.h"

Utilities::Utilities(PLUG_CLASS_NAME *plug) : pPlug(plug) {
IColor color = IColor(100, 100, 100, 255);
}
Utilities::~Utilities() {

}

这就是我遇到麻烦的地方,使用 MyFirstCairoPlugin.h 中的这个类:

#ifndef _MYFIRSTCAIROPLUGIN_
#define _MYFIRSTCAIROPLUGIN_

#include "IPlug_include_in_plug_hdr.h"
#include "resource.h"

#include "Utilities.h"

//class Utilities;

class MyFirstCairoPlugin : public IPlug
{
private:

public:
Utilities *pUtilities;

MyFirstCairoPlugin(IPlugInstanceInfo instanceInfo);
~MyFirstCairoPlugin();
};

#endif // !_MYFIRSTCAIROPLUGIN_

如果我不取消注释 //class Utilities;(前向声明),它就不能使用 Utilities(即使我在上面用 #包括“Utilities.h”)。它给了我“典型的”循环依赖错误`:

syntax error: missing ';' before '*' (compiling source file ..\..\..\IPlug_AddOns\Utilities.cpp)

我哪里错了?

最佳答案

Utilities.h包含了MyFirstCairoPlugin.h,MyFirstCairoPlugin.h包含了Utilities.h,也就是一个圆,逻辑上产生了圆依赖。

这是你应该做的:

如果一个类在声明中需要另一个类的权利,或者如果它显然是声明中最重要的部分,请包含它。示例:“图像”类可能包含“颜色”类如果一个类在某种程度上使用另一个类,比如将它存储在一个指针中或在某些方法的调用中使用它,请使用前向声明。如果它根本不需要其他类,那么它也不需要。对于第二种情况,实现文件将包含依赖类。

在您的例子中,MyFirstCairoPlugin 存储了一个指向 Utilities 的指针,因此它应该做一个 Utilities 的前向声明,但不包括它。顺便说一句,该指针不应公开。

它应该是这样的:

#ifndef _MYFIRSTCAIROPLUGIN_
#define _MYFIRSTCAIROPLUGIN_

#include "IPlug_include_in_plug_hdr.h" //<--- no idea what that is about
#include "resource.h"

class Utilities;

class MyFirstCairoPlugin : public IPlug
{
private:

public:
Utilities* pUtilities; //<-- shouldn't be public, you should always use encapsulation
...

另一方面,实用程序甚至不使用 MyFirstCairoPlugin,所以我们这里有第三个案例。为什么首先要让它包含 MyFirstCairoPlugin?如果那个宏可能是 MyFirstCairoPlugin,那么没问题,它已经有一个前向声明。不过,不会通过宏来做到这一点。而是将 Utilities 作为模板类。顺便说一句,“Utilities”是一个相当宽泛的名称,听起来很容易导致名称冲突。

可能看起来像这样:

#ifndef _UTILITIES_
#define _UTILITIES_

template<class T>
class Utilities
{
private:
T* pPlug;

public:
Utilities(T* plug);
...

编辑:您似乎对模板不满意,这是另一种可能性:

创建一个抽象类(/接口(interface)),MyFirstCairoPlugin 将成为其子类,提供实用程序实现所需的所有方法。假设它被称为“插件”。看起来你已经有了这样的类,但由于我不知道 IPlug 是什么,所以我用了另一个名字。

围绕插件而不是 MyFirstCairoPlugin 或 PLUG_CLASS_NAME 构建实用程序。然后简单地为它提供一个 MyFirstCairoPlugin 的实例,然后它就是一个有效的插件实例。只要 Plugin 的方法是抽象和虚拟的,调用 Plugin 指针上的方法就会调用 MyFirstCairoPlugin 的方法,大家都很高兴。

关于c++ - 为什么我在这里遭受循环依赖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40991478/

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