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

класс String - C++

Восстановить пароль Регистрация
 
underwaterspace
2 / 2 / 0
Регистрация: 29.01.2013
Сообщений: 47
16.07.2013, 16:06     класс String #1
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
//main
#include <iostream>
#include "header.h" 
const int ArSize = 10;
const int MaxLen =81;
int main()
{
    using std::cout;
    using std::cin;
    using std::endl;
    String name;
    cout <<"Hi, what's your name?\n>> ";
    cin >> name;
    cout << name << ", please enter up to " << ArSize
        << " short sayings <empty line to quit>:\n";
    String sayings[ArSize];     
    char temp[MaxLen];          
    int i;
    for (i = 0; i < ArSize; i++)
    {
        cout << i+1 << ": ";
        cin.get(temp, MaxLen);
        while (cin && cin.get() != '\n')
            continue;
        if (!cin || temp[0] == '\0')    
            break;              
        else
            sayings[i] = temp;  
    }
    int total = i;              
 
    if ( total > 0)
    {
        cout << "Here are your sayings:\n";
        for (i = 0; i < total; i++)
            cout << sayings[i][0] << ": " << sayings[i] << endl;
 
        int shortest = 0;
        int first = 0;
        for (i = 1; i < total; i++)
        {
            if (sayings[i].length() < sayings[shortest].length())
                shortest = i;
            if (sayings[i] < sayings[first])
                first = i;
        }
        cout << "Shortest saying:\n" << sayings[shortest] << endl;;
        cout << "First alphabetically:\n" << sayings[first] << endl;
        String me;
        me= sayings[0]+"mi";
        cout << "sayings1+mi: " <<me<< endl;
        cout << "This program used "<< String::HowMany() 
            << " String objects. Bye.\n";
    }
    else
        cout << "No input! Bye.\n";
    system("PAUSE");
    return 0; 
}
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
//header
#ifndef STRING1_H_
#define STRING1_H_
#include <iostream>
using std::ostream;
using std::istream;
 
class String
{
private:
    char * str;             
    int len;                
    static int num_strings; 
    static const int CINLIM = 80;  
public:
    String(const char * s); 
    String();               
    String(const String &); 
    ~String();              
    int length () const { return len; }
    String & operator=(const String &);
    String & operator=(const char *);
    char & operator[](int i);
    const char & operator[](int i) const;
    friend bool operator<(const String &st, const String &st2);
    friend bool operator>(const String &st1, const String &st2);
    friend bool operator==(const String &st, const String &st2);
    friend String & operator+(const String &st1,const char * s);
    friend ostream & operator<<(ostream & os, const String & st);
    friend istream & operator>>(istream & is, String & st);
    static int HowMany();
};
#endif
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
//method
#include <cstring>                 
#include "header.h"                
using std::cin;
using std::cout;
 
int String::num_strings = 0;
int String::HowMany()
{
    return num_strings;
}
String::String(const char * s) 
{
    len = std::strlen(s);      
    str = new char[len + 1];   
    std::strcpy(str, s);       
    num_strings++;             
}
 
String::String()               
{
    len = 4;
    str = new char[1];
    str[0] = '\0';             
    num_strings++;
}
 
String::String(const String & st)
{
    num_strings++;             
    len = st.len;              
    str = new char [len + 1];  
    std::strcpy(str, st.str);  
}
String::~String()              
{
    --num_strings;             
    delete [] str;             
}
String & String::operator=(const String & st)
{
    if (this == &st)
        return *this;
    delete [] str;
    len = st.len;
    str = new char[len + 1];
    std::strcpy(str, st.str);
    return *this;
}
String & String::operator=(const char * s)
{
    delete [] str;
    len = std::strlen(s);
    str = new char[len + 1];
    std::strcpy(str, s);
    return *this;
}
char & String::operator[](int i)
{
    return str[i];
}
const char & String::operator[](int i) const
{
    return str[i];
}
bool operator<(const String &st1, const String &st2)
{
    return (std::strcmp(st1.str, st2.str) < 0);
}
bool operator>(const String &st1, const String &st2)
{
    return st2 < st1;
}
bool operator==(const String &st1, const String &st2)
{
    return (std::strcmp(st1.str, st2.str) == 0);
}
ostream & operator<<(ostream & os, const String & st)
{
    os << st.str;
    return os; 
}
istream & operator>>(istream & is, String & st)
{
    char temp[String::CINLIM];
    is.get(temp, String::CINLIM);
    if (is)
        st = temp;
    while (is && is.get() != '\n')
        continue;
    return is; 
}
String & operator+(const String &st1,const char * s)
{
    String set;
    delete [] set.str;
    set.len=std::strlen(s)+st1.len+1;
    set.str=new char[set.len];
    std::strcpy(set.str,st1.str);
    std::strcat(set.str,s);
    return set;
}
Помогите, совершил где-то между 93-102 глупую ошибку, вылезает std::bad_alloc.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.07.2013, 16:06     класс String
Посмотрите здесь:

Класс Person. Класс String C++
C++ класс string
Класс String C++
Класс <string> C++
Разработать класс String C++
C++ Класс String
C++ Класс String
C++ Класс string

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
16.07.2013, 16:13     класс String #2
Цитата Сообщение от underwaterspace Посмотреть сообщение
Помогите, совершил где-то между 93-102 глупую ошибку, вылезает std::bad_alloc.
Возвращаете ссылку на временную переменную.
Сделайте так:
C++
1
2
3
String operator+(const String &st1,const char * s){
//...
}
ну и прототип поменяйте тоже
Yandex
Объявления
16.07.2013, 16:13     класс String
Ответ Создать тему
Опции темы

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