类或许结构的定义一定要放在头文件中

类或者结构的定义一定要放在头文件中?

// mesh.h
class mesh;

void print_mesh(const mesh& a_mesh);

// mesh.cpp
#include "mesh.h"
#include <iostream>

class mesh
{
public:
int a;
};

void print_mesh(const mesh& a_mesh)
{
std::cout << a_mesh.a << std::endl;
}

// main.cpp
#include "mesh.h"

int main()
{
mesh a_mesh;
a_mesh.a = 5;

print_mesh(a_mesh);

return 0;
}

// class mesh在mesh.h中已经声明,但使用g++编译时,错误提示aggregate ‘mesh a_mesh’ has incomplete type and cannot be defined
// class mesh的定义放在mesh.cpp中,编译运行成功
// 结构体、类的定义必须放在头文件中吗?这样不就把类给暴露了?

------解决思路----------------------
一般类或者结构体的声明放在头文件中,把定义实现放在源文件中。
这个不是一定的,这是这样的文件结构便于你维护代码。如果你的程序出错了或者有什么功能需要添加修改之类的,发现main函数好长好长,要找修改的地方确实不容易。
如果程序本来就不长,就是个测试用的小程序,方便一些放在一起也是可以的。
------解决思路----------------------
一个类或结构不一定只在一个.c/.cpp文件中用到,所以要把定义抽到头文件中,这样只需要定义一份,在各个源文件中都可以使用。
如果这个类定义只在一个.cpp文件中使用,而且你也不想让其他人使用这个定义,那么可以把它放在.cpp内。
------解决思路----------------------
类型定义是一种声明
也可以定义在函数内部呀

这里其实是习惯用法(代码规范,其实就是一种自觉遵守的习惯用法)
和C,C++语言的标准,实现的区别
标准和实现都允许的,实际上并不是都常用的。
常用的只有某些方式,因为那些方式,在大多数时候更合适。
允许的则有有很多,可能很多人,从来都不那样用。

------解决思路----------------------
引用:
Quote: 引用:

不清楚你说的暴露是什么意思,你是指把a声明为public,所以外界可以肆无忌惮的访问?
那你就应该把a声明为private,写成员函数给a赋值,把print_mesh写为mesh的成员函数。


我说的暴露是:一看程序的头文件,不就知道类的基本结构,进而猜出是实现了?
源代码只会给开发或者维护的程序员看,在客户这边呈现的是编译好的东西,你把头文件类的结构隐藏了,有什么意义?
------解决思路----------------------
放在头文件里的, 拿到 .h .lib(.a)  等等就可以用了

放在 .cpp 中的 结构,类定义
只有拿到.cpp 源代码才可以用.

.cpp 通常没必要公开,
只需要公开.h 就可以了 

静态库 .lib(.a) 是连接时候用的 ,
如果需要的话,还必须提供相应的动态库 .dll (.so)