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

来源:互联网 发布:淘宝旺旺号怎么加好友 编辑:程序博客网 时间:2024/05/29 10:37

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里面尽可能的只用指针或者引用做声明,而不要使用实际对象,否则会产生不断的死循环,这一点,个人不是很通透,
今天写到这里,个人技术实在不好,以后要好好学习了