C ++需要使函数更“通用”(并且可重用)

时间:2015-11-10 19:51:24

标签: c++ function struct

我正和朋友一起做一个简单的程序。我写了一些I / O函数来插入程序(它们只读取/写入txt文件)。我打算将它们添加到头文件中以包含在主程序中。

该程序通过执行一些CRUD操作来管理项目集合。目前,它只存储在内存中。有3种不同的结构(用于表示不同类型的对象)和3种向量(每种结构类型一种)来表示3个集合。

对于不同结构类型的每个向量(在本例中我称之为t_item),我创建了三个I / O函数:

void serialize_item(const string &file_name, t_item &an_item)

声明一个ofstream变量,并将每个项目字段(ios :: app)附加到txt文件。然后调用file.close()

void serialize_all_items(const string &file_name, vector<t_item> &items)

声明一个ofstream变量并覆盖(ios :: trunc)文件内容。迭代向量,将每个struct字段写入txt文件。然后调用file.close()

void deserialize_items(const string &file_name, vector<t_item> &items)

声明本地t_item变量和ifstream变量。在读取文件内容并将每个项目字段保存到t_item变量时迭代。当一个项目完成时,它会调用push_back将其保存到向量中并返回到从文件中读取下一个项目。然后调用file.close()

问题是:我和我的朋友分别在代码的不同部分工作。由于他声明了所有的结构,他必须决定每个结构使用什么名称以及字段的名称(虽然我们都同意每个结构中会有一定数量的字段,但它们属于某种类型,因为这是我们需要实现的设计。)

我现在的问题是:我有没有办法在不知道他使用的结构和字段名称的情况下实现I / O功能?例如,这个函数:

void serialize_person(const string &file_name, type_person &a_person)
{
    ofstream personsFile(file_name, ios::app);
    personsFile<< a_person.name << endl;
    personsFile<< a_person.age << endl;
    personsFile<< a_person.gender << endl;
    personsFile.close();
}

我的朋友可以选择将结构命名为“onePerson”而不是“type_person”,字段可以是“fullName”,“age”,“sex”。但结构几乎相同。

尽管其他程序员选择了结构/字段名称,我如何调整I / O函数以适应相同的结构?

1 个答案:

答案 0 :(得分:0)

你能用联盟吗?您可以避免引用每个变量而不是...数组?

例如:

#include <stdio.h>

union myStrings
{
    struct fields
    {
        char *name;
        char *age;
        char *gender;
    } myFields;
    char *arrayPointers[3];
};

int main (void)
{
    char name[] = "David";
    char age[] = "38";
    char gender[] = "Male";

    myStrings st;

    st.myFields.name = name;
    st.myFields.age = age;
    st.myFields.gender = gender;

    for( int i = 0 ; i < 3 ; i++ )
        printf( "%s\n", st.arrayPointers[i] );

    return 0;
}

结果(不使用任何名称):

David
38
Male

Live example