请教DECLARE_NOT_AGGREGATABLE(x)等宏定义

gooore 2010-08-03 03:14:43

#define DECLARE_NOT_AGGREGATABLE(x) public:\
typedef CComCreator2< CComCreator< CComObject< x > >, CComFailCreator<CLASS_E_NOAGGREGATION> > _CreatorClass;
#define DECLARE_AGGREGATABLE(x) public:\
typedef CComCreator2< CComCreator< CComObject< x > >, CComCreator< CComAggObject< x > > > _CreatorClass;
#define DECLARE_ONLY_AGGREGATABLE(x) public:\
typedef CComCreator2< CComFailCreator<E_FAIL>, CComCreator< CComAggObject< x > > > _CreatorClass;
#define DECLARE_POLY_AGGREGATABLE(x) public:\
typedef CComCreator< CComPolyObject< x > > _CreatorClass;



请问能不能帮我解释一下这几个宏,具体不明白的是里面的一个public,和typedef中的逗号。这个总是宏定义看不懂,它是在atl实现类工厂的时候使用的。

非常感谢
...全文
780 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
gooore 2010-08-03
  • 打赏
  • 举报
回复
好的,回头去读一读。

结贴了,谢谢
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 gooore 的回复:]

谢谢您

还请三楼指点迷津,您说的应该是我没有接触过的,是不是预编译之类的?

引用 3 楼 akirya 的回复:
用/P 输出展开后的代码
[/Quote]
编译参数,MSDN中输入/P就能看到详细说明
gooore 2010-08-03
  • 打赏
  • 举报
回复
谢谢您

还请三楼指点迷津,您说的应该是我没有接触过的,是不是预编译之类的?

[Quote=引用 3 楼 akirya 的回复:]
用/P 输出展开后的代码
[/Quote]
jameshooo 2010-08-03
  • 打赏
  • 举报
回复
public多少个都无所谓,你可以连续写一百个public:
gooore 2010-08-03
  • 打赏
  • 举报
回复
谢谢您,我看漏了一个尖括号。

展开到CComCoClass下出现了两个“public”,会以哪个为准呢?前面一个还是后面一个。我是想假设如果不是两个public

另外3楼的方式怎么弄的?谢谢您帮忙解释一下。
jameshooo 2010-08-03
  • 打赏
  • 举报
回复
typedef 是把长长的模板类型定义成一个简短的自定义名称
中间的逗号表示两边的内容是两个模板参数,说明CComCreator2模板类需要两个模板参数,一个参数是CComCreator< CComObject< CMath> >,另一个参数是CComCreator<CComAggObject< CMath > >,用下面的分解语句表达可能更容易看一些:
public:
typedef CComCreator<CComObject<CMath> > _comCreator;
typedef CComCreator<CComAggObject<CMath> > _aggCreator;
typedef CComCreator2<_comCreator, _aggCreator> _CreatorClass;
gooore 2010-08-03
  • 打赏
  • 举报
回复
您是指IDE的功能,还是?不太明白你的意思。请问下我该怎么操作。

谢谢您

[Quote=引用 3 楼 akirya 的回复:]
用/P 输出展开后的代码
[/Quote]
  • 打赏
  • 举报
回复
用/P 输出展开后的代码
gooore 2010-08-03
  • 打赏
  • 举报
回复
谢谢您,我知道可以直接展开,可是展开后的代码我不太明白。我不是专业的程序员,对这些技术有兴趣所以学习。基础比较薄弱,遇到问题也没有人问,所以来这里请教。我的问题具体是,

对象为了实现类工厂所以继承
public CComCoClass<CMath, &CLSID_Math>

而在模版类CComCoClass中引入了两个宏,

template <class T, const CLSID* pclsid = &CLSID_NULL>
class CComCoClass
{
public:
DECLARE_CLASSFACTORY()
DECLARE_AGGREGATABLE(T)
typedef T _CoClass;
……


这样展开就成了,

class CComCoClass
{
public:
//DECLARE_CLASSFACTORY()
DECLARE_CLASSFACTORY_EX(CComClassFactory)
//DECLARE_AGGREGATABLE(T)
public:\
typedef CComCreator2< CComCreator< CComObject< CMath> >, \
CComCreator<CComAggObject< CMath > > > _CreatorClass;
typedef T _CoClass;
……


先不说DECLARE_CLASSFACTORY(),在DECLARE_AGGREGATABLE(T)展开后就又有了一个public,然后typedef中间还有个逗号,我就不知道再往下怎么展开了。

谢谢
oyljerry 2010-08-03
  • 打赏
  • 举报
回复
宏就是直接展开,你对应的把代码替换掉宏,展开贴到编译器文件中看

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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