Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
burst
1 / 1 / 0
Регистрация: 29.04.2010
Сообщений: 13
#1

Запись пользовательского класса - C++

30.07.2010, 09:42. Просмотров 643. Ответов 8
Метки нет (Все метки)

Всем доброе время суток!
Пишу класс шаблон, застрял на одном месте и не могу понять в чем проблема ...
имеется пользовательский класс, в нем определена функция перегрузки оператора вставки в файл:
C++
1
2
3
4
5
ofstream& operator << (ofstream& s, user_type& ut)
{
    s << ut.fstreet << " " << ut.fhouse;
    return s;
}
В классе шаблоне имеется функция записи элементов однонаправленного кольцевого списка в файл:
C++
1
2
3
4
5
6
7
8
9
10
11
12
template <class Type>
void ucl<Type>::Write()
{
    ofstream file_("data.txt");
    element<Type>* cur_element = first;
    while( cur_element->next != last )
    {
        file_ << cur_element->data;
        cur_element = cur_element->next;
    }
    file_.close();
}
Тестирую класс с помощью стандартных типов int, char, float все работает на ура, а вот элементы пользовательского типа записываться не хотят ...
Причем ofstream& operator << (ofstream& s, user_type& ut) работает вроде корректно, проверял таким образом:
C++
1
2
3
4
5
user_type ut;
ofstream new_file("new.txt");
cin >> ut;
new_file << ut;
new_file.close();
Заранее благодарен!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.07.2010, 09:42     Запись пользовательского класса
Посмотрите здесь:

Пример пользовательского класса C++
C++ Дописать в файл запись пользовательского класса
C++ Область видимости переменной пользовательского класса
Быстрая сортировка для массива обьектов пользовательского класса C++
Вектор объектов пользовательского класса C++
Вставка и удаление объектов пользовательского класса в deque C++
C++ Ошибки при создании vector'a пользовательского класса
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Евгений М.
1034 / 975 / 53
Регистрация: 28.02.2010
Сообщений: 2,818
Завершенные тесты: 2
30.07.2010, 09:46     Запись пользовательского класса #2
А в чем вопрос?
burst
1 / 1 / 0
Регистрация: 29.04.2010
Сообщений: 13
30.07.2010, 10:55  [ТС]     Запись пользовательского класса #3
функция void ucl<Type>::Write() отказывается записывать элементы списка, если эти элементы являются экземплярами класса user_type ...
файл обрезается до нулевой длинны и все, и даже ошибок никаких не вылазит
Mr.X
Эксперт С++
3040 / 1685 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
30.07.2010, 14:21     Запись пользовательского класса #4
Цитата Сообщение от burst Посмотреть сообщение
имеется пользовательский класс, в нем определена функция перегрузки оператора вставки в файл:
C++
1
2
3
4
5
ofstream& operator << (ofstream& s, user_type& ut)
{
    s << ut.fstreet << " " << ut.fhouse;
    return s;
}
Функция operator<< не может быть членом класса, так как объект класса здесь является правым операндом.
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
30.07.2010, 18:03     Запись пользовательского класса #5
В классе перегрузка операторов ввода-вывода должна быть friend фукнцией.

friend std::ostream& operator <<(...,...).
burst
1 / 1 / 0
Регистрация: 29.04.2010
Сообщений: 13
30.07.2010, 18:41  [ТС]     Запись пользовательского класса #6
Цитата Сообщение от Lavroff Посмотреть сообщение
В классе перегрузка операторов ввода-вывода должна быть friend фукнцией.

friend std::ostream& operator <<(...,...).
как раз таки она у меня и есть дружественная, прототип описан в классе:

C++
1
friend ofstream& operator << (ofstream& s, user_type& ut);
а определена вне класса:

C++
1
2
3
4
5
ofstream& operator << (ofstream& s, user_type& ut)
{
        s << ut.fstreet << " " << ut.fhouse;
        return s;
}
я же говорю что я проверял работоспособность данной функции:

C++
1
2
3
4
5
user_type ut;
ofstream new_file("new.txt");
cin >> ut;
new_file << ut;
new_file.close();
все корректно записывается ....
burst
1 / 1 / 0
Регистрация: 29.04.2010
Сообщений: 13
02.08.2010, 06:33  [ТС]     Запись пользовательского класса #7
актуально

Добавлено через 11 часов 14 минут
нашёл в чем была проблема спасибо всем кто пытался помочь
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
02.08.2010, 07:13     Запись пользовательского класса #8
burst, Скиньте исправленный вариант. Вдруг кому пригодится
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2010, 09:12     Запись пользовательского класса
Еще ссылки по теме:

C++ Перегрузка оператора >> для пользовательского класса String
C++ Использование конструкторов и деструктора при проектировании пользовательского класса
Использование std::array внутри пользовательского класса C++
Перегрузить оператор () для пользовательского класса Matrix C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
burst
1 / 1 / 0
Регистрация: 29.04.2010
Сообщений: 13
02.08.2010, 09:12  [ТС]     Запись пользовательского класса #9
Пользовательский класс:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class user_type
{
private:
    string fstreet;
    int fhouse;
 
public:
    user_type(): fstreet("Unspecified"), fhouse(0)
    {}
    ~user_type()
    {}
    friend istream& operator >> (istream& s, user_type& ut);
    friend ostream& operator << (ostream& s, user_type& ut);
    friend ofstream& operator << (ofstream& s, user_type& ut);
};
//----------------------------------------------------------//
istream& operator >> (istream& s, user_type& ut)
{
    cout << "\nEnter street: "; cin >> ut.fstreet;
    cout << "Enter house number: "; cin >> ut.fhouse;
    return s;
}
//----------------------------------------------------------//
ostream& operator << (ostream& s, user_type& ut)
{
    cout << "\nStreet: "; cout << ut.fstreet;
    cout << "\nHouse number: "; cout << ut.fhouse;
    return s;
}
//----------------------------------------------------------//
ofstream& operator << (ofstream& s, user_type& ut)
{
    s << ut.fstreet << " | " << ut.fhouse;
    return s;
}
Функция записи класса шаблона:

C++
1
2
3
4
5
6
7
8
9
10
11
12
template <class Type>
void ucl<Type>::Write( int n )
{
    ofstream file_("data.txt");
    element<Type>* cur_element = first;
    for( int i = 0; i < n; i++ )
    {
        file_ << cur_element->data << " ";
        cur_element = cur_element->next;
    }
    file_.close();
}
Yandex
Объявления
02.08.2010, 09:12     Запись пользовательского класса
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru