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