您的位置:首页 > 编程语言 > C语言/C++

C++细节问题1-类的相互调用

2017-10-31 21:57 169 查看
c++中类的相互调用问题

相信大家已经在其他地方看过类的相互调用问题了,本篇要说的是,三个类,情况是这样的,state类调用parse类,factory调用parse类和state类,而parse类使用了state和factory类型,此时出现了编译不通的问题,

1.首先是state.h

class Parser;

class State

{

public:

State(Parser* parse) { m_parse = parse; }

virtual ~State() {}

virtual int parse(string& str) { return 0; }

protected:

Parser* m_parse;

};

“`

2.factory.h

include “State.h”

class Parser;

class Factory

{

private:

Parser* m_parse;

public:

Factory(Parser* parse);

~Factory();

void release();

State* getState();

};

3 parse.h

include “State.h”

include “Factory.h”

class Parser

{

public:

Parser();

~Parser();

void setState();

int parse(string str);

protected:

Factory* m_factory;

State* m_state;

};

这是正确的操作方式,如果factory.h里面引用了parse.h,那么错误会提示是parse.h里面的factory无法辨识类型,错误提示在parse.h,但parse.h不需要修改,这个情况需要的是在factory里面去掉parse.h头文件,然后声明class parse,

这里重要的总结:1 网上有多个方式,包括互相声明类,不互相使用头文件,头文件放到.cpp去导入,但现在普遍做法是单向引用,然后在被引入者声明这个类,如例子里面state.h被parse.h导入进去,但state要使用parse类,就要在自己声明class parse,所以头文件只能单向引用,只会编译一次,不能重复编译,或者可以认为在编译state.h时还没有编译parse.h所以不认识parse类是个什么东西,(这个说法有人称为超前引用),(factory导入parse.h报错,实际是factory.h先编译,此时编译器会逐行执行,首先看到parse.h,此时factory.h还没有factory类,但是parse.h里面调用了factory类,所以这个时候报错的地方并不是factory.h而是parse.h,说factory类型没有定义,这是个人看法)

2,类在声明之后就可以使用了,但是只能使用引用或者指针,如state声明了parse类,但在.h里面只能使用parse类的指针或者引用,不能调用内部函数,如果要用函数,需要在state.cpp里面导入parse.h.尤其是有析构函数的时候,要注意在.cpp里面调用析构函数

3 ,尽可能的在.cpp里面导入头文件使用,这是来自很多文章的说法,

4,关于互相调用导致的错误,

在构造自己的类时,有可能会碰到两个类之间的相互引用问题,例如:定义了类A类B,A中使用了B定义的类型,B中也使用了A定义的类型

class A

{

int i;

B b;

}

class B

{

int i;

A* a;

}

请注意上面的定义内容,一般情况下是不能出现类A,类B相互引用都定义对象,即如下的样子:

class A

{

int i;

B b;

}

class B

{

int i;

A a;

}

在这种情况下,想想能够有a.b.a.b.a.b.a.b.a.b…………,很有点子子孙孙无穷尽之状,那么我的机器也无法承受。最主要的还是这种关系很难存在,也很难管理。这种定义方式类同程式中的死循环。所以,一般来说,两者的定义,至少有一方是使用指针,或两者都使用指针,但是决不能两者都定义实体对象。

这个在直接使用对象的时候,的确可能会造成不断的产生对象,这一点实际是否会产生,想不通,这一点从别的地方抄过来的,这个主要是说.h里面尽可能的只用指针或者引用做声明,而不要使用实际对象,否则会产生不断的死循环,这一点,个人不是很通透,

今天写到这里,个人技术实在不好,以后要好好学习了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++