题
我试图端口我的一些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(”数百个这样的对象,并在它们之间迭代使用几种对于每个文件,直到allfiles是在EOF。
我没有看到任何聪明的方式在C要做到这一点,唯一的解决办法我能想出是使文件指针数组,并从我的课做所有的私有成员数据相同。
但这似乎很凌乱,我可以实现我的类作为一个函数指针,或任何的功能更好的,我觉得我失去了一个基本的设计模式?
在文件的方式大到都在内存中,所以从每个文件读取一切都是不可行 感谢
解决方案
您创建抽象数据类型:
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)
然后可以创建和这种类型的使用对象就像用类的对象,不同之处在于,代替obj.func()
,你写func(&obj)
:
reader r;
init_reader(&r, "blah.txt");
read_until(&r, /* ... */);
其他提示
在最简单的方法是只将数据转换成一个结构:
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;
}
信息隐藏的原理是一样的,不管你使用的语言。你想要的东西移到隐藏到源文件:
// 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*, ...) { ... }
您总是可以创建一个结构来存储所有的相关信息,然后遍历那个...只是一个想法......(我认为C支持结构 - 它已经有一段时间...)
不隶属于 StackOverflow