我正在尝试为C中的结构构建一个类似构造函数的函数。我最擅长使用围绕面向对象特性构建的语言,而将面向对象特性添加到基本的语言中并不是我的强项。然而,不幸的是,对于这个项目,我不得不使用C的一个变体。
其思想是为需要初始化的结构中的每个变量构建一个函数,并为结构的名称使用一个' name‘参数。
最大的问题是,我需要使用的C语言的变体在功能上非常有限。在其他方面,它似乎没有动态内存分配。
目标代码应该是这样的:
typedef struct {
int a;
string b;
} TheStruct;
void newStruct(string name, int a, string b){
TheStruct name;
name.a = a;
name.b = b;
}这是行不通的,因为使用实例化的结构被称为' name‘,而不是name变量的值。如果不使用C语言中没有的高级特性,比如变量变量,那么在C中如何动态引用结构呢?
发布于 2013-12-17 06:00:50
有两个选择:
struct TheStruct方法传递newStruct方法newStruct的struct TheStruct的指针),稍后您必须使用free将其删除
方法可能是这样的:
typedef struct {
int a;
string b;
} TheStruct;
void newStruct(TheStruct* st, string name, int a, string b){
st->a = a;
st->b = b;
}或
TheStruct* newStruct(string name, int a, string b){
TheStruct *res = malloc(sizeof(TheStruct));
res->a = a;
res->b = b;
return res;
}你可以看看这个非常好的教程:Pointers in C++。是针对C++的,但基本原理基本相同。
发布于 2013-12-17 06:06:17
您希望通过引用传入TheStruct或返回指向新结构的指针。
void newStruct( TheStruct* s, int a, string b )
{
if( !s )
s = malloc( sizeof( TheStruct ) );
s->a = a;
s->b = b;
}
//or
TheStruct* newStruct( int a, string b )
{
TheStruct* s = malloc( sizeof( TheStruct ) );
s->a = a;
s->b = b;
return s;
}注意:当使用第二个版本时,您必须记住清理内存,因为它是在堆上创建的。在第一个版本中,可以在堆栈或堆上创建TheStruct。(我假设定义了a和b。)
TheStruct s1, *s2;
s2 = malloc( sizeof( TheStruct ) );
newStruct( &s1, a, b );
newStruct( s2, a, b );
// do stuff
free( s2 );在第二个版本中,它将如下所示:
TheStruct *s3 = newStruct( a, b );
// do stuff
free( s3 );https://stackoverflow.com/questions/20621771
复制相似问题