最近我脑子里一直在思考这个问题。我们大多数人都清楚,在 中C
,为了创建一个结构,通常在它前面加上 atypedef
以避免struct
在引用对象之前调用关键字。当然,C 仅限于结构而不是类。为了弥补这一点,C 倾向于使用专用于结构的全局函数来创建面向对象的方法
例如:
typedef struct{
int foo;
float bar;
char* baz;
} SomeStruct;
比。
struct AnotherStruct {
int foo;
float bar;
char* baz;
};
AnotherStruct
struct
当在函数中声明该类型的对象时,它之前必须有前缀关键字。例如:
int main( ... )
{
struct AnotherStruct obj1; //correct
SomeStruct obj2; //correct
struct SomeStruct obj3; //bad
AnotherStruct obj4; //bad
}
在面向对象的方法方面:
typedef struct {
//member variables here
} SomeStruct;
SomeStruct* SomeStruct_New( int a, int b, int c )
{
SomeStruct* obj = calloc( sizeof( SomeStruct ), 1 ); //not sure if that's correct -- been a while since I've used calloc.
obj.a = a;
obj.b = b;
obj.c = c;
return obj;
}
void SomeStruct_Free( SomeStruct* free )
{
free( free );
}
这些函数在没有包装器的情况下很容易实现——我只是为了举例而使用它们。我的观点是,鉴于您已经可以在 C++ 中创建一个结构,它不需要在typedef
没有关键字的情况下声明struct
,并且使用与这些结构相关的非封装函数用于面向对象的方法,我很想知道是否在 C++ 中使用 C 编码方法有任何优点,其中包括使用静态全局函数作为私有成员函数,以及将返回指向对象的指针的全局函数构造函数。
这主要是出于好奇,因为有时我觉得采用 C 方法只是为了采用它,但这可能只是一种优先考虑。