当我遇到编程问题时,我自然会开始将它们分解为我脑子里的逻辑对象.谁有责任,谁拥有什么,谁来自什么,等等.
我正在与C斗争.我只是不知道如何用程序语言做事.
有经验的C程序员可以帮助解释我在设计时如何考虑我的程序吗?
例如,我想编写自己的Semaphore类.我自然需要一个队列的数据结构,我也想自己编写.如果我需要在Java或C#中执行此操作,我可以简单地编写一个快速的Queue类,并在我的Semaphore类中创建它的新实例.
但在C中,没有对象.那么我是否必须内联我的Queue数据结构的所有行为?
有人可以帮我"搞定"吗?
相关:在c中规划和组织应用程序开发的最佳方法是什么
但在C中,没有对象.那么我是否必须内联我的Queue数据结构的所有行为?
没有.
做这个.
定义你的课程,但你觉得做OO设计很舒服.
将类的属性写为C语言结构.
将该结构放在头文件中,以及在该结构上运行的所有函数.确保a MyStruct * self
是所有这些"方法函数"的第一个参数.
使用方法函数的所有主体编写C模块.
C中的穷人OO效果很好.只需遵守规则,将所有内容放入您需要的结构中 - 公共和私有实例变量 - 一切.
通常,避免尝试首先使用私有变量.您没有OO编译器的全部功能,因此不要担心"私有"或"受保护"等低价值功能.
我会修改S. Lott的答案,使用不透明的指针来执行结构成员的数据隐藏:
根据您的需要使用普通OO设计定义您的类.
你的类的成员变量进入C语言结构.
在头文件中,您不希望公开对象的成员变量(因为它们在OO语言中是"私有的").相反,使用不透明指针,即
typedef struct mystruct_s *mystruct_t; // first argument to all your methods
对于您想要"公开"的所有方法,请将其签名放在.h文件中.方法体应该进入.c文件,"private"方法应该只在.c文件中定义,并且也声明为静态,因此它们的符号不会与其他文件中定义的符号冲突.
使用此方法不需要像下划线那样的聪明命名约定,但这意味着所有成员变量都是私有的.功能可以是公共或私有的,但公共职能它们所以你可能想用一个"包"名称,如限定他们的名字一个全局命名空间的一部分mystruct_push()
,mystruct_pop()
等等.
您还需要明确调用者或库是否负责调用malloc()
和free()
.你最有可能拥有mystruct_t *create()
和void destroy(mystruct_t *target)
方法.
你仍然可以用C来思考面向对象.
您只需要创建一个结构和一组函数,这些函数将指向该结构的实例的指针作为其第一个参数.
至于多态性,您可以将结构的大小作为结构的第一个成员传递,因此您知道如何转换它.
这里有一个很好的使用ANSI-C的面向对象编程的pdf.