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

Сложение двух строк - C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.77
zhenya.ya
1 / 1 / 0
Регистрация: 29.11.2009
Сообщений: 304
06.03.2011, 18:11     Сложение двух строк #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
class base
{
private:
    char* str;
    int size;
public:
    base( char *str1) 
    { 
        size = strlen(str1);
        str = new char[size+1];
        strcpy(str,str1); 
    }
    ~base()
    {
        size = 0; delete[] str;
    }
        void print() { cout<<str<<endl;}
    base operator + (base bs);
};
 
base base::operator +(base bs)
{
    base result ("            ");
    int length;
    strcpy(result.str,bs.str);
    length = strlen(bs.str);
    memcpy(result.str,str+length,strlen(str));
    result.size= strlen(result.str)+1;
    result.str[result.size] = '\0';
    return (result);
}
 
void main()
{
    base obj1("111"),obj2("222"),obj3("                      ");
    obj3 = obj1 + obj2;
    obj3.print();
    system("pause");
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.03.2011, 18:11     Сложение двух строк
Посмотрите здесь:

Сложение двух матриц C++
C++ Сложение двух элементов
C++ Сложение двух массивов
C++ Сложение строк
C++ Сложение двух чисел
Сложение строк C++
Сложение строк C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
IrineK
Заблокирован
06.03.2011, 19:38     Сложение двух строк #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вот так сумма получается:

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
class base
{
private:
        char* str;
        int size;
public:
    base() {};
    base(char *str1) 
        { 
                size = strlen(str1);
                str = new char[size+1];
                strcpy(str,str1); 
        }
        ~base(){}
        void print() { cout<<str<<endl;}
        base operator + (base bs);
};
 
base base::operator +(base bs)
{
        strcat(str,bs.str);
        size= strlen(str);
        return (str);
}
 
void main()
{
    char obj1[80],obj2[80];
    cout<<"Input two lines\n";
    cin.getline(obj1,80);
    cin.getline(obj2,80);
    base s1(obj1),s2(obj2);
    s1.print();
    base s3;
    s3 = s1 + s2;
        s3.print();
    
    system("pause");
}
zhenya.ya
1 / 1 / 0
Регистрация: 29.11.2009
Сообщений: 304
06.03.2011, 20:13  [ТС]     Сложение двух строк #3
Даже и так не работает и base s3; (тут ругается на отсутствие конструктора по умолчанию).
IrineK
Заблокирован
06.03.2011, 21:12     Сложение двух строк #4
Вы четко код скопипастили. Там же есть конструктор по умолчанию:
C++
1
base() {};
Пожалуйста, сделайте творчески ^C ^V, а потом уже разбирайтесь.
zhenya.ya
1 / 1 / 0
Регистрация: 29.11.2009
Сообщений: 304
06.03.2011, 22:07  [ТС]     Сложение двух строк #5
У меня и с констуктором по умолчанию не работает. Вы же не думаете , что я бы не догадался попробывать его добавить
IrineK
Заблокирован
06.03.2011, 22:27     Сложение двух строк #6
А еще изменились: дестуктор и перегрузка плюса.
zhenya.ya
1 / 1 / 0
Регистрация: 29.11.2009
Сообщений: 304
06.03.2011, 22:34  [ТС]     Сложение двух строк #7
Вот!, а на дестр. я то и не обратил внимания. А не могли бы Вы пояснить почему он долже быть именно таким ??
IrineK
Заблокирован
06.03.2011, 22:38     Сложение двух строк #8
Деструктор автоматически запускается каждый раз, когда программа уничтожает объект. Дополнительно стараться не нужно.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9383 / 5433 / 916
Регистрация: 25.07.2009
Сообщений: 10,428
07.03.2011, 02:12     Сложение двух строк #9
Цитата Сообщение от IrineK Посмотреть сообщение
Деструктор автоматически запускается каждый раз, когда программа уничтожает объект. Дополнительно стараться не нужно.
Вот в деструкторе крайне не помешало бы что-то вроде
C++
1
2
3
4
...
if ( str )
  delete [] str;
...
rangerx
1918 / 1527 / 139
Регистрация: 31.05.2009
Сообщений: 2,891
07.03.2011, 02:27     Сложение двух строк #10
Применение delete[] к нулевому указателю абсолютно безопасно. if здесь не нужен. А вот реализовать конструктор копий, и operator= очень бы не помешало.
zhenya.ya
1 / 1 / 0
Регистрация: 29.11.2009
Сообщений: 304
08.03.2011, 01:37  [ТС]     Сложение двух строк #11
А у меня не работает если в деструтор забить это. Почему же так?
IrineK
Заблокирован
08.03.2011, 03:59     Сложение двух строк #12
У Праты (глава 11) написано:

delete применять в деструкторе, если new применяется в конструкторе.
Следить, чтобы все конструкторы были совместимы с деструкторами.
Логично.
rangerx
1918 / 1527 / 139
Регистрация: 31.05.2009
Сообщений: 2,891
08.03.2011, 09:43     Сложение двух строк #13
Цитата Сообщение от zhenya.ya Посмотреть сообщение
А у меня не работает если в деструтор забить это. Почему же так?
Цитата Сообщение от rangerx Посмотреть сообщение
А вот реализовать конструктор копий, и operator= очень бы не помешало.
.....
zhenya.ya
1 / 1 / 0
Регистрация: 29.11.2009
Сообщений: 304
08.03.2011, 15:39  [ТС]     Сложение двух строк #14
Я попробывал подкорректировать ... насколько неправильно и что?
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
class base
{
private:
    char* str;
    int size;
public:
    base(){size = 0; str = 0;}
    base( char *str1) 
    { 
        size = strlen(str1);
        str = new char[size+1];
        strcpy(str,str1); 
    }
    base (const base &bs3);
    ~base()
    {
        if(str)
        delete []str;
    }
        void print() { cout<<str<<endl;}
    base operator + (base bs);
    base operator = (base bs1);
};
 
base base::operator +(base bs)
{
    strcat(str,bs.str);
    size = strlen(str);
    return (str);
}
base base::operator =(base bs1)
{
    size = bs1.size;
    str = bs1.str;
    return (str);
}
base::base(const base &bs3)
{
    size = bs3.size;
    str = new char [ bs3.size ];
    strcpy(str,bs3.str);
}
int main()
{
    char obj1[80],obj2[80];
    try
    {
    cout<<" input:"<<endl;
    cin>>obj1;
    cin>>obj2;
    if(strlen(obj1) >10 || strlen(obj2) >10) throw err("\n leave for boards\n");
    }
catch(err ob)
{
    ob.get_error();
}
base s1(obj1),s2(obj2);
base s3;
    s3 =s1+s2;
    s3.print();
    
    system("pause");
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.03.2011, 01:24     Сложение двух строк
Еще ссылки по теме:

Сложение двух строк C++
C++ Сложение двух строк
C++ Конкатенация двух нибблов (сложение двух полубайт в байт)
Сложение двух строк, ошибки C++
C++ Сделать сложение двух строк

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

Или воспользуйтесь поиском по форуму:
rangerx
1918 / 1527 / 139
Регистрация: 31.05.2009
Сообщений: 2,891
09.03.2011, 01:24     Сложение двух строк #15
Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
#include <iostream>
#include <cstring>
 
class base
{
    private:
        size_t size_;
        char* data_;
 
    public:
        base()
            : size_(0),
              data_(0)
        {
        }
 
        base(const char* s)
            : size_( strlen(s) ),
              data_(new char[size_ + 1])
        {
            strcpy(data_, s);
        }
 
        base(const base& rhs)
            : size_(rhs.size_),
              data_(new char[size_ + 1])
        {
            strcpy(data_, rhs.data_);
        }
 
        ~base()
        {
            delete[] data_;
        }
 
        void print() const
        {
            std::cout << data_ << std::endl;
        }
 
        const base operator+(const base& rhs) const
        {
            base t;
            t.size_ = size_ + rhs.size_;
            t.data_ = new char[t.size_ + 1];
 
            strcpy(t.data_, data_);
            strcat(t.data_, rhs.data_);
 
            return t;
        }
 
        base& operator=(const base& rhs)
        {
            if(this != &rhs)
            {
                if(size_ != rhs.size_)
                {
                    delete[] data_;
                    size_ = rhs.size_;
                    data_ = new char[rhs.size_ + 1];
                }
 
                strcpy(data_, rhs.data_);
            }
 
            return *this;
        }
};
 
int main()
{
    base b1 = "text1";
    b1.print();
 
    base b2 = "text2";
    b2.print();
 
    base b3(b1 + b2);
    b3.print();
 
    base b4;
    b4 = (b1 + b2 + b3);
    b4.print();
 
    return 0;
}
Yandex
Объявления
09.03.2011, 01:24     Сложение двух строк
Ответ Создать тему
Опции темы

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