2013-10-03 3 views
0

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

using namespace std; //for correctness sake 
    class foo { 
    public: 
     foo(int a=0, int n=0); 
     void stuff(int a); 
     void function(int n); 
     const int get_function() {return n;} 
     const int get_stuff(){return a;} 
    private: 
     int n, a; 
    }; 
    struct Store{ 
     public: get_foo(){return vector<f.foo>;} //I'm not too sure of the syntax here but you get the idea 
    private: 
     foo f; 

    } 

В основном я хочу взять всю информацию, которая возвращается в class foo и вывести это, отформатированное, в файл. Дело в том, что мне нужно сделать многие из них в файле, и он должен иметь возможность прочитать его, чтобы он ничего стоил. Так что просто добавление каждого последующего класса foo в файл не будет работать (по крайней мере, я не вижу, как).

Я попытался использовать ostream, чтобы перегрузить оператор <<, но я не уверен, как его вызвать, чтобы записать его в файл. Любые предложения приветствуются! Благодарю.

+0

Примечание: 'Const get_function() {возвращение п}' не со стандартами C++. Язык требует спецификатора типа для всех объявлений. Это (а также 'get_stuff()') должно быть объявлено с помощью 'int'. Решите сами, считаете ли вы, что 'const' оправдан (это не так). – WhozCraig

+0

@WhozCraig Вы правы Я забыл тип функции, я использовал const, потому что это то, что я видел в классе для примеров. – Shilaly

+0

Я очень подозреваю, что декларация должна быть 'int get_function() const {return n; } ', так как член не имеет требований для изменения объекта. – WhozCraig

ответ

2

Я думаю, что ваш Store должно быть так:

struct Store 
{ 
public: 
    std::vector<foo> get_foo() 
    { 
     return f; 
    } 

private: 
    std::vector<foo> f; 
}; 

перегружать << из std::ostream:

std::ostream& operator<<(std::ostream& out, const Store& f) 
{ 
    for (auto &x : f.get_foo()) 
    out << x.get_function() << ", " << x.get_stuff() << "\n"; 

    return out; 
} 

//Without auto 

std::ostream& operator<<(std::ostream& out, const Store& f) 
{ 
    std::vector<foo> q = f; 
    for (int i=0; i<q.size(); i++) 
    out << q[i].get_function() << ", " << q[i].get_stuff() << "\n"; 

    return out; 
} 
+0

Спасибо за ответ, Не могли бы вы объяснить мне x? Я смущен, почему это x.get_function, а не класс foo. К сожалению, я не знаком с тем, как в этих случаях работают функции 'auto' и несколько C++ 11. – Shilaly

+0

@M M. Ahh спасибо, я думаю, что вижу, что он делает сейчас. Это в основном конденсирует итерацию (вероятно, намного проще, чем на самом деле). Существуют ли какие-либо преимущества использования auto в этом экземпляре, а не для увеличения i для перемещения по вектору? – Shilaly

+0

@Shilaly: Это синтаксис сахара. Делает код меньшим, более понятным и более общим. – deepmax

0

Я думаю, что нужно что-то вроде этого:

template<typename T> 
std::ostream& operator << (std::ostream& out, const std::vector<T*>& elements) 
{ 
    for (size_t i = 0; i < elements.size(); i++) 
    out << elements[i] << ", "; 
    return out << std::endl; 
} 
+0

Спасибо, я еще не работал с шаблонами, поэтому я буду изучать шаблоны и опробовать ваше предложение. Вы рекомендуете какую-либо ссылку, в частности, или достаточно поиска Google? – Shilaly

1

Есть много тингов неправильно с вашим кодом.

Столько, что ясно, что вы никогда не читали книгу на C++ и просто экспериментируете с компилятором.

Не делайте этого. C++ - это действительно худший язык в мире, который подходит к этому пути по многим причинам.

Независимо от того, насколько вы умны.

На самом деле быть умным является своего рода проблемой в определенных областях, потому что многие правила C++ не являются результатом согласованного логического проектирования, а являются исторической эволюцией и решениями комитета. Даже Хари Селдон не смог бы правильно предвидеть, что будет решать комитет, вы не сможете вывести историю.

Просто выберите good book и прочитайте его на обложке. Нет другого разумного способа изучить C++.

О написании структур в файл обычно называется «сериализация», и он заботится о чуть более общей проблеме преобразования живых объектов в мертвую последовательность байтов (записанных в файл или отправленных по сети) и обратная задача «десериализации» преобразования последовательности байтов обратно в живые объекты (в одну и ту же систему, на другую идентичную систему или даже на другую систему).

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

Простейшая вещь, которую вы можете сделать, это всего лишь fwrite вещи в файл, но это чаще всего просто бессмыслица на C++ и является ужасным способом по многим причинам, даже если это технически возможно. Например, вы не можете напрямую fwrite объект std::vector и надеетесь прочитать его обратно.

+0

Да, этот код не компилируется. Я знаю, это не то, что я пытаюсь скомпилировать, я бы не написал никакого кода, если бы мог сказать это словами. Точка кода в моем вопросе не должна быть совершенной, это чтобы визуализировать то, что я пытаюсь сделать с моими классами. Я хотел бы сделать это с помощью C++, потому что я пытаюсь изучить C++. – Shilaly

+0

1000% согласен с вышеуказанным. @Shilaly - даже если вам будет скучно читать книгу, вы можете найти множество образцов, как это сделать в Интернете. Некоторые из них даже скомпилируются. – SChepurin

+0

@CHhepurin Ну это был не мой первый курорт, верьте этому или нет. Я много искал «написать вектор структур в файл» и не смог найти нигде рядом с ним. Если бы вы могли указать мне на то, что я явно пропустил, это было бы оценено. Кроме того, сторона примечания, много кода, который вы найдете в книге Страустрапа, не компилируется. Я прекрасно понимаю идею того, что я хочу сделать, синтаксис - это то, что меня озадачивает. – Shilaly

Смежные вопросы