2

当我决定自学编程时,我从 Java 开始。虽然我熟悉编写简单的过程软件(主要是用 PHP),但我最近开始意识到,对于更复杂的操作,我依赖于对象。

我的第一个 Java 游戏通过实例化对象以随机速度在随机位置生成对手。我对在 C 中以程序方式实现这一概念感到困惑(我对此知之甚少),但我只能想到为每个对手中的变量创建不同的数组并将数组索引用作伪对象引用“变量” '。

int size[50]; // opponent size
for (i = 0; i < 100; i++) {
    size[i] = random_number();
}

我的面向对象思维是否忽略了一个简单的解决方案?或者某些问题是否真的适用于面向对象的概念,以至于您必须编造假对象(或至少使用类似的模型)?我一直在 C 代码中看到结构,我知道它们在概念上类似于类,但我只知道这些。所以我想知道这样的事情是否可以完全非面向对象的心态。实例化没有真正的替代品,是吗?这一切都只是内存分配,所以在我看来,某些 C 程序别无选择,只能使用某种我认为是对象的形式来编写。

请告诉我我忽略了一些东西,否则我不能尊重那些谴责面向对象范式的 C 纯粹主义者。(我绝不是一个 OO 疯子;不过,我的大脑已经非常习惯这个想法,而且很难通过不提供您习惯的不同视角来看待事物。)

谢谢!

4

3 回答 3

3

作为一个也开始作为 OO 程序员的人,我也花了一些时间来适应过程式编程。对我来说最重要的是习惯于使用指针,并记住函数不是由对象管理的,而是作用于你给它们的“对象”。无论如何,我认为这样的东西可能是您正在寻找的东西,以帮助您获得您正在尝试做的事情的程序图像。

struct creature {
    int speed;
    int size;
};

void init_creature(struct creature *c) {
    c->speed = random_number();
    c->size = random_number();
}

int main() {
    struct creature creatures[10];

    for (int i = 0; i < (sizeof(creatures)/sizeof(struct creature)); i++) {
        struct creature c = creatures[i];
        init_creature(&c);
    }
}
于 2013-01-09T21:36:14.877 回答
1

如果我们忽略所有高级的面向对象编程概念,如类型参数的继承或多态性,一切都归结为同一件事。

在 C++ 中,您有对象并调用附加到它们的方法,在 C 中,您有结构,并且通过通过参数传递这些函数来调用全局函数。

我的意思是,基本的 oop 范式在概念上是具有能够通过其方法执行事物的对象。现在在 C 中,您可以获得相同的行为,但您拥有未附加到任何对象的函数。

所以基本上在 C++ 或 Java 中你会有:

class Point {
  private:
    int x, y;
  public:
    Point(int x, int y) : x(x), y(y) { }
    void draw() { ... }
};

在纯 C 中,您将拥有:

struct Point {
  int x, y;
}

struct Point makePoint(int x int y) {
  struct Point p = {.x = x, .y = y};
  return p;
}

void drawPoint(struct Point p) {
  ..
}

但是两种表示的语义能力本质上是相同的,尽管语法不同(甚至其背后的概念)。当然,如果我们开始考虑更强大的 oop 功能,一切都会改变。

在许多情况下,您不需要所有这些能力来表示对象,并非一切都意味着 oop 也不是所有问题都最好用 oop 方法解决。如果用 C 为游戏编写一个复杂的引擎同时用 Java 编写与系统一起运行的低级函数将是过大的杀伤力,同时也是过大的杀伤力。

于 2013-01-09T21:27:30.243 回答
1

Astruct可能是您在这里寻找的。

Astruct可以包含任意数量的命名变量(例如类上的属性),但不能包含方法(理论上您可以通过函数指针将方法放入其中,但这不会真正按照您想要的方式工作)。

所以用 C 表示你的生物,你可能有一个这样的结构:

struct creature {
  int x_pos;
  int y_pos;
  int speed;
};

要声明一个生物“对象”并设置一些属性,您可以这样做:

   void main() {
      struct creature mycreature;
      mycreature.x_pos = 1;
      mycreature.y_pos = 2;      
   }

struct creature mycreature语法有点笨拙,所以人们经常使用typedef结构,所以他们不必说struct creature mycreature,而是可以说creature mycreature

typedef struct _creature {
  int x_pos;
  int y_pos;
  int speed;
} creature;

一个结构可以包含其他结构,因此您也可以创建一个point结构并将其用于位置变量:

typedef struct _point {
  int x;
  int y;
} point;

typedef struct _creature {
  point location;
  int speed;
} creature;

void main() {
    creature mycreature;
    mycreature.location.x = 1;
    mycreature.location.y = 2;      
}

现在希望事情开始看起来有点熟悉......

于 2013-01-09T21:32:31.023 回答