初学C++,在类实例化和调用的过程中遇到了不少麻烦,总结一下。
多个类文件互相实例化调用
预想的效果是,在test.cpp文件的main函数里面可以分别实例化A类和B类,并调用A/B类里面的函数,且在A和B类里面可以互相实例化及调用B和A类的函数。
分析上述的需求,在C/C++中如果需要调用其他文件的方法及在类里面实例化对方,那么就需要引入头文件的使用,每一个文件都有自己的.h文件,在里面声明函数或者定义的参数字段。
最终文件需要有A类,A.cpp及头文件A.h;B类,B.cpp及头文件B.h,主函数文件test.cpp。
通过引入.h头文件,在头文件里面声明类及类里面的函数,来实现效果。
下面就是具体实现代码。
在头文件里面定义class A
A.h
#ifndef _A_H_
#define _A_H_
/*定义A类*/
class A
{
public:
A();//无参构造函数
A(string name);//有参构造函数
~A();//析构函数
string name;//字段
void a_say(string str);
void ab_say(string str);
private:
};
#endif/*include _A_H_*/
定义A.cpp类文件
#include "A.h"
#include "B.h"
A::A()
{
cout <<"A 初始化"<<endl;
A::name="A";
}
A::A(string name)
{
cout<<"重载 "<<" A 初始化"<<endl;
A::name=name;
}
A::~A()
{
}
void A::a_say(string str)
{
cout<<A::name<<" say "<<str<<endl;
}
void A::ab_say(string str)
{
B b;//在A中实例化B
b.b_say(str);
}
定义B类
B.h
#ifndef _B_H_
#define _B_H_
/*定义B类*/
class B
{
public:
B();
~B();
string name;
void b_say(string str);
void ba_say(string str);
private:
};
#endif/*include B.h */
B.cpp
#include "B.h"
#include "A.h"
B::B()
{
cout<<"B 初始化 "<<endl;
B::name="B";
}
B::~B()
{
}
void B::b_say(string str){
cout<<B::name<<" say "<<str<<endl;
}
void B::ba_say(string str)
{
A a;//在B中实例化A
a.a_say(str);
}
定义main函数
#include "A.h"
#include "B.h"
int _tmain(int argc, _TCHAR* argv[])
{
A a;
a.a_say("a hello");
a.ab_say("a hello ");
A *la=new A("李四");//指针调用,重载
la->a_say("a hello");
//实例化B
B b;
b.b_say("b hello");
b.ba_say("b hello");
getchar();
return 0;
}
实际运行效果如下
A 初始化
A say a hello
B 初始化
B say a hello
重载 A 初始化
李四 say a hello
B 初始化
B say b hello
A 初始化
A say b hello