【发布时间】:2012-02-23 22:42:49
【问题描述】:
我最近一直在思考这个问题。我们大多数人都很清楚,在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 方法只是为了采用它,但这可能只是一种优先考虑。
【问题讨论】:
-
我不明白你的意思。这不是面向对象的方法,也许这是一种很好的编程习惯,但是结构的所有成员都是公共的,当然你不能有方法。在 C++ 中,您可以改用类,并利用构造函数、析构函数、方法以及最重要的多态性!
-
typedef struct Foo Foo是怎么出现的?该结构的存在只是为了减少所需的输入量,并且与程序与 OOP、封装与未封装或您的问题有关。 -
@vulkanino 在 C 中执行此类操作时,您通常在文件范围内将成员声明为静态成员,以创建私有封装。这是一种面向对象的方法,即使不是特别优雅。
-
@Lundin,当然,但我认为这根本不是 OO,它只是尝试封装全局变量,无论如何使用“extern”都可以访问这些变量......看不到真正的优势,我的东西是“工厂”功能:obj.a = a;等等。它将创建与初始化混合在一起......
标签: c++ c oop procedural-programming