如何隐藏类声明?

GKatHere 2017-02-04 11:18:49
如题:如何隐藏类声明?
以例:

// 以string来说明:
// 此时,我只希望客户使用string来构建实例,
// 而不要使用basic_string<char, char_traits<char>, allocator<char> >来构建实例
// 因为在以后,basic_string<char, char_traits<char>, allocator<char> >可能弃用,
// 而重新 typedef otherclass string;
typedef basic_string<char, char_traits<char>, allocator<char> > string;


...全文
282 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
超级能量泡泡 2017-02-27
  • 打赏
  • 举报
回复
引用 8 楼 GKatHere 的回复:
[quote=引用 7 楼 daiweifeng 的回复:] 自定义名字空间,然后用#define/#undef将原来的那个类型名称转义

namespace yourspace
{
class A;
}
namespace myspace
{
    typedef yourspace::A USA;
}
或者用类中类来转
#define/#undef将原来的那个类型名称转义 ?? 什么意思? [/quote] 用#define宏在局部屏蔽掉原来的类名,再用#undef 恢复。 不过这是Dirty Method
GKatHere 2017-02-08
  • 打赏
  • 举报
回复

//	如何隐藏类,使用户不可直接用
//		方法1:	类构造私有,并friend另一指定类,指定类为本类的公有派生类
//				注意: 构造函数的继承
//		方法2:	类声明实现全放cpp, 另一指定类中含指定此类的指针(或对应空间),并对指定类的接口进行转发
//				注意: 指定类的构造函数的继承, copy构造与copy赋值的深度copy
//		方法3:	将类名称搞得又臭又长,然后 typedef 出一个简单名称
//		方法4:	typedef 出指定名称。  紧接着: #define 类名 另一个又臭又长的字符串
//				注意:只是可用,实际不如上面一个
cxyOOOO 2017-02-06
  • 打赏
  • 举报
回复
不透明指针?
ri_aje 2017-02-06
  • 打赏
  • 举报
回复
匿名 namespace 就行了
GKatHere 2017-02-05
  • 打赏
  • 举报
回复
引用 7 楼 daiweifeng 的回复:
自定义名字空间,然后用#define/#undef将原来的那个类型名称转义

namespace yourspace
{
class A;
}
namespace myspace
{
    typedef yourspace::A USA;
}
或者用类中类来转
#define/#undef将原来的那个类型名称转义 ?? 什么意思?
超级能量泡泡 2017-02-04
  • 打赏
  • 举报
回复
自定义名字空间,然后用#define/#undef将原来的那个类型名称转义

namespace yourspace
{
class A;
}
namespace myspace
{
    typedef yourspace::A USA;
}
或者用类中类来转
zilaishuichina 2017-02-04
  • 打赏
  • 举报
回复
如果是不希望创建A的对象, 可以私有A的构造函数 如果是希望用B去创建A,但是不能直接创建A,可以私有构造函数 + 友元
www_adintr_com 2017-02-04
  • 打赏
  • 举报
回复
把 string 定义成一个类, 这个类只持有一个 void* 的指针作为数据成员. 然后在类的实现里面使用 basic_string<char, char_traits<char>, allocator<char> >* 作为 void* 的真实类型, 并把 string 的所有接口转发到数据成员上.
ipqtjmqj 2017-02-04
  • 打赏
  • 举报
回复
引用 2 楼 GKatHere 的回复:
[quote=引用 1 楼 ipqtjmqj 的回复:] 不要#include <string>不就可以了

// 呃,我指:
class A{};
typedef A    USA;

//如何让客户只使用
USA a;    //来创建实例


[/quote] 客户是谁?软件这东西,无论如何加密,理论上总能被破解的。如果客户水平比较低,你可以在typedef之后加句#define basic_string xxx
GKatHere 2017-02-04
  • 打赏
  • 举报
回复

// 汗,
//而不能使用
A a; //来创建实例
GKatHere 2017-02-04
  • 打赏
  • 举报
回复
引用 1 楼 ipqtjmqj 的回复:
不要#include <string>不就可以了

// 呃,我指:
class A{};
typedef A    USA;

//如何让客户只使用
USA a;    //来创建实例


ipqtjmqj 2017-02-04
  • 打赏
  • 举报
回复
不要#include <string>不就可以了

64,642

社区成员

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

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