2

必须为我的学校项目使用idlj,但在我的 idl 文件中,我还需要使用前向声明。有人知道 idlj 是否支持前向声明吗?我试图这样做,但它给出了错误:

interface1.idl(第 34 行):有对 Class1 的前向引用,但未定义。

任何想法如何克服这个问题?不幸的是,我无法使用任何其他 idl 编译器......而且我找不到任何有关此的信息。

编辑:

接口1.idl:

interface SecondClass;

interface FirstClass
{
    //...
};

接口2.idl:

interface FirstClass;

interface SecondClass
{
    //...
};

idlj -fclient interface1.idl

给出:

interface1.idl(第 8 行):有对 SecondClass 的前向引用,但没有定义。}; ^

4

3 回答 3

2
#ifndef _SecondClass
#define _SecondClass
#include "interface1.idl"
interface SecondClass
{
   typedef sequence<FirstClass> firstVector;
   SecondClass create();
};
#endif

#ifndef _FirstClass
#define _FirstClass
#include "interface2.idl"
interface FirstClass
{
   typedef sequence<SecondClass> secondVector;
   FirstClass create();
};
#endif

看看这个。将此模式用于所有相互依赖的接口。

于 2012-08-23T21:51:02.860 回答
1

我不熟悉那个 ORB,但它应该是可能的。请记住,如果您转发声明一个类,您最终必须在某处提供定义,以便翻译器知道该做什么。

例如:

interface SecondClass;  // forward declaration

interface FirstClass {

   SecondClass foo();
};

// now you must provide the IDL for SecondClass; 
// either write it out here or #include the appropriate IDL file
于 2012-08-23T16:45:06.663 回答
0

我的代码的这个版本终于工作了(编译没有错误)但我仍然不知道如何以及为什么;P

我不知道如何以及为什么,但它最终编译没有错误,看看:

文件 interface1.idl

#ifndef __FIRSTCLASS_IDL__
#define __FIRSTCLASS_IDL__

#include "interface2.idl"

interface FirstClass
{
    typedef sequence<SecondClass> secondVector;
    FirstClass create();
};

#endif

文件interface2.idl

#ifndef __SECONDCLASS_IDL__
#define __SECONDCLASS_IDL__

interface FirstClass;

interface SecondClass
{
    typedef sequence<FirstClass> firstVector;
    SecondClass create();
};

#include "interface1.idl"

#endif

我只是有点困惑为什么一个include指令位于 idl 文件的顶部,而另一个指令必须位于底部。有人知道吗?哎呀!

于 2012-08-23T21:49:51.753 回答