我试图模仿构造函数。我试图通过让父EJB具有一个返回指向子结构的指针的函数指针来做到这一点。任何帮助将不胜感激。
#include <stdio.h>
#include "stdlib.h"
typedef struct child_t {
char *name;
} Child;
typedef struct parent_t {
Child (*NewChild)();
} Parent;
Child *NewChild() {
Child *child = malloc(sizeof(Child));
child->name = "foo";
return child;
}
int
main()
{
Parent parent;
Child child = parent.NewChild();
}
答案 0 :(得分:9)
好像你还没有初始化parent.NewChild
。尝试在调用之前将其设置为函数指针,如下所示:parent.NewChild = NewChild;
。
另外,您是否错过*
中的Child *child = parent.NewChild();
?
附录:根据评论,Parent
声明中也存在错误/冲突:
声明其NewChild
成员函数返回Child
,而免费方法NewChild
返回Child*
。因此,将成员函数指针声明为Child * (*NewChild)();
。
答案 1 :(得分:3)
我认为你的意思是以下
#include <stdio.h>
#include <stdlib.h>
typedef struct child_t {
char *name;
} Child;
typedef struct parent_t {
Child * ( *NewChild )( void );
} Parent;
Child * NewChild( void )
{
Child *child = malloc( sizeof( Child ) );
child->name = "foo";
return child;
}
int main( void )
{
Parent parent = { NewChild };
Child *child = parent.NewChild();
puts( child->name );
free( child );
}
程序输出
foo
那就是你应该正确地声明这个功能。它的返回类型必须是指针。因此,您必须在结构定义中正确声明函数指针
typedef struct parent_t {
Child (*NewChild)();
^^^^^^
} Parent;
您需要初始化Parent类型的对象。
Parent parent = { NewChild };
否则它具有不确定的值。
答案 2 :(得分:1)
我在您的代码中看到以下问题。
功能和功能指针不匹配
在Parent
中,您已将NewChild
定义为:
Child (*NewChild)();
这表示NewChild
是一个指向函数的指针,该函数不带参数并返回Child
个对象。
您定义的功能:
Child *NewChild() { ...
不带参数并返回指向Child
的指针,而不是Child
的对象。
您必须决定哪一个需要修复。要修复该函数,请使其返回类型为Child
。
Child NewChild() { ...
未初始化Child
parent
您已将parent.Child
的值保留为未初始化但尚未尝试使用它。
设置Child
您可以使用以下代码设置name
的{{1}}。
child
这可能是也可能不是问题,具体取决于您使用child->name = "foo";
的方式,因为child->name
指向计算机只读内存中的某些全局数据。最好复制child->name
。
以下是我更新代码的建议:
"foo"