在面向对象的土地上挣扎?

Kin*_*tor 19 c procedural-programming

当我遇到编程问题时,我自然会开始将它们分解为我脑子里的逻辑对象.谁有责任,谁拥有什么,谁来自什么,等等.

我正在与C斗争.我只是不知道如何用程序语言做事.

有经验的C程序员可以帮助解释我在设计时如何考虑我的程序吗?

例如,我想编写自己的Semaphore类.我自然需要一个队列的数据结构,我也想自己编写.如果我需要在Java或C#中执行此操作,我可以简单地编写一个快速的Queue类,并在我的Semaphore类中创建它的新实例.

但在C中,没有对象.那么我是否必须内联我的Queue数据结构的所有行为?

有人可以帮我"搞定"吗?

相关:在c中规划和组织应用程序开发的最佳方法是什么

S.L*_*ott 30

但在C中,没有对象.那么我是否必须内联我的Queue数据结构的所有行为?

没有.

做这个.

  1. 定义你的课程,但你觉得做OO设计很舒服.

  2. 将类的属性写为C语言结构.

  3. 将该结构放在头文件中,以及在该结构上运行的所有函数.确保a MyStruct * self是所有这些"方法函数"的第一个参数.

  4. 使用方法函数的所有主体编写C模块.

C中的穷人OO效果很好.只需遵守规则,将所有内容放入您需要的结构中 - 公共和私有实例变量 - 一切.

通常,避免尝试首先使用私有变量.您没有OO编译器的全部功能,因此不要担心"私有"或"受保护"等低价值功能.


sk.*_*sk. 17

我会修改S. Lott的答案,使用不透明的指针来执行结构成员的数据隐藏:

  1. 根据您的需要使用普通OO设计定义您的类.
  2. 你的类的成员变量进入C语言结构.
  3. 在头文件中,您不希望公开对象的成员变量(因为它们在OO语言中是"私有的").相反,使用不透明指针,即
    typedef struct mystruct_s *mystruct_t; // first argument to all your methods
  4. 对于您想要"公开"的所有方法,请将其签名放在.h文件中.方法体应该进入.c文件,"private"方法应该只在.c文件中定义,并且也声明为静态,因此它们的符号不会与其他文件中定义的符号冲突.

使用此方法不需要像下划线那样的聪明命名约定,但这意味着所有成员变量都是私有的.功能可以是公共或私有的,但公共职能它们所以你可能想用一个"包"名称,如限定他们的名字一个全局命名空间的一部分mystruct_push(),mystruct_pop()等等.

您还需要明确调用者或库是否负责调用malloc()free().你最有可能拥有mystruct_t *create()void destroy(mystruct_t *target)方法.


Bri*_*ndy 15

你仍然可以用C来思考面向对象.

您只需要创建一个结构和一组函数,这些函数将指向该结构的实例的指针作为其第一个参数.

至于多态性,您可以将结构的大小作为结构的第一个成员传递,因此您知道如何转换它.

这里有一个很好的使用ANSI-C的面向对象编程的pdf.