инициализация c ++ POD - PullRequest
       4

инициализация c ++ POD

1 голос
/ 30 августа 2010

Я читал об объектах POD в C ++. Я хочу, чтобы структура POD была записана в файл. Поэтому он должен иметь только открытые данные без ctors / dtors и т. Д. Но, насколько я знаю, в нем может быть статическая функция. Так я могу использовать здесь "именованный конструктор"? Мне нужна динамическая инициализация, но я не хочу дублировать проверку аргументов при каждой инициализации структуры Вот простой пример (это просто простой пример, а не рабочий код):

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, которую я могу просто записать в файл? Это правильно?

Ответы [ 3 ]

4 голосов
/ 30 августа 2010

Это должно быть хорошо.

Вы можете даже иметь нестатические функции-члены (если они не являются виртуальными)

Вы не можете иметь то, что автоматически называется (например, ctor / dtor). То, что вы явно называете, прекрасно.

1 голос
/ 30 августа 2010

Вы правы. Это просто обычный старый кусок данных. Никаких забавных указателей виртуальных таблиц или чего-либо подобного в нем.

Теперь я все еще не уверен, что это хорошая идея - просто использовать fwrite для записи данных в файл. Вы можете сделать это и fread вернуть данные обратно при условии, что программа, которая выполняет fread, написана с той же версией компилятора, которая использовалась для создания fwrite. Но если вы переключаете компиляторы, платформы или иногда даже версии, это может измениться.

Я бы предложил что-то вроде Буферы протокола , чтобы сделать работу вашей структуры данных постоянной.

1 голос
/ 30 августа 2010

Если вы напишите операторы потоков, это сделает жизнь намного проще.
Это не так, как будто запись в двоичном формате значительно быстрее (поскольку вам нужно написать код для преобразования в различные форматы байтов), и в настоящее время пространство практически не имеет значения.

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;
}

С этим определением становится доступным и простым в использовании множество стандартных алгоритмов.

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)
             );
}
...