-
Notifications
You must be signed in to change notification settings - Fork 150
UsePlugin
rhcad edited this page Feb 15, 2012
·
11 revisions
使用接口比较简单,在C++代码中包含相应的接口H文件(一般不需要更多的内核头文件,需要有 iobject.h
和 objptr.h
文件),然后使用智能指针模板类 x3::Object<Interface>
来创建对象或者从一个对象得到其他接口的对象。
下面的例子说明了如何创建对象、从一个对象得到其他接口的对象、使用接口函数:
#include <plsimple/isimple.h> // 包含接口文件
#include <plsimple/isimple2.h> // 包含其他接口文件
int test()
{
x3::Object<ISimple> p(clsidSimple); // 给定类ID创建对象
if (p) // 检查是否创建成功,或 if (p->valid())
{
p->add(1, 2); // 调用接口函数,就像普通指针一样
}
x3::Object<ISimple2> other(p); // 从已有对象得到其他接口的实例
// other = p; 除了拷贝构造,也可以使用赋值形式
if (other->valid()) // or if(other)
{
std::vector<int> nums;
other->add(nums); // 调用新接口的函数
}
// 会自动释放对象
}
对于函数返回值是接口对象或函数形参是接口对象的情况,为了避免在头文件中包含所用接口的头文件,可以使用 x3::AnyObject
,需要具体某个接口的对象时再转换。
例如下面的接口文件中 createSimple() 返回的是 x3::AnyObject
,这样在此接口文件中就可以不包含ISimple1等接口定义文件:
#ifndef X3_EXAMPLE_ISIMPLE3_H
#define X3_EXAMPLE_ISIMPLE3_H
#include <objptr.h>
const char* const clsidSimple3 = "94071767-ba6b-4769-9eb4-2ebf469218f3";
class ISimple3 : public x3::IObject
{
X3DEFINE_IID(ISimple3);
// 形参用AnyObject可避免包含其他接口定义文件,可在注释中说明实际接口名
virtual void useSimple(const x3::AnyObject& obj) = 0;
// 返回值用AnyObject可避免包含其他接口定义文件,可在注释中说明实际接口名
virtual x3::AnyObject createSimple() = 0;
// 而不是 virtual x3::Object<ISimple1> createSimple() = 0;
};
#endif
此函数的实现示例如下,其中包含了如何使用AnyObject得到特定接口对象的例子:
void CSimple::useSimple(const x3::AnyObject& obj)
{
x3::Object<ISimple> myobj(obj);
ASSERT(myobj);
x3::Object<ISimple> sample(createSimple());
ASSERT(sample);
}
x3::AnyObject CSimple::createSimple()
{
return x3::Object<ISimple>(clsidSimple);
// x3::Object<ISimple> simp(clsidSimple);
// do something with simp
// return simp;
}