V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
1YsX1
V2EX  ›  问与答

如何解决 C++两个类需要互相引用的场景?

  •  
  •   1YsX1 · 2020-09-10 14:47:24 +08:00 · 1479 次点击
    这是一个创建于 1533 天前的主题,其中的信息可能已经有所发展或是发生改变。

    两个头文件如果需要相互引用的话,编译的过程中存在一些问题。 然后 google 有一些简单的方法比如不引用只声明,也是可以过编译的,但是涉及到成员函数调用的时候有时还是会有问题。 我觉得这是一种治标不治本的方法,所以想知道比如对于我下面的这个场景,能不能从设计模式的角度,有更好的设计方法吗?

    比如现在需要用 Tree 结构来存储 Frame 节点,同时 Frame 节点内需要了解当前树结构的信息,比如我在树结构内定义了每一个 Frame 节点的长度,所以我需要 Tree->GetLength(Frame*) 来获取。所以这两个 class 我认为需要包含这几个函数的

    class Frame{
    	int Id;
        char * data;
        Tree* MyTree;
        Frame(MyTree* T){
        	data = new char(T->GetLength(Id));
        }
    }
    
    class Tree{
    	unordered_map<int,int> FrameSize;
        vector<Frame*> Nodes;
        Tree(){
        	Nodes.push_back(new Frame(this));
            ...
            Nodes.push_back(new Frame(this));
        }
    	int GetLength (int Id){
    		return FrameSize[Id];
    	}
    }
    

    上面这段代码可能有一些语法上是不通的,但是我想实现的基本函数的思路体现出来了。我觉得这种设计模式存在问题,请问有没有更好的模式或者说对这个问题的解决办法?谢谢!

    8 条回复    2020-09-10 23:46:53 +08:00
    yuzhibopro
        1
    yuzhibopro  
       2020-09-10 15:08:10 +08:00
    1. 友元类 2.互传指针,共有函数访问,不知道能不能解决你说的
    hazardous
        2
    hazardous  
       2020-09-10 15:41:02 +08:00
    你的需求是函数实现必须写在头文件里么?如果不用那就把函数实现挪到 cpp 里然后在双方头文件里都前置声明对方不就可以了。
    1YsX1
        3
    1YsX1  
    OP
       2020-09-10 15:57:11 +08:00
    @yuzhibopro 谢谢,互传指针还是需要引用头文件。我尝试一下友元类的方法
    1YsX1
        4
    1YsX1  
    OP
       2020-09-10 15:58:01 +08:00
    @hazardous 谢谢~我认为是的,因为这两个类也不只是互相用一下就结束了,还得对外提供接口的。所以要写头文件以方便另外的类再来使用。
    wutiantong
        5
    wutiantong  
       2020-09-10 15:59:18 +08:00
    这两个玩意本来就应该放在一起,同一个头文件里,Frame 强烈倾向于做成 Tree 的 inner class
    cjw6
        6
    cjw6  
       2020-09-10 16:00:18 +08:00
    class A;
    calss B{
    ..............
    private:
    A a;
    };
    class A{
    ..........
    }

    前向声明注意互相引用用 shared_ptr 的情况
    GeruzoniAnsasu
        7
    GeruzoniAnsasu  
       2020-09-10 16:01:09 +08:00
    Tree->GetLength(Frame*) ??

    为什么不能是 Tree->Frame->GetLength ?

    为什么 Frame 要知道 Tree 结构的信息?
    afx
        8
    afx  
       2020-09-10 23:46:53 +08:00
    @1YsX1 人家是让你函数的声明和定义分开,不要都写在头文件里,而不是不要头文件。声明在头文件,实现写在.cpp 文件就可以解决这个问题
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   960 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 21:22 · PVG 05:22 · LAX 13:22 · JFK 16:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.