结构类型的映射

From Apache OpenOffice Wiki
< Zh‎ | Documentation
Revision as of 02:49, 14 May 2009 by Jirong (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search



普通的 UNO 结构类型被映射成一个同名的公共 C++ 类。UNO 结构类型的每个成员都被映射成相同名称、对应类型的公共数据成员。C++ 结构提供一个用默认值初始化所有成员的默认构造函数,以及一个获取所有成员确切值的构造函数。如果一个普通结构类型继承另一个结构类型,则生成的 C++ 结构是与被继承的 UNO 结构类型对应的 C++ 结构的子结构。


带有一系列类型参数的 UNO 多态结构类型模板被映射成带有对应系列类型参数的 C++ 结构模板。例如,与 com.sun.star.beans.Optional 对应的 C++ 模板如下

 template< typename T > struct Optional { 
     sal_Bool IsPresent;
     T Value;
 
     Optional(): IsPresent(sal_False), Value() {}
   
     Optional(sal_Bool theIsPresent, T const & theValue): IsPresent(theIsPresent), Value(theValue) {}
 };


从上面的示例中可以看出,默认构造函数使用默认初始化为任何参数数据成员提供值。以下是多种结果:

  • 有些编译器不能正确地为所有类型实现默认初始化。例如,Microsoft Visual C++ .NET 2003 不是初始化原始类型的对象,而是对它们进行零初始化。(例如,这意味着在 Optional<sal_Int32> o; 后面,表达式 o.Value 有未定义的值,而不是零。)
  • UNO 枚举类型的默认值是其第一个成员。UNO 枚举类型的功能(已不再使用)是为单个成员提供特定的数值。现在,如果将其第一个成员为(非零)数值的 UNO 枚举类型作为参数成员的类型,则默认初始化该成员会为它提供数值零,即使零与 UNO 枚举类型的默认成员不对应(甚至不需要与 UNO 枚举类型的 any 成员对应)。
  • 另一个缺陷是默认构造的多态结构类型实例的类型 any 的参数成员(在 C++ 中为 Optional<Any> o; o.Value,在 Java 1.5 中为 new Optional<Object>().Value)在 C++ 语言绑定和 Java 语言绑定中的值不同。在 C++ 中,它包含 void,而在 Java 中,它包含类型 XInterface 的空引用。为了避免出现任何问题,这种情况下最好不要依赖默认构造函数。


在某些平台上,对于同一个基本的 C++ 类型,C++ typedef 类型 sal_Unicode(用来表示 char UNO 类型) 和 sal_uInt16 (用来表示 unsigned short UNO 类型)是同义词。这样,将其中任意一个类型用作多态结构类型的类型参数时,就会导致问题。所使用的解决方法就是禁止 unsigned shortunsigned long、和 unsigned hyper(已不使用) UNO 类型作为多态结构类型的类型参数。

 getCppuType(static_cast< com::sun::star::beans::Optional< sal_Unicode > >(0))

 getCppuType(static_cast< com::sun::star::beans::Optional< sal_uInt16 > >(0))

就无法为两个不同的 UNO 类型返回不同的数据(因为这两个函数调用在这些平台上是同一个函数)。 所选的解决方案通常禁止将(已不再使用的) UNO 类型 unsigned shortunsigned intunsigned long 作为多态结构类型的类型参数。

Content on this page is licensed under the Public Documentation License (PDL).
Personal tools
In other languages