将C++OO层次结构转换为C过程



我使用C已经有一段时间了,但有时当我想到如何解决问题时,我似乎想不出其他方法,只能用OO方法,就像我在学校里学到的那样。由于我一直在使用C,我主要使用OO模式,但在C中,有时会与语言作斗争以使其发挥作用。举个简单的例子,如果我需要编写一个文件系统资源抽象,我会考虑编写一个resource基类,例如,它将由ImageFile类和AudioFile类继承。

class Resource {
bool opened;
virtual bool load_file(const char *fpath);
virtual bool release(void);
}
class ImageFile : Resource {
bool load_file(const char *fpath) { ... }
bool release(const char *fpath) { ... }
}
class AudioFile : Resource {
bool load_file(const char *fpath) { ... }
bool release(const char *fpath) { ... }
}
int main() {
Resource img = ImageFile();
Resource mus = AudioFile();
img.load_file("my_image.png");
mus.load_file("song.mp3");
img.release();
mus.release();
return 0;
}

在C中,我使用函数指针来复制这种行为。问题是,这仍然是OO设计,我想学会思考过程性问题。你会如何以程序化的方式设计同样的问题?OO继承如何转化为过程的?你认为程序性如何?

您提出的引入函数指针的想法无疑是正确的做法。

我们的想法是,我们有函数指针——"父"类,子类带有指向父结构的指针,当我们定义自己的函数定义时,我们可以将这些函数指向我们实现的函数。

我将为您粗略地举一个简单的例子,说明如何实现这一点。

struct resource {
bool (*load_file)(const char *fpath);
bool (*release)(const char *fpath)
};
struct imageFile {
struct resource *ops;
};
struct audioFile {
struct resource *ops;
};
bool image_load_file(const char *fpath) {...}
bool image_release(const char *fpath) {...}
bool audio_load_file(const char *fpath) {...}
bool audio_release(const char *fpath) {...}
int main () {
static const struct op1 = {
image_load_file,
image_release,
};
static const struct op2 = {
audio_load_file,
audio_release,
};
// Assigning the functon pointers
struct imageFile *im = malloc(sizeof(*im));
im->ops = op1;
struct audioFile *aud = malloc(sizeof(*aud));
aud->ops = op2;
// Calling the functions
im->ops->load_file(fpath);
im->ops->release(fpath);
}

相关内容

  • 没有找到相关文章

最新更新