最近我一直在思考这个问题。我们大多数人都知道,在C
中,为了创建一个结构体,通常需要在引用对象之前加上typedef
以避免调用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方法只是为了采取它,但这可能只是一种偏好。
typedef struct Foo Foo
是用来减少敲击量的语法结构,与面向过程编程、面向对象编程、封装与否等问题无关。 - Mankarse