我已经阅读了C ++中的POD对象。我想要将POD结构写入文件。所以它应该只有没有ctors / dtors等的公共数据。但据我所知它可以有静态功能。那么我可以在这里使用“命名构造函数idiom”吗?我需要动态初始化,但我不想在每次struct初始化时复制参数检查 这是一个简单的例子(它只是简单示例,而不是工作代码):
struct A
{
int day;
int mouth;
int year;
static A MakeA(const int day, const int month, const int year)
{
// some simple arguments chech
if ( !(day >= 1 && day <= 31) || !(month >=1 && month <=12) || !(year <= 2010) )
throw std::exception();
A result;
result.day = day;
result.month = month;
result.year = year;
return result;
}
};
所以我有一些构造函数和POD结构,我可以简单地将其写入文件中?这是正确的吗?
答案 0 :(得分:4)
那应该没事。
您甚至可以拥有非静态成员函数(只要它们不是虚拟的)
你不能拥有一个自动的东西(如ctor / dtor)。你明确打电话的事情很好。
答案 1 :(得分:1)
如果你编写流操作符,它可以简化生活 它不像写二进制文件要快得多(因为你需要编写代码来转换为不同的字节序格式),而现在的空间实际上是无关紧要的。
struct A
{
int day;
int mouth;
int year;
A(const int day, const int month, const int year)
{
// some simple arguments chech
if ( !(day >= 1 && day <= 31) || !(month >=1 && month <=12) || !(year <= 2010) )
throw std::exception();
this->day = day;
this->month = month;
this->year = year;
}
};
std::ostream& operator<<(std::ostream& str, A const& data)
{
return str << data.day << " " << data.month << " " << data.year << " ";
}
std::istream& operator>>(std::istream& str,A& data)
{
return str >> data.day >> data.month >> data.year;
}
通过这个定义,标准算法的整个plethera变得可用且易于使用。
int main()
{
std::vector<A> allDates;
// Fill allDates with some dates.
// copy dates from a file:
std::ifstream history("plop");
std::copy(std::istream_iterator<A>(history),
std::istream_iterator<A>(),
std::back_inserter(allDates)
);
// Now save a set of dates to a file:
std::ofstream history("plop2");
std::copy(allDates.begin(),
allDates.end(),
std::ostream_iterator<A>(history)
);
}
答案 2 :(得分:1)
你是对的。这只是一个普通的旧数据。没有有趣的虚拟表指针或类似的东西。
现在,我仍然不确定使用fwrite
将数据写入文件是一件好事。您可以执行此操作并fread
数据,前提是执行fread
的程序使用的编译器版本与用于执行fwrite
的编译器相同。但是,如果您切换编译器,平台,有时甚至是版本,可能会发生变化。
我建议像Protocol Buffers这样的工作来完成使数据结构持久化的工作。