当我决定教自己编程时,我开始使用Java。虽然我熟悉编写简单的过程软件(主要是PHP),但最近我意识到,对于更复杂的操作,我依赖于对象。
我的第一款Java游戏通过实例化对象,在随机位置和随机速度生成对手。我对在C中按程序实现这个概念感到困惑(我对这个概念的工作知识很少),但我只能考虑为每个对手中的变量创建不同的数组,并使用数组索引作为伪对象引用“变量”。
int size[50]; // opponent size
for (i = 0; i < 100; i++) {
size[i] = random_number();
}有一个简单的解决方案,我的面向对象的思想忽略了吗?或者,某些问题真的适合于面向对象的概念,以至于你不得不编造虚假的对象(或者至少使用类似的模型)?我一直在C代码中看到结构体,我知道它们在概念上类似于类,但我只知道这些。所以,我想知道,在完全非面向对象的心态下,这样的事情是否可能发生。实例化没有真正的替代,是吗?这只是内存的分配,所以在我看来,某些C程序别无选择,只能使用某种形式的对象来编写。
请告诉我,我忽略了一些东西,因为否则我不能尊重谴责面向对象范式的C纯粹主义者。(我绝不是一个OO疯子,我的头脑已经非常习惯于这个想法,很难通过不同的视角来看待事物,而这并不能提供你所习惯的东西。)
谢谢!
发布于 2013-01-09 21:27:30
如果我们忽略了所有高级的面向对象编程概念,比如按类型参数进行继承或多态,那么一切都归结为同一件事。
在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方法来解决的。如果用C语言编写一个复杂的游戏引擎的话,同时在Java中编写低级函数,同时也会导致系统的过度使用。
发布于 2013-01-09 21:36:14
作为一个以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-09 21:32:31
struct可能就是你在这里要找的东西。
struct可以包含任意数量的命名变量(如类中的属性),但不能包含方法(理论上可以通过函数指针将方法放入其中,但这并不能真正按照您希望的方式工作)。
所以用C来表示你的生物,你可能会有这样的结构:
struct creature {
int x_pos;
int y_pos;
int speed;
};要声明一个生物"object“并设置一些属性,您可以这样做:
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;
}现在一切都开始变得更加熟悉.
https://stackoverflow.com/questions/14246693
复制相似问题