如何隐藏class的类型和结构

registercsdn 2018-01-20 09:18:14
in bird.h
 class Bird{
public:
int a;
void eat(int m, int n);
}


in main.cpp
#include"bird.h"
int update(Bird *b){
int i = 5;
int j = 6;

b.eat(i, j);

return 0;
}


int main(void){
Bird *bbb = new Bird();
update(bbb);

delete bbb;
return 0;
}


上面代码是原始程序的简化版,有bird.h, main.cpp(原始程序还有很多,这里只是为了简化说明保留2个). 现在我需要把除main.cpp外所有的东西打包成一个lib给别人, 主要问题是 我需要隐藏bird.h的class bird{}的结构,不希望用户知道它的结构, 但是这个class bird{}在main函数中被调用了,我如何才能隐藏这个class bird的结构, 现在是bird.h最后不要改,但是main可以改,也可以增加cpp 和h,如何解决? extern可以帮助吗?
...全文
795 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
百合杰 2018-01-24
  • 打赏
  • 举报
回复
引用 14 楼 zilaishuichina 的回复:
lz为什么要隐藏bird的结构呢?或者说就算别人知道你的结构,会对你造成什么影响呢?
赞成 只要成员私有 开放接口 这是通常的做法
Acuity. 2018-01-22
  • 打赏
  • 举报
回复
这个总得知道参数类型吧,总感觉有点不太对劲。
AlbertS 2018-01-22
  • 打赏
  • 举报
回复
引用 5 楼 qq_31709097 的回复:
不太懂你什么意思 要不在头文件里写个接口类,作为基类 把你想要提供的功能写成纯虚函数,在派生类里实现,派生类放在cpp中 然后再给出Create方法,在cpp里new,返回基类指针
赞成这种做法,不知道能不能满足你的要求?
zilaishuichina 2018-01-22
  • 打赏
  • 举报
回复
lz为什么要隐藏bird的结构呢?或者说就算别人知道你的结构,会对你造成什么影响呢?
「已注销」 2018-01-22
  • 打赏
  • 举报
回复
只暴露函数(方法)即可:
class Bird {
public:
	void eat(int, int);
}
无需暴露成员,不影响调用。
Saleayas 2018-01-21
  • 打赏
  • 举报
回复
这是最基本的,使用接口,接口仅仅是协议而已。
幻夢之葉 2018-01-21
  • 打赏
  • 举报
回复
除了接口,还有一种方式: class BirdData; class Bird{ public: BirdData *m_pData; void eat(int m, int n); } 在实现文件里面定义BirdData类 Bird的构造函数new BirdData,析构delete BirdData,完全隐藏了具体数据的类型。
paschen 版主 2018-01-21
  • 打赏
  • 举报
回复
引用 2 楼 registercsdn 的回复:
引用 1 楼 paschen 的回复:
你将Bird编译成一个静态lib文件就不需要提供cpp文件了,相当于隐藏了实现,但头文件也需要的,因为他需要知道你函数的名字、调用方式、参数等才知如何使用
对方也需要调用class Bird{}, 这样的话我需要给头文件。 但现在我是想隐藏class Bird 的结构,给了头文件相当于暴露了bird的结构
没懂你说的结构是什么意思,如果是不想让看到私有成员,你可以再对这些成员封装一下,在CPP文件内部实现
狐狸小十 2018-01-20
  • 打赏
  • 举报
回复
不太懂你什么意思 要不在头文件里写个接口类,作为基类 把你想要提供的功能写成纯虚函数,在派生类里实现,派生类放在cpp中 然后再给出Create方法,在cpp里new,返回基类指针
赵4老师 2018-01-20
  • 打赏
  • 举报
回复
提醒:现在是开源时代!
真相重于对错 2018-01-20
  • 打赏
  • 举报
回复
使用接口,而不是直接爆露class
registercsdn 2018-01-20
  • 打赏
  • 举报
回复
引用 1 楼 paschen 的回复:
你将Bird编译成一个静态lib文件就不需要提供cpp文件了,相当于隐藏了实现,但头文件也需要的,因为他需要知道你函数的名字、调用方式、参数等才知如何使用
对方也需要调用class Bird{}, 这样的话我需要给头文件。 但现在我是想隐藏class Bird 的结构,给了头文件相当于暴露了bird的结构
paschen 版主 2018-01-20
  • 打赏
  • 举报
回复
你将Bird编译成一个静态lib文件就不需要提供cpp文件了,相当于隐藏了实现,但头文件也需要的,因为他需要知道你函数的名字、调用方式、参数等才知如何使用
sdghchj 2018-01-20
  • 打赏
  • 举报
回复

class IBird{
   public:
        virtual void eat(int m, int n) = 0;
}

class Bird:public IBird
{
   public:
        int a;
        override void eat(int m, int n){ 
       
         }
}

CT8100 2018-01-20
  • 打赏
  • 举报
回复
GetIDsOfNames与Invoke的使用这种方式抛出来接口?

64,636

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧