共5个文件,分别是x.h,x.cpp,y.h,y.cpp,1.cpp(main函数所在文件):
主要针对《C语言接口与实现》书中大量的定义:typedef struct T *T方式的解释,都放在源文件中说明:
x.h:
#ifndef __X_H__
#define __X_H__
//
// 下面这种定义方式覆盖了《C语言接口与设计》中大部分数据结构的定义(除【Text_T】之外),
// 在C语言中可以:typedef struct MY_X MY_X,即书中大量的使用typedef struct T *T 方式,
// 但在C++不可以,指针与值类型定义区分开来,是好事
//
// 【MY_X】数据结构的真正定义在cpp文件中,所以,除去cpp实现文件中,可以访问
// 【MY_X】的成员,其他地方都不要访问其成员!!
//
// 这种接口方式隐藏了【MY_X】内部成员的细节,即不能直接访问其成员,而是用函数接口的方式,
// 【MY_X】的内部成员,只能在cpp实现文件中访问!!
typedef struct MY_X *PMY_X; //若是C语言,就可以typedef struct MY_X *MY_X,但C++不行
int Fx1(PMY_X t); //求和
PMY_X Fx2(int x, int y); //赋值,有点像“构造函数”
#endif
x.cpp:
#include "x.h"
#include <stdlib.h>
//真正的数据结构定义在这里:
struct MY_X
{
int x;
int y;
};
int Fx1(PMY_X t)
{
return t->x + t->y;
}
PMY_X Fx2(int x, int y)
{
PMY_X t = (PMY_X)malloc(sizeof(*t));
t->x = x;
t->y = y;
return t;
}
y.h:
#ifndef __Y_H__
#define __Y_H__
//
// 下面就是正常的定义方式(一般的把数据结构定义放在头文件中),
// 在《C语言接口与设计》中,只有Text_T类型是这种方式定义的
//
//
typedef struct
{
int x;
int y;
}MY_Y;
int Fy1(MY_Y t);
MY_Y Fy2(int x, int y);
#endif
y.cpp:
#include "y.h"
#include <stdlib.h>
int Fy1(MY_Y t)
{
return t.x + t.y;
}
MY_Y Fy2(int x, int y)
{
MY_Y t;
t.x = x;
t.y = y;
return t;
}
1.cpp:
#include "stdio.h"
#include "x.h"
#include "y.h"
#include <stdlib.h>
void main()
{
PMY_X m = Fx2(12, 34);
printf("%d\n", Fx1(m));
MY_Y y = Fy2(12, 88);
printf("%d\n", Fy1(y));
}