2011-07-05 124 views
4

我已经证明这样的接口:C结构问题

typedef struct Tree { 
    int a; 
    void* (*Something)(struct Tree* pTree, int size); 
}; 

然后按照我的理解,我需要创建它的实例,并使用一些方法把对“大小”的值。 所以我做

struct Tree *iTree = malloc(sizeof(struct Tree)); 
iTree->Something(iTree, 128); 

但一直未能初始化。我做对了吗? Howthing方法的第一个成员是指向同一个结构体的指针?

任何人都可以解释一下吗?

谢谢

+0

在这个问题中没有太多的C++。你可能会考虑删除标签或得到像Ben这样的答案。 – pmr

+1

我无法得到一件事:typedef的目的是什么? – sidyll

+1

除非通过在''''和';'之间移动'Tree'来结束命名结构,否则您将需要移除typedef。^@sidyll +1在我发布这条消息后,你的评论显示出来了。 – Joe

回答

8

你必须设置Something为东西,因为它只是一个函数指针而不是函数。用malloc创建的结构只包含垃圾和结构字段,在它们有用之前需要进行设置。

struct Tree *iTree = malloc(sizeof(struct Tree)); 
iTree->a = 10; //<-- Not necessary to work but you should set the values. 
iTree->Something = SomeFunctionMatchingSomethingSignature; 
iTree->Something(iTree, 128); 

更新

#include <stdlib.h> 
#include <stdio.h> 

struct Tree { 
    int a; 
    //This is a function pointer 
    void* (*Something)(struct Tree* pTree, int size); 
}; 

//This is a function that matches Something signature 
void * doSomething(struct Tree *pTree, int size) 
{ 
    printf("Doing Something: %d\n", size); 
    return NULL; 
} 

void someMethod() 
{ 
    //Code to create a Tree 
    struct Tree *iTree = malloc(sizeof(struct Tree)); 
    iTree->Something = doSomething; 
    iTree->Something(iTree, 128); 
    free(iTree); 
} 
+0

请记住函数指针就是这个指针。它需要在某处引用一个函数。 –

+0

:/我不明白... SomeFunctionMatchingSomethingSignature是什么? – Pett

+0

我为你添加了一个代码示例。 – Joe

4

这是一个穷人的虚拟功能。初始参数大致相当于成员函数中C++的this指针。你必须在调用它们之前手动设置函数指针,而C++虚函数是由编译器设置的。

+1

这并没有真正回答这个问题。虽然它标记为C/C++,但它显然是一个C问题,因为它失败了。 –

+0

你能举个例子吗?谢谢! – Pett

+0

+1对于穷人虚拟功能的洞察力 – larsmoa

1

成员Tree::Something永远不会初始化。您为Tree分配空间,但分配与初始化不同,并且您分配的Tree仅包含无意义的位。