我试图端口我的一些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支持结构 - 它已经有一段时间...)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top