2012-05-27 30 views
1

我在下面列出了一些示例代码,问题是如果有一种方法让函数名从struct_name访问数值的值?函数指针:访问结构中的数据?

typedef struct struct_name { 
int number 
void (*func)(); 
} * struct_name_ptr; 

void function_name() { 
//access number from struct 
} 

main() { 
    struct_name_ptr newobject; 
    newobject->func=&function_name; 
    newobject->func(); //can it print the value of the number in the structure above? 
} 
+1

除非你改变'func'的签名就可以接受参数是不可能的。 – UmNyobe

+0

看到这个问题[如何在C中模拟OO风格的多态?](http://stackoverflow.com/questions/524033/how-can-i-simulate-oo-style-polymorphism-in-c) –

+0

这不能工作;你已经将'struct_name_ptr'声明为一个指针,'newobject'指向未定义的内存,一个解引用是未定义的行为 – user411313

回答

4

呃 - 没有。

一个struct肯定可以包含一个函数指针。但是你调用的函数不会有任何有关结构的知识。除非你传递一个指针作为函数参数,或者使struct为全局的。

1

由于我对编程知识有限,我不认为这是可能的。虽然结构体包含一个函数指针,但分配给它的函数的地址是不同的,我不认为它会有任何访问它的地方,除非你将它作为参数传递。

1

好吧,两件事情,struct_name->数量应该有一个价值,它要么必须在相同的范围内&函数名,或者需要明确地传递。两种方法可以做到这一点:

/*这里是一个全球性的呼叫结构*/

#include<stdio.h> 

typedef struct struct_name { 
    int number; 
    void (*func)(); 
    } * struct_name_ptr; 

struct struct_name newobject = { 0 }; 

void function_name() { 
    printf("%d",struct_name); 
} 

void main() { 

    struct struct_name_ptr newobject; 

    newobject->func=&function_name; 
    newobject->func(); 
} 

/*和一个与修改前执行*/

#include<stdio.h> 

typedef struct struct_name { 
    int number; 
    void (*func)(); 
    } * struct_name_ptr; 


void function_name(struct_name) { 
    printf("%d",struct_name); 
} 

void main() { 

    struct struct_name_ptr newobject; 
    newobject.number = 0; 

    newobject->func=&function_name; 
    newobject->func(newobject); 
} 
1

不,比萨饼韩元我不知道送达它的披萨送货员是什么样的。

常规函数只是内存中的一个地址。可以使用像这种情况下的函数指针来调用它。在任何情况下:函数将不知道它是如何被调用的。特别是它不会知道它是使用一个函数指针调用的,这个函数指针是某个struct的一部分内存(一段内存)。

当像C++这样的类使用语言时,成员函数将有一个隐藏的参数,它是一个指向类实例的指针。这就是成员职能如何了解他们的数据。

1

你可以“模拟”在纯C简单的OOP,你像例如:

typedef struct { 
int number; 
void (*func)(); 
} class; 

void function_name(class *this) { 
    printf("%d",this->number); 
} 

#define CALL(c,f) c.f(&c) 

int main() { 
    class object={12345,function_name}; 

    CALL(object,func); // voilá 
}