当我决定自学编程时,我开始使用Java。虽然我熟悉编写简单的程序软件(主要是在PHP中),但我最近才意识到,对于更复杂的操作,我依赖对象。
我的第一个Java游戏通过实例化对象在随机位置和随机速度产生了对手。我对在C中实现这个程序性的概念感到困惑(我很少有工作知识),但我只能想到为每个对手中的变量创建不同的数组并使用数组索引作为伪对象引用'变量”。
int size[50]; // opponent size
for (i = 0; i < 100; i++) {
size[i] = random_number();
}
是否有一个简单的解决方案,我的面向对象的头脑被忽略了?或者某些问题确实适用于面向对象的概念,以至于你必须弥补假对象(或者至少使用类似的模型)?我一直看到C代码中的结构,我知道它们在概念上类似于类,但这就是我所知道的。所以我想知道这样的东西是否可能完全不以面向对象的思维方式。实例化没有真正的替代品,是吗?这只是内存的分配,所以我看到它的方式,某些C程序别无选择,只能用我认为对象的某种形式编写。
请告诉我,我忽视了一些事情,因为否则我不能尊重那些指责面向对象范式的C纯粹主义者。 (我绝不是一个OO坚果;我的思想已经变得非常习惯于这个想法,但很难通过不同的镜头来看待事情,而这些镜头并不能提供你已经习惯的东西。)
谢谢!
答案 0 :(得分: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);
}
}
答案 1 :(得分: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中编写低级函数会与系统一起操作同时也会过度。
答案 2 :(得分:1)
struct
可能就是你在这里寻找的。
struct
可以包含任意数量的命名变量(比如类中的属性)但不能包含方法(理论上你可以通过函数指针将方法放入其中,但这不会真正起作用你想要它。)
所以用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;
}
现在希望事情开始变得更加熟悉......