动态调度,C

我正在使用以下scala代码尝试使用虚方法表(动态调度)将此代码转换为C.

这是scala中的代码:

abstract class Node(n: String) { val id = Node.next var name: String = n def size: Int def nrNodes: Int = 1 def find(q: String): Set[Node] = if(name.contains(q)) Set(this) else Set() } 

我的问题是这部分代码:

 def find(q: String): Set[Node] = if(name.contains(q)) Set(this) else Set() 

我想把它翻译成C,这就是我到目前为止所做的:

 Set find(Node *n, char * s){ if(strstr(s,n->name)!=0){ return (Set) n->name; } return ((Set (*)(Node *)) n->vtable[FIND])(n); } 

因此,如果包含节点,则返回一组节点,否则返回空集。 当我运行它时,它会给出以下错误:

 error: unknown type name 'Set' use of undeclared identifier 'Set' 

我不确定我是否必须使用struct Set或者我的find方法一般是错误的!

这是我的视力表:

 enum Node_vtablekeys{ SIZE=0, NRNODERS=1, FIND=2 }; 

如评论中所述,似乎您忘记声明您的结构:

 typedef struct _set { // Whatever Set must contains } Set; 

此外,我真的不知道Scala但是在find()看起来如果找不到匹配,该函数实际上会创建一个新的Set所以我猜你的函数中应该有一个malloc 。 你能告诉我们scala Set结构吗?

根据您使用find() ,返回引用而不是Set结构本身可能更有用。

 Set * find(Node *n, char * s) { if(strstr(s,n->name)!=0) { return (Set) &(n->name); } else { Set * new_set = malloc(sizof(Set)); // Copy attributes from n->vtable[FIND])(n) to new_set return new_set; } }