关于消除两个类循环依赖的问题

weichen2005 2009-02-17 05:14:00
两个类循环依赖的问题:比如一个group类,一个person类
一个person要划分到一个group里,同时,为了快速找到某个person所属的group,又需要
person类中保存group类的指针:


class group {
public:
int AddPerson(person* p);
list<person*> m_ps;
};

class person } {
public:
int FindGroup();
group* m_mygroup;
};


请问大家,这样的循环依赖情况如何消除呢???
...全文
706 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
ViCross 2009-02-19
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 hemiya 的回复:]

也有变通的方法,用模板,不过有局限性。
[/Quote]
模版也得符合C++语法...这个也是行不通.
本身就是编译死循环.

iory_526 2009-02-18
  • 打赏
  • 举报
回复
如果假设,我说假设是这样的呢:


class group{
public:
person p;
};

class person{
public:
group g;
};


不是指针,而是值包含,如果处理循环依赖?我听说过3种方法:
升级,降级, 友元, 但没有见过实例,忘各位大虾指点。
疯哥哥 2009-02-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 racket2008 的回复:]
不用那么复杂,用个前向申明就行了:

C/C++ code

class person;

class group{
public:
int AddPerson(person* p);
list<person*> m_ps;
};

class person{
public:
int FindGroup();
group* m_mygroup;
};
[/Quote]

up up ~
疯哥哥 2009-02-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 racket2008 的回复:]
不用那么复杂,用个前向申明就行了:

C/C++ code

class person;

class group{
public:
int AddPerson(person* p);
list<person*> m_ps;
};

class person{
public:
int FindGroup();
group* m_mygroup;
};
[/Quote]

up up ~
hemiya 2009-02-18
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 iory_526 的回复:]
如果假设,我说假设是这样的呢:


C/C++ code
class group{
public:
person p;
};

class person{
public:
group g;
};



不是指针,而是值包含,如果处理循环依赖?我听说过3种方法:
升级,降级, 友元, 但没有见过实例,忘各位大虾指点。
[/Quote]

也有变通的方法,用模板,不过有局限性。


template <typename _T>
class group{
public:
_T p;
};

class person{
public:
group<person> g;
};
捕鲸叉 2009-02-18
  • 打赏
  • 举报
回复
class Group
{
public:
Group(){m_person.m_pParent = this;}
Person m_person;
}

class Person
{
public:
Group* m_pParent
}
iory_526 2009-02-18
  • 打赏
  • 举报
回复
呵呵。
iambic 2009-02-18
  • 打赏
  • 举报
回复
你自己再想想吧。难道A和B有点关系,就要把B作为A的一个成员?共用基类的方法更是扯。
iory_526 2009-02-18
  • 打赏
  • 举报
回复
我知道代码这么写是错的,也知道这在设计上也是有问题的,需要重构,所以我说假设。
只是想了解一下大家遇到这样的情况会如何处理?

跟我想不想写程序没关系。
ViCross 2009-02-18
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 iory_526 的回复:]
如果假设,我说假设是这样的呢:


C/C++ code
class group{
public:
person p;
};

class person{
public:
group g;
};



不是指针,而是值包含,如果处理循环依赖?我听说过3种方法:
升级,降级, 友元, 但没有见过实例,忘各位大虾指点。
[/Quote]

兄台, C++层面上的多态已经不能支持你这种假设了...
如果你是个想写程序的人..请注意你的假设.
huiguniang1224 2009-02-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 racket2008 的回复:]
不用那么复杂,用个前向申明就行了:

C/C++ code

class person;

class group{
public:
int AddPerson(person* p);
list<person*> m_ps;
};

class person{
public:
int FindGroup();
group* m_mygroup;
};
[/Quote]



up~~
racket2008 2009-02-17
  • 打赏
  • 举报
回复
不用那么复杂,用个前向申明就行了:


class person;

class group{
public:
int AddPerson(person* p);
list<person*> m_ps;
};

class person{
public:
int FindGroup();
group* m_mygroup;
};
waizqfor 2009-02-17
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lightnut 的回复:]
C/C++ code
class Groupable
{
public:
virtual void Add(Groupable* a)=0;
Groupable* my_group;
};

class Person:public Groupable
{
public:
void Add(Groupable* a){
// do nothing
}
};

class Group:public Groupable
{
public:
void Add(Groupable* a) {
a->my_group = this;
persons.push_back(a);
}

std::list<Groupable*> persons;
};
[/Quote]
UP 直接这定义成 就解决了
lightnut 2009-02-17
  • 打赏
  • 举报
回复

class Groupable
{
public:
virtual void Add(Groupable* a)=0;
Groupable* my_group;
};

class Person:public Groupable
{
public:
void Add(Groupable* a){
// do nothing
}
};

class Group:public Groupable
{
public:
void Add(Groupable* a) {
a->my_group = this;
persons.push_back(a);
}

std::list<Groupable*> persons;
};

Dinelgua 2009-02-17
  • 打赏
  • 举报
回复
抛开语言层面
楼住提到的要求中涉及到的组和人本身在概念上就是互相依赖的

所以解决起来也与语言无关

想办法在概念上将互相依赖改为单向依赖 或者互不依赖

方法1 互不依赖
这需要设计第三方概念 譬如引入table类 记录 group与persion对应关系需要时查表,概念相互依赖解决了 但效率差 需要遍历表

方法2 单向依赖
group不管注自身下挂那些persion 需要查询挂多少persion时 便利所有persion统计
如果 获取group下挂人员信息的动作不频繁,使用此方法正好
如果去persion 的group不频繁 就反过来搞

都不是太妥善的办法 根据实际需要调整吧
希望对楼住有用
weichen2005 2009-02-17
  • 打赏
  • 举报
回复
楼上的兄弟,能否用这两个类具体说明说明?
sagegz 2009-02-17
  • 打赏
  • 举报
回复
构造一个抽象基类.使用OOP进行编程.

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧