我正在尝试将一些c ++代码移植到c中。我有以下构造
class reader{
private:
FILE *fp;
alot_of_data data;//updated by read_until() method
public:
reader(const char*filename)
read_until(some conditional dependent on the contents of the file, and the arg supplied)
}
然后我实例化了数百个这些对象,并使用几个'read_until()'为每个文件迭代它们,直到所有文件都在eof。
我没有看到任何聪明的方法在c中执行此操作,我能想到的唯一解决方案是创建一个FILE指针数组,并对我的类中的所有私有成员数据执行相同操作。
但这看起来非常混乱,我可以将我的类的功能实现为函数指针,还是更好的,我想我错过了一个基本的设计模式?
这些文件在内存中很大,因此从每个文件中读取所有内容都是不可行的 感谢
答案 0 :(得分:1)
无论您使用何种语言,信息隐藏的原则都是相同的。只需将要隐藏的内容移动到源文件中即可:
// reader.h
typedef struct reader reader;
reader* new_reader(const char*filename);
void read_until(reader*, ...);
// reader.c
struct reader {
FILE *fp;
alot_of_data data;//updated by read_until() method
};
reader *new_reader(const char*filename) { ... }
void read_until(reader*, ...) { ... }
答案 1 :(得分:1)
最简单的方法是将数据转换为结构:
struct reader
{
FILE *file;
alot_of_data data;
};
然后定义普通函数,将struct reader
作为第一个参数:
int reader_construct(struct reader *r, const char *filename)
{
if((r->file = fopen(filename, "rt")) == NULL)
return 0;
/* do other inits */
return 1;
}
并且读者功能变为:
int read_until(struct reader *r, arguments)
{
/* lots of interesting code */
}
然后只有一个结构数组,在它们上面调用reader_construct()
,然后根据需要进行read_until()
调用。
您当然可以选择更动态的构造函数,它返回“对象”:
struct reader * reader_new(const char *filename)
{
struct reader *r = malloc(sizeof *r);
if(r == NULL)
return NULL;
if(reader_construct(r, filename))
return r;
return NULL;
}
答案 2 :(得分:1)
您可以创建抽象数据类型:
typedef struct {
FILE *fp;
alot_of_data data;//updated by read_until() method
} reader;
void init_reader(reader* that, const char* filename);
void read_until(reader* that, some conditional dependent on the contents of the file, and the arg supplied)
然后你就可以像创建类的对象一样创建和使用这种类型的对象,除了你写{{1}}代替obj.func()
:
func(&obj)
答案 3 :(得分:0)
你总是可以创建一个结构来保存所有相关信息,然后循环...只是一个想法......(我认为C支持结构 - 它已经有一段时间......)