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

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

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

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

30.07.2010, 09:42. Просмотров 654. Ответов 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();
Заранее благодарен!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.07.2010, 09:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Запись пользовательского класса (C++):

Дописать в файл запись пользовательского класса - C++
Стоит следующая задача - нужно дописать в файл запись пользовательского класса. Есть пользовательский тип: class Hostel { public: ...

Пример пользовательского класса - C++
можете показать пример пользовательского класса и объяснить как и что в нем работает?

Вектор объектов пользовательского класса - C++
Привет всем! Есть класс Automaton, я пытаюсь создать вектор Sample с объектами этого класса, а они ведут себя не так, как я ожидаю -...

Область видимости переменной пользовательского класса - C++
Всем привет! Столкнулся с такой проблемой: Создал клас и в нем класс исключений class A { char* pt; public: class...

Использование std::array внутри пользовательского класса - C++
Здравствуйте! Я создал класс, одним из полей которого является массив std::array, однако компилятор ругается на константу, что задаёт...

Ошибки при создании vector'a пользовательского класса - C++
Шалом, мои весьма дорогие друзья, столкнулся с проблемой. Решил использовать вместо массивов пресловутый вектор, и вроде бы все шло хорошо,...

8
Евгений М.
1035 / 976 / 54
Регистрация: 28.02.2010
Сообщений: 2,829
Завершенные тесты: 2
30.07.2010, 09:46 #2
А в чем вопрос?
0
burst
1 / 1 / 0
Регистрация: 29.04.2010
Сообщений: 13
30.07.2010, 10:55  [ТС] #3
функция void ucl<Type>::Write() отказывается записывать элементы списка, если эти элементы являются экземплярами класса user_type ...
файл обрезается до нулевой длинны и все, и даже ошибок никаких не вылазит
0
Mr.X
Эксперт С++
3049 / 1694 / 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<< не может быть членом класса, так как объект класса здесь является правым операндом.
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
30.07.2010, 18:03 #5
В классе перегрузка операторов ввода-вывода должна быть friend фукнцией.

friend std::ostream& operator <<(...,...).
0
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();
все корректно записывается ....
0
burst
1 / 1 / 0
Регистрация: 29.04.2010
Сообщений: 13
02.08.2010, 06:33  [ТС] #7
актуально

Добавлено через 11 часов 14 минут
нашёл в чем была проблема спасибо всем кто пытался помочь
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
02.08.2010, 07:13 #8
burst, Скиньте исправленный вариант. Вдруг кому пригодится
0
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();
}
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2010, 09:12
Привет! Вот еще темы с ответами:

Вставка и удаление объектов пользовательского класса в deque - C++
Доброго времени суток! У меня есть контейнер хранящий объекты пользовательского класса Detail: deque&lt; Detail* &gt; accumulator1 ( 1, nullptr...

Перегрузка оператора >> для пользовательского класса String - C++
Объявление класса: class String { public: //constructor String( const char * = NULL ); //default constructor String( const...

Перегрузить оператор () для пользовательского класса Matrix - C++
Суть, есть класс matrix , есть int **p(матрица) и int row, col; , нужно перегрузить оператор () для вывода элемента массива, в задание...

Быстрая сортировка для массива обьектов пользовательского класса - C++
Насколько я знаю в Си++ есть встроеная ф-ция быстрой сортировки. Как нею воспользоваться для сортировки массива обьектов моего класса? Хочу...


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

Или воспользуйтесь поиском по форуму:
9
Yandex
Объявления
02.08.2010, 09:12
Ответ Создать тему
Опции темы

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