将成员对象更改为指针以解决循环依赖性

Change member object to pointer to resolve circular dependency

本文关键字:解决 循环 依赖性 指针 成员对象      更新时间:2023-10-16

所以我已经搜索了一个答案,我找到了很多相关信息,但没有任何回答。

我已经看到了很多有关何时使用指针来对象说只需使用实际对象而不是尽可能使用实际对象的建议。我还看到了有关循环依赖项的建议,说在可能的情况下不包含.h文件。我已经通过将类的对象成员切换到对象来修复了很多代码(就循环依赖项而言)。我最终得到了很多指针成员,似乎与第一个建议背道而驰。

我的问题是,将所有对象成员切换到指针以解决循环依赖性是一个坏主意吗?还是这表示我的课程的不良结构,我需要重新设计?还是更准确地说,具有循环依赖性是否证明对象成员更改指针合理?还是要太具体地归结为每种情况?

如果我不是经验丰富的程序员,我深表歉意。

谢谢

我从未听说过"有很多指针是不好的,尝试使用对象" ...如果您不知道如何使用它们,则指针是"危险的"但是想想以下课程:

class myClass {
private:
  GIGANTIC_OBJECT obj;
}

如果MyClass经常被分配/交易...您是否宁愿拥有大对象或一个指针?

标题文件的圆形依赖关系是另一个问题(如果您指向对象,除非您使用不透明的指针,否设计缺陷,例如

foo.h

class foo {
public:
   bar b;
};

bar.h

class bar {
public:
   foo f;
};

以上是非法的,您可以轻松地避免使用

foo.h

class bar; // forward declaration
class foo {
   ...
   bar *b;
   ...
};

bar.h

class foo; // forward declaration
class bar {
   ...
   foo *f;
   ...
};

(https://stackoverflow.com/a/4816751/1938163)

另外: #pragma的使用一旦指令>指令可以帮助减少多份。

总结:我认为没有更多的指针或对象是一项一对一的规则,它取决于情况(例如,通过值将大对象传递到函数是愚蠢的),而标头的循环依赖性是一个相对不喜欢的问题通常应该让您认为"我是否正确设计它?/我做错了什么?"。

循环依赖性是指您的层次结构或接口设计,或者职责隔离是次优的。如果您拥有它们,那么您用什么技巧来使编译器仍在构建它们并开始使用,我个人会喜欢:

我个人会做std::shared_ptr<T*>
namespace elsewhere { class T; }
namespace here {
    class A {
        std::shared_ptr<T> _t;
    }
}

和其他地方

namespace here { class A; }
namespace elsewhere {
    class T {
        std::shared_ptr<A> _a;
    }
}

在这个主题上,循环依赖性总是像

[Apriv,Acoupled]<-->[Bcoupled, Bpriv]

通常可以轻松地转换为归一化形式

[Apriv]<--[Acoupled,Bcoupled]-->[Bpriv]