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

Не могу сообразить как подружить свой класс с fileoutputstream - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.80
Bars911
0 / 0 / 0
Регистрация: 15.07.2011
Сообщений: 6
17.07.2011, 02:10     Не могу сообразить как подружить свой класс с fileoutputstream #1
В общем задача такая:
на входе один или несколько текстовых файлов, читаю его, заношу все слова в двусвязный список на хипе, сортирую по алфавиту.
K каждому слову прицепляю имя файла в котором оно встречается и номера строк на которых оно встречается
затем полученный список вывожу опционално или на консоль или создаю текстовый файл и пишу туда.
Список отвечает за виделение и освобождение памяти на хипе и печать, причем поскольку часть данных в формате String а часть в Int
пришлось сделать два класса соответственно String и Int
(такое задание что для каждого типа используемого в списке надо делать свой класс((
также запрещено использовать STL)

узлы списка:
HPP:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#ifndef CLASS_LISTENELEMENT_HPP
#define CLASS_LISTENELEMENT_HPP
 
class Listenelement
{
            private:
                    Listenelement* _next;       //ukasatel na sledujushego
                    Listenelement* _prev;       //ukasatel na predidushego
                    void*   _value;                     //ukasatel na snachenie
            public:
        Listenelement(Listenelement*,Listenelement*, void*) ;
        Listenelement* get_next() const ;
        Listenelement* get_prev() const ;       
        void*          get_value() const ;
        void set_next(Listenelement*) ;
        void set_prev(Listenelement*) ;     
        void set_value(void*) ;
};
#endif
CPP:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "Class_Listenelement.hpp"
 
Listenelement::Listenelement(Listenelement* next, Listenelement* prev, void* value):
    _next(next), _prev(prev), _value(value) {} 
 
Listenelement* Listenelement::get_next() const
{   return this->_next ;  }
Listenelement* Listenelement::get_prev() const
{ return this->_prev ; }
 
void* Listenelement::get_value() const
{   return this->_value ;  }
 
void Listenelement::set_next(Listenelement* next)
{   this->_next = next ;  }
void Listenelement::set_prev(Listenelement* prev)
{       this->_prev = prev; }
void Listenelement::set_value(void* value)
{   this->_value = value ;  }
список:
HPP:
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
#ifndef CLASS_LISTE_HPP
#define CLASS_LISTE_HPP
#include "Class_Listenelement.hpp"
 
using namespace std ;
 
class Liste
{
    private:
        Listenelement* _first ; //ukasatel na pervogo chlena
        Listenelement* _last ;  //ukasatel na poslednego chlena
        unsigned int   _count ; //schetchik
        void* (*_copy) (void*) ;//ukasatel na mesto na heape gde callback funkcija videljaet pamjat pod int ili string
        void (*_print) (void*) ;//callback funkcija pechatajushaja int ili string na konsol ili v .txt
        void (*_free)  (void*) ;//callback funkcija osvobogdajushaja pamjat na heape
        
    public:
        Liste(void* (*copy) (void*),
              void (*print) (void*),
              void (*free) (void*)) ;
        void append(void*) ;
        void prepend(void*) ;
        void insert(void*) ;
        // remove n-th element
        void removeOne(void*) ;
        void removeFirst() ;
        void removeList() ;
        void* find(void*, bool (*compare) (void*, void*)) ;
        void sortListe(bool (*compare) (void*, void*)) ;
        // search for value
        // Listenelement* search(Liste*, void*) ;
        void print() ;
} ;
#endif
CPP:
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <cstdlib>
#include<iostream>
#include "Class_Liste.hpp"
 
Liste::Liste(void* (*copy) (void*),
             void (*print) (void*),
             void (*free) (void*)):
    _first(NULL), _last(NULL), _count(0), 
    _copy(copy), _print(print), _free(free) {}
 
void Liste::append(void* value)
{
    Listenelement* neu = new Listenelement(NULL, NULL, _copy(value)) ;
    // _next vom letzten Listenelement aktualisieren
    if (this->_first == NULL) //Liste ist noch leer
    {   
        this->_first = neu ;
        this->_last  = neu ;
    }
    else
    {
        this->_last->set_next(neu) ; 
        this->_last = neu ;
    } ;
    this->_count++ ;
}
 
void Liste::sortListe(bool (*compare) (void*, void*))
{
    if (this->_count < 2) { return ; }
    Listenelement* le  = this->_first ;
    Listenelement* nle = le -> get_next() ;
    void* tmp = NULL ;
    for (unsigned int i=0 ; i<this->_count - 1 ; i++)
    {
        le  = this->_first ;
        nle = le -> get_next() ;
        for (unsigned int j=0 ; j<this->_count - 1 ; j++)
        {
            if (compare(le->get_value(), nle->get_value()) == false)
            {   // Wir mГјssen die Zeiger vertauschen!
                tmp = le->get_value() ;
                le -> set_value(nle->get_value()) ;
                nle-> set_value(tmp) ;
            } ;
            le  = nle ;
            nle = nle->get_next() ;
        }
    }
}
 
 
void* Liste::find(void* pv, bool (*compare) (void*, void*))
{
    if (this->_count == 0) {  return NULL ;  }
    Listenelement* le = this->_first ;
    while (le != NULL)
    {
        if (compare(pv, le->get_value()) == true)
        {
            return le->get_value() ;
        } ;
        le = le->get_next() ;
    } ;
    return NULL ;
}
 
 
 
void Liste::print()
{
    Listenelement* k = this->_first ;
    while (k != NULL)
    {
 
        this->_print(k->get_value()) ;
        k = k->get_next() ;
    } ;
cout<<endl;
}
ячейки для хранения непосредственно данных:
HPP:
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
#ifndef CLASS_WORT_MIT_INDEX_HPP
#define CLASS_WORT_MIT_INDEX_HPP
#include <string>
#include"Class_Liste.hpp"
using namespace std ;
 
class WortFileIndex
{
private: 
        string* _value; //v pervom sloe ukasatel na slovo, vo vtorom sloe ukasatel na imja faila
        Liste* _WFIliste ;//v pervom sloe ukasatel na spisok imen fajlov, vo vtorom sloe ukasatel na spisok nomerov strok
    
    public:
                WortFileIndex(string* value, Liste* WFIliste) ;
                Liste* get_WFIliste() const ;
                string* get_value() ;           
            static  void*   copyWFIf(void* nwfi);
            static  void* copyWFIi(void* nwfi);     
            static  void printWFI(void* nwfi);
            static  void freeWFI(void* nwfi);       
            static  bool eqlWFI(void* nwfi1, void* nwfi2);
 
#endif
};
CPP:
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <iostream>
 
#include "Class_WortFileIndex.hpp"
#include "Class_Str.hpp"
#include "Class_Int.hpp"
 
 
                WortFileIndex::WortFileIndex(string* value, Liste* WFIliste):
            _value(value), _WFIliste(WFIliste) {}               
 
 
                Liste* WortFileIndex::get_WFIliste() const
                            {  return _WFIliste;  } 
                
void*   WortFileIndex::copyWFIf(void* nwfi)
{   WortFileIndex* wfi = (WortFileIndex*) nwfi ;
    string* sneu = new string(*(wfi->_value)) ;
    WortFileIndex* neu = new WortFileIndex(sneu, 
        new Liste(String::copyString, String::printString, String::freeString));
    return neu ;
}
    void*   WortFileIndex::copyWFIi(void* nwfi)
{   WortFileIndex* wfi = (WortFileIndex*) nwfi ;
    string* sneu = new string(*(wfi->_value)) ;
    WortFileIndex* neu = new WortFileIndex(sneu, 
        new Liste(Integer::copyInt, Integer::printInt, Integer::freeInt));
    return neu ;
}           
 
                void WortFileIndex::printWFI(void* nwfi)
{               
                
                WortFileIndex* wfi = (WortFileIndex*) nwfi;
                cout<< *(wfi -> _value) << " ";
                (wfi -> _WFIliste) -> print();
                cout << endl ;
 
}
 
 
                void WortFileIndex::freeWFI(void* nwfi){ delete (WortFileIndex*) nwfi;}
 
 
 
                bool WortFileIndex::eqlWFI(void* nwfi1, void*nwfi2)
{                   
                WortFileIndex*  wfi1 = (WortFileIndex*) nwfi1;
                WortFileIndex*  wfi2 = (WortFileIndex*) nwfi2;
                    return *(wfi1->_value) == *(wfi2->_value);
}
класс Int:
HPP:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#ifndef CLASS_INT_HPP
#define CLASS_INT_HPP
#include <fstream>
 
class Integer
{           
            friend: ofstream& operator<<(ofstream& os, const Name& Ineger);//popitka podruzhit
            
            private:
                        int intvalue;
 
            public:
                    
                    static void* copyInt(void* intvalue) ;
                    static void printInt(void* intvalue) ;
                    static void printInt(os, void* intvalue) ;                  
                    static void freeInt(void* intvalue)  ;
                    static bool cmpInt(void*, void*) ;
} ;
 
 
#endif
CPP:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
#include "Class_Int.hpp"
 
using namespace std ;
 
void* Integer::copyInt(void* intvalue) { return new int(*((int*) intvalue)) ; } //Videlenie pamjati na hipe
void Integer::printInt(void* intvalue) { cout << *((int*) intvalue) << " " ; } //pechat na konsol
void Integer::printInt(os, void* intvalue){ os<< *((int*) intvalue) << " " ;}//neudachnaja popitka pechati v fail((((
void Integer::freeInt(void* intvalue)  { delete (int*) intvalue ; }     //osvobogdenie pamjati
bool Integer::cmpInt(void* intvalue1, void* intvalue2)                                              //sravnenie
{
    int* n1 = (int*) intvalue1 ;
    int* n2 = (int*) intvalue2 ;
    return (*n1 < *n2) ;
}
ofstream& operator<<(ofstream& os, const Name& Integer) //sobstvenno krivaja popitka "podrugit"
{
    os << *((int*)intvalue);
    return os ;
}
класс String
HPP:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#ifndef CLASS_STR_HPP
#define CLASS_STR_HPP
#include <string>
 
using namespace std ; 
 
class String
{
 
            private:
                        string strvalue;
 
            public:
 
                    static void* copyString(void* strvalue) ;
                    static void printString(void* strvalue) ;
                    static void freeString(void* strvalue)  ;
            static bool cmpString(void*, void*) ;
 
 
 
};
#endif
CPP:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include"Class_Str.hpp"
 
                    
 
 
 
 
void* String::copyString(void* strvalue){ return new string(*((string*) strvalue)) ; }
void String::printString(void* strvalue){cout << *((string*) strvalue) << " " ;}
bool String::cmpString(void* strvalue1, void* strvalue2)
{
        string* val1 = (string*)strvalue1 ;
        string* val2 = (string*)strvalue2 ; 
        return (*(val1)>*(val2)) ; 
}
 
 
void String::freeString(void* strvalue){delete (string*)strvalue ;}
вопрос в том, как мне подружить мои классы(String, Integer) с потоком выхода в файл?
только начинаю писать на С++, так что вопрос возможно глупейший)))
буду очень благодарен если ктонибудь обяснит))))
сорри за комменты транслитом в коде, нету русской клавиатуры, тут на виртуалке пишу((((
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.07.2011, 02:10     Не могу сообразить как подружить свой класс с fileoutputstream
Посмотрите здесь:

C++ Не могу сообразить как написать цикл
C++ Не могу сообразить с сортировкой, и с последним пунктом
Соединение массивов. Не могу сообразить. C++
C++ не могу сообразить)
Компиляция кода... не могу сообразить. C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryLaptev
Эксперт C++
1004 / 783 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
17.07.2011, 09:03     Не могу сообразить как подружить свой класс с fileoutputstream #2
Bars911, у тебя в классе после friend двоеточие стоит. VS 2008 - не компилит.
Насколько я помню, тут двоеточие действительно не ставится.
Bars911
0 / 0 / 0
Регистрация: 15.07.2011
Сообщений: 6
17.07.2011, 14:02  [ТС]     Не могу сообразить как подружить свой класс с fileoutputstream #3
ValeryLaptev, без двоеточия тоже не идет,
уже пробовал((
компайлер выдает:
sergej@sergej-laptop:~/Beleg_2CPP$ make Class_Int.o
g++ -c -o Class_Int.o Class_Int.cpp
In file included from Class_Int.cpp:5:
Class_Int.hpp:7: error: ISO C++ forbids declaration of ‘ofstream’ with no type
Class_Int.hpp:7: error: ‘ofstream’ is neither function nor member function; cannot be declared friend
Class_Int.hpp:7: error: expected ‘;’ before ‘&’ token
Class_Int.hpp:16: error: ‘os’ has not been declared
Class_Int.cpp:11: error: variable or field ‘printInt’ declared void
Class_Int.cpp:11: error: ‘os’ was not declared in this scope
Class_Int.cpp:11: error: expected primary-expression before ‘void’
Class_Int.cpp:19: error: ISO C++ forbids declaration of ‘Name’ with no type
Class_Int.cpp:19: error: expected ‘,’ or ‘...’ before ‘&’ token
Class_Int.cpp: In function ‘std::ofstream& operator<<(std::ofstream&, int)’:
Class_Int.cpp:21: error: ‘intvalue’ was not declared in this scope
make: *** [Class_Int.o] Ошибка 1

так что двоеточие это уже от безисходности((
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
17.07.2011, 14:14     Не могу сообразить как подружить свой класс с fileoutputstream #4
std::ofstream
Bars911
0 / 0 / 0
Регистрация: 15.07.2011
Сообщений: 6
17.07.2011, 17:24  [ТС]     Не могу сообразить как подружить свой класс с fileoutputstream #5
OstapBender, cпасибо))))
именно в этом проблемма была, я using namespace std в CPP объявлял вместо того чтоб в HPP это сделать))))
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
17.07.2011, 17:41     Не могу сообразить как подружить свой класс с fileoutputstream #6
Цитата Сообщение от Bars911 Посмотреть сообщение
я using namespace std в CPP объявлял вместо того чтоб в HPP это сделать))))
Ну вот как-раз а .hpp этого делать и не надо. В заголовках надо явно указывать пространство имён. Разве что внутри собственного пространства.
Bars911
0 / 0 / 0
Регистрация: 15.07.2011
Сообщений: 6
17.07.2011, 20:20  [ТС]     Не могу сообразить как подружить свой класс с fileoutputstream #7
Цитата Сообщение от grizlik78 Посмотреть сообщение
Ну вот как-раз а .hpp этого делать и не надо. В заголовках надо явно указывать пространство имён. Разве что внутри собственного пространства.
Несовсем понял, не надо явно заголовочном файле указывать?
или ты имел в виду явное указание пространства имен для каждого элемента?
тоесть декларировать не
using namespace std ;
для всего файла, а например:

std::ClassA::Metode1(){;}
std::ClassA::Metode2(){;}

и т.д.?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.07.2011, 20:30     Не могу сообразить как подружить свой класс с fileoutputstream
Еще ссылки по теме:

C++ Не могу сообразить как написать
C++ не могу сообразить процесс или предпроцесс это
Не могу сообразить рекурсию C++

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

Или воспользуйтесь поиском по форуму:
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
17.07.2011, 20:30     Не могу сообразить как подружить свой класс с fileoutputstream #8
Да, я имел в виду, что
C++
1
using namespace std;
в заголовочном файле использовать не стоит, а вместо этого явно указывать std::string, std::ofstream и т.д.
Yandex
Объявления
17.07.2011, 20:30     Не могу сообразить как подружить свой класс с fileoutputstream
Ответ Создать тему
Опции темы

Текущее время: 17:12. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru