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

Шаблоны, классы, строки - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
Metal_666_
15 / 15 / 2
Регистрация: 19.10.2009
Сообщений: 187
11.02.2010, 12:50     Шаблоны, классы, строки #1
Наши преподы решили сделать нам сюрприз на выч. рпактику. Нужна помощ, там в коде ошибка у меня, уже мозги просто разрываются. Вот задание:

Задание 1. Так как поведение приложения зависит от конфигурации, необходимо создать класс, хранящий всю конфигурацию. Этот класс хранит конфигурацию по умолчанию, а также может загружать конфигурацию из указанного файла. Кроме того, данный класс предоставляет доступ к некоторому значению по строковому ключу.
Внутри указанного класса всю конфигурационную информацию удобно хранить в виде двух списков: ключей и значений. Одинаковые индексы в данных списках задают соответствие ключей и значений.
Вот собственно сама конфигурация по умолчанию
format=txt
bus=bus.txt
route=route.txt
flight=flight.txt


Задание 2. Для хранения списков строк необходимо разработать класс-шаблон, реализовав в нем конструктор, конструктор копирования, оператор присваивания, оператор обращения к элементу по индексу. Также необходимо реализовать метод добавления нового элемента в конец списка.
Задание 3. Реализовать свой класс для обработки динамических строк. В данном классе необходимо реализовать те же методы, что и в списке (кроме добавления элемента в строку). Нужно также перегрузить оператор сложения. Удобно в этом классе создать метод, разбивающий текущую строку на список подстрок по некоторому символу-разделителю, который передается данному методу.

вот коды

Это второе задание(где то тут ошибка)
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
template <class T> class List
{
    private:
    T *data;                   //   массив указателей
    int size;                  //   размер списка
    int Bufer;
    public:
    List(int n = 0);           //   конструктор
    List(const List &list);    //   конструктор копирования
    void push(const T&);       //   вставка элемента в конец списка
    ~List(){delete []data;}                      //   деструктор
    T& operator [](int i){return data[i];}  //оператор обращения к элементу по индексу
    List & operator = (const List & list);  //оператор присваивания
    int getSize() const {return size;}      //ф-ция, возвращающая размер списка
    T getDataList(int n) {return data[n];}
 
 
};
 
template <class T> List<T>::List(const List &list)    //конструктор копирования
    {
        size = list.getSize();
        for (int i = 0 ; i < size ; i++)
            push(list.data[i]);
 
    }
 
template <class T> List<T> & List<T>::operator = (const List &list)
    {
        if (this == &list)
            return *this;
        int size1 = list.getSize();
    delete []data;
        T* data = new T[size1];
        for (int i = 0; i < size1 ; i++)
          push(list.data[i]);
        return *this;
    }   
 
template <class T> List<T>::List(int n)                 //конструктор
    {
        data = new T[n];
        size = 0;
        Bufer = n;
    }
                                                        //вставка элемента в конец списка
template <class T> void List<T>::push(const T &item)
    {
        if (size >= Bufer)
            {
                T *save = new T [Bufer+=10];
                for (int i = 0 ; i < size ; i++)
                    {
                        save[i] = data[i];
                    }
                delete []data;
                data = new T[Bufer];
                data = save;
                delete [] save;
            }
                data[size++] = item;
 
    }
Вот третье(Вроде все правильно)

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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
class String
{
        char * string;
    public:
        String();
        String(char * string);
        String(const String & string);
        int size() const;                               // метод, не изменяющий объект
        List<String> split(char separator);
        char & operator [] (unsigned index){return string[index];};
        String & operator = (const String & string);
        String & operator += (const String & string);
        bool operator == (String str){return strcmp(string,str.string)==0;};
        ~String(){delete []string;};
        friend istream & operator >> (istream & stream,
                                      String & string);
        friend ostream & operator << (ostream & stream,
                                      const String & string);
                char * c_str() {return string;};
};
 
String operator + (const String & string1, const String & string2);
 
String::String()
{
        string = NULL;
}
 
String::String(char * str)
{
 
        string = new char[strlen(str)+1];
        strcpy(string, str);
 
}
 
String::String(const String & str)
{
        string = NULL;
        *this = str;
}
 
int String::size() const
{
        return strlen(string);
}
 
List<String> String::split(char separator)
{
    List<String> result;
    if(string)
    {
        char * current = string;
        if(separator)
        {
            char * separatorPosition;
            while(*current && (separatorPosition = strchr(current, separator)) != NULL)
            {
                int partSize = separatorPosition - current;
                char * buffer = new char[partSize + 1];
                strncpy(buffer, current, partSize);
                buffer[partSize] = 0;
                result.push(String(buffer));
                delete [] buffer;
                current = separatorPosition + 1;
            }
        }
        result.push(String(current));
    }
    return result;
}
 
String & String::operator = (const String & str)
{
        if(string == str.string)
        {
                return *this;
        }
        delete []string;
        string = new char[str.size()+1];
        strcpy(string, str.string);
        return *this;
}
 
 
 
String & String::operator += (const String & str)
{
        char *buf = new char[size()+str.size()+1];
        strcpy(buf, string);
        strcat(buf, str.string);
        delete [] string;
        string = buf;
        return *this;
}
 
String operator + (const String & string1,const String & string2)
{
        String result = string1;
        result += string2;
        return result;
}
 
istream & operator >> (istream & stream,String & string)
{
        char bufMass[100];
        stream.getline(bufMass,100);
        String str(bufMass);
        string = str;
        return stream;
}
 
ostream & operator << (ostream & stream,const String & string)
{
        return stream<<string.string;
}
Ошибку выдает при данном действии
(Тут я пытаюсь создать список строк, если где то с логикой накосячил поправьте)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int main(int argc, char* argv[])
{
        List<String> list;
        String str;
        for(int i = 0; i<3 ; i++)
                {
                        cin>>str;
                        list.push(str);
                }
 
 
 
        system("pause");
 
        return 0;
}
Вобщем просьба помоч поправить код(ко 2 и 3 заданию), и если кому не лень помочь с первым,потому что мозга уже просто нет, и так уже серьезно опаздываю.Я понимаю что намного легче было бы сделать через контейнеры,но нам сказали сделать все вручнуюЗарание спасибо.

Добавлено через 1 час 50 минут
Подправил мэйн

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int main(int argc, char* argv[])
{
        List<String> list(1);
        String str;
        for(int i = 0; i<3 ; i++)
                {
                        cin>>str;
                        list.push(str);
 
                }
 
 
 
 
 
        system("pause");
 
        return 0;
}
Вроде работает, но в самом конце при нажатии Enter выкидывает и указывает на сточку
C++
1
~String(){delete []string;};
Что это может быть?И как с этим бороться?

Добавлено через 11 часов 11 минут
Разобрался, помощи больше не надо...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.02.2010, 12:50     Шаблоны, классы, строки
Посмотрите здесь:

C++ Классы строки
C++ Классы и строки
Классы и строки C++
C++ классы полиморфизм шаблоны C++
C++ Классы!Строки!Моделирование!
двумерный массив классы строки C++
C++ Шаблоны и вложенные классы - синтаксис
C++ [Классы, Наследование, Шаблоны] Добавление записи в список

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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