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

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

Войти
Регистрация
Восстановить пароль
 
AltPeople
10 / 10 / 1
Регистрация: 25.09.2008
Сообщений: 73
#1

Перегрузка + для строк - C++

19.08.2009, 13:09. Просмотров 925. Ответов 14
Метки нет (Все метки)

есть задача перегрузить = и + таким образом чтобы: строка1=срока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
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
//STRING2.H
#ifndef STRING2_H
#define STRING2_H
 
#include <iostream.h>
 
class String
{
friend String &operator+(const String &t_s2, const String &t_s3);
 
public:
       String (const char * = "");
       String (const String &);
       ~String();
       const String &operator=(const String &);
       String &operator+=(const String &);
       void setLength (int);
       int getLength () const;
private:      
       char *sPtr;
       int length;       
};
 
#endif
 
 
//STRING2.CPP
#include <iostream.h>
#include <iomanip.h>
#include <string.h>
#include <assert.h>
#include "string2.h"
 
String::String (const char *s)
{
   cout<<"Constructor preobrazovaniya: "<<s<<endl;
   length=strlen(s);
   sPtr = new char[length+1];
   assert(sPtr!=0);
   strcpy(sPtr,s);
}
 
String::String (const String &copy)
{
   cout<<"Constructor copii "<<copy.sPtr<<endl;
   length=copy.length;
   sPtr = new char [length+1];
   assert (sPtr!=0);
   strcpy(sPtr, copy.sPtr);
}
String::~String()
{
    cout<<"Destructor: "<<sPtr<<endl;
    delete [] sPtr;                              
}
 
const String &String::operator=(const String &right)
{
      cout<<"Vizov operator= \n";
      if (&right != this)
      {
         delete [] sPtr;
         length=right.length;
         sPtr = new char [length+1];
         assert (sPtr != 0);
         strcpy(sPtr,right.sPtr);
      }      
      else
      {
          cout<<"Popitka samoprisvaivaniya String\n";    
      }
      return *this;
}
 
String &String::operator+=(const String &right)
{
       char *tempPtr = sPtr;
       length+=right.length;
       sPtr = new char[length+1];
       assert(sPtr != 0);
       strcpy(sPtr,tempPtr);
       strcat(sPtr,right.sPtr);
       delete [] tempPtr;
       
       return *this;
}
void String::setLength (int x)
{
     length=x;     
}
 
int String::getLength() const
{
    return length;
}
 
String &operator+(String &t_s2,String &t_s3)
{
       String t_s1;
       t_s1.setLength(t_s2.getLength()+t_s3.getLength()+1);
       strcpy(t_s1.sPtr,t_s2.sPtr);//!!!пишет что sPtr закрыт
       strcpy(t_s1.sPtr,t_s3.sPtr);//!!!пишет что sPtr закрыт
       return t_s1;
}
и еще вопрос, в данном случае я + перегружаю как дружественную ф-цию, а можно сделать так чтобы она была э-том класса
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.08.2009, 13:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перегрузка + для строк (C++):

Перегрузка оператора сравнения для строк - C++
В общем мне нужно сделать такую перегрузку, что бы вместо символа, например, &quot;&lt;&quot; выполнялось сравнение через strcmp, например строка...

Перегрузка операторов умножения и присваивания для строк. - C++
Помогите, пожалуйста, реализовать перегрузку операторов умножения и присваивания для такого задания со строками: &quot;Описать класс, 3...

Перегрузка операторов вывода для русификации строк - C++
#include &lt;iostream&gt; #include &lt;string&gt; #include &lt;windows.h&gt; using namespace std; friend ostream operator &lt;&lt; (ostream &amp;in,...

Перегрузка операций для класса целых двоичных чисел в виде строк - C++
нужна ваша помощь, пожалуйста Создать класс, который запоминает целые двоичные числа в виде строк. Перегрузить операции +, ++ и +=.

Сложение строк, перегрузка + в классе - C++
Есть вот класс String как мне перегрузить + что бы я мог использовать так a = &quot;Hello&quot;+ b; тоисть мне объекту b нужно сложить со строкой...

Перегрузка операторов и слияние строк типа char* - C++
Доброго времени суток! Есть класс, для объектов которого перегружен оператор +. Класс представляет собой массив строк типа char*. ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Alexandoros
228 / 66 / 4
Регистрация: 02.06.2009
Сообщений: 280
19.08.2009, 14:11 #2
const пропустил
ISergey
Maniac
Эксперт С++
1373 / 884 / 52
Регистрация: 02.01.2009
Сообщений: 2,653
Записей в блоге: 1
19.08.2009, 14:16 #3
C++
1
2
3
4
5
class String
{
friend String &operator+(const String &t_s2, const String &t_s3);
//это раздел private!! 
public:
Alexandoros
228 / 66 / 4
Регистрация: 02.06.2009
Сообщений: 280
19.08.2009, 14:25 #4
Цитата Сообщение от ISergey Посмотреть сообщение
C++
1
2
3
4
5
class String
{
friend String &operator+(const String &t_s2, const String &t_s3);
//это раздел private!! 
public:
Фигню советуеш. RTFM friend.
ISergey
Maniac
Эксперт С++
1373 / 884 / 52
Регистрация: 02.01.2009
Сообщений: 2,653
Записей в блоге: 1
19.08.2009, 14:38 #5
Цитата Сообщение от Alexandoros Посмотреть сообщение
Фигню советуеш. RTFM friend.
точно.. Завтыкал..
AltPeople
10 / 10 / 1
Регистрация: 25.09.2008
Сообщений: 73
19.08.2009, 14:53  [ТС] #6
спасибо за const
только теперь выводит каракули, видимо ссылаюсь на непонятную область
Alexandoros
228 / 66 / 4
Регистрация: 02.06.2009
Сообщений: 280
19.08.2009, 15:03 #7
Цитата Сообщение от AltPeople Посмотреть сообщение
спасибо за const
только теперь выводит каракули, видимо ссылаюсь на непонятную область
Код нужно приводить, где ошибки
ISergey
Maniac
Эксперт С++
1373 / 884 / 52
Регистрация: 02.01.2009
Сообщений: 2,653
Записей в блоге: 1
19.08.2009, 15:07 #8
Цитата Сообщение от AltPeople Посмотреть сообщение
только теперь выводит каракули, видимо ссылаюсь на непонятную область
угу.. так переделай..
C++
1
2
3
4
5
6
class String
{
    friend String operator + (const String &, const String &); //!
 
public:
    String &operator = (const String &); //!
Фенрир
42 / 38 / 2
Регистрация: 05.01.2009
Сообщений: 394
19.08.2009, 15:08 #9
ссылку на локальную переменную разве можно возвращать?
C++
1
2
3
     String t_s1;
     //----
       return t_s1;
AltPeople
10 / 10 / 1
Регистрация: 25.09.2008
Сообщений: 73
19.08.2009, 15:41  [ТС] #10
переделал перегрузку +
C++
1
2
3
4
5
6
7
8
9
10
String &operator+(const String &t_s2, const String &t_s3)
{
       String t_s1;
       delete [] t_s1.sPtr;
       t_s1.length=t_s2.length+t_s3.length+1;
       t_s1.sPtr = new char[t_s1.length];
       strcpy(t_s1.sPtr,t_s2.sPtr);
       strcat(t_s1.sPtr,t_s3.sPtr);
       return t_s1;//результат нормальный s2+s3!!!
}
return t_s1; - возвращает нормальную сцепленную строку
а вот при присваивании выходят каракули s1=s2+s3 => абракадабра

ничего не могу понять, перегрузка = в других примерах работала нормально(((((((((

Добавлено через 1 минуту 59 секунд
ссылку на локальную переменную разве можно возвращать?
я в этом не силен, но судя по примерам, которые я читал при решении данной задачи, от можно , посмотри еще тут строка с 96 по 119 в первой месагеПерегрузка оператора +

Добавлено через 9 минут 10 секунд
вот привожу окончательный код
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
117
118
//STRING2.H
#ifndef STRING2_H
#define STRING2_H
 
#include <iostream.h>
 
class String
{
friend String &operator+(const String &t_s2, const String &t_s3);
friend ostream &operator<<(ostream &, const String &);
friend istream &operator>>(istream &, String &);
public:
       String (const char * = "");
       String (const String &);
       ~String();
       const String &operator=(const String &);
       int getLength () const;
private:      
       char *sPtr;
       int length;       
};
 
#endif
 
//STRING2.CPP
#include <iostream.h>
#include <iomanip.h>
#include <string.h>
#include <assert.h>
#include "string2.h"
 
String::String (const char *s)
{
   length=strlen(s);
   sPtr = new char[length+1];
   assert(sPtr!=0);
   strcpy(sPtr,s);
}
 
String::String (const String &copy)
{
   length=copy.length;
   sPtr = new char [length+1];
   assert (sPtr!=0);
   strcpy(sPtr, copy.sPtr);
}
String::~String()
{
    delete [] sPtr;                              
}
 
const String &String::operator=(const String &right)
{
      if (&right != this)
      {
         delete [] sPtr;
         length=right.length;
         sPtr = new char [length+1];
         assert (sPtr != 0);
         strcpy(sPtr,right.sPtr);
      }      
      else
      {
          cout<<"Popitka samoprisvaivaniya String\n";    
      }
      return *this;
}
 
int String::getLength() const
{
    return length;
}
 
String &operator+(const String &t_s2, const String &t_s3)
{
       String t_s1;
       delete [] t_s1.sPtr;
       t_s1.length=t_s2.length+t_s3.length+1;
       t_s1.sPtr = new char[t_s1.length];
       strcpy(t_s1.sPtr,t_s2.sPtr);
       strcat(t_s1.sPtr,t_s3.sPtr);
       cout<<"t_s1.sPtr after all = "<<t_s1.sPtr<<endl;
       return t_s1;
}
 
ostream &operator<<(ostream &output, const String &s)
{
    output<<s.sPtr;
    return output;        
}
 
istream &operator>>(istream &input, String &s)
{
    char temp[100];
    input>>setw(100)>>temp;
    s=temp;
    return input;        
}
 
//8.5
#include <iostream.h>
#include "string2.h"
int main()
{
char ch='y';
    
    do{
        String s1, s2("Fuck "),s3("you!");
        
        s1=s2+s3;
        cout<<s1<<endl;
        
        
        cout<<"\n\nContinue y/n? "<<endl;
        cin>>ch;
     }while (ch=='y');
     return 0;
}
присваивает s1 не s2+s3, а какой-то бред,
скоро крыша рухнет, не могу понять гле бок((((((((((
ISergey
Maniac
Эксперт С++
1373 / 884 / 52
Регистрация: 02.01.2009
Сообщений: 2,653
Записей в блоге: 1
19.08.2009, 15:58 #11
Вот немного поправил
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
#include <iostream>
#include <cassert>
 
class String
{
    friend String operator + (const String &, const String &);
    friend std::ostream &operator<<(std::ostream &, const String &);
    friend std::istream &operator>>(std::istream &, String &);
public:
    String (){
        sPtr = 0;
    }
    String (const char *);
    String (const String &);
 
    ~String();
    String &operator = (const String &);
    String &operator = (const char *);
 
    int getLength () const;
private:      
    char *sPtr;
    int length;       
};
 
String::String (const char *s)
{
    std::cout<< "Constructor preobrazovaniya: " << s << std::endl;
    length = strlen(s);
    sPtr = new char[length+1];
    //assert(sPtr!=0);
    strcpy(sPtr,s);
}
 
String::String (const String &rhs)
{
    *this = rhs;
}
String::~String()
{
    if(sPtr){
        std::cout << "Destructor: " << sPtr << std::endl;
        delete [] sPtr;
    }                              
}
 
String &String::operator=(const String &right)
{
    if(&right == this)
        return  *this;
 
    if(sPtr)
        delete [] sPtr;
    length = right.length;
    sPtr = new char [length +1 ];
    //assert (sPtr != 0);
    strcpy(sPtr,right.sPtr);
    return *this;
}
 
String &String::operator=(const char* rhs)
{
    if(sPtr)
        delete [] sPtr;
 
    length = strlen(rhs);
    sPtr = new char [length +1 ];
    //assert (sPtr != 0);
    strcpy(sPtr,rhs);
    return *this;
}
 
int String::getLength() const
{
    return length;
}
 
String operator + (const String &t_s2, const String &t_s3)
{
    String t_s1;
    t_s1.length = t_s2.length + t_s3.length;
    t_s1.sPtr = new char[t_s1.length + 1];
 
    strcpy(t_s1.sPtr,t_s2.sPtr);
    strcat(t_s1.sPtr,t_s3.sPtr);
 
    std::cout<<"t_s1.sPtr after all = "<<t_s1.sPtr<<std::endl;
 
    return t_s1;
}
 
std::ostream &operator<<(std::ostream &output, const String &s)
{
    output << s.sPtr;
    return output;        
}
 
std::istream &operator>>(std::istream &input, String &s)
{
    char buff[256];
    input >> buff;
    s = buff;
    return input;        
}
int main()
{
    String s1("aaaa"), s2("ffff"), s3;
 
    s3 = s1 + s2;
    std::cout << s3 << std::endl;
    return 0;
}
AltPeople
10 / 10 / 1
Регистрация: 25.09.2008
Сообщений: 73
19.08.2009, 16:03  [ТС] #12
спасибо большое сейчас попробую разобраться,
а еще вычитал, что При выходе из функции локальный объект уничтожается,а значит и массив t_s1.sPtr!
Alexandoros
228 / 66 / 4
Регистрация: 02.06.2009
Сообщений: 280
19.08.2009, 16:08 #13
омг, ну тебе ж уже 2 человека сказали.

friend String operator+(const String &t_s2, const String &t_s3);
String operator+(const String &t_s2, const String &t_s3)

БЕЗ &
ISergey
Maniac
Эксперт С++
1373 / 884 / 52
Регистрация: 02.01.2009
Сообщений: 2,653
Записей в блоге: 1
19.08.2009, 16:09 #14
Цитата Сообщение от AltPeople Посмотреть сообщение
а еще вычитал, что При выходе из функции локальный объект уничтожается,а значит и массив t_s1.sPtr!
AltPeople
10 / 10 / 1
Регистрация: 25.09.2008
Сообщений: 73
19.08.2009, 17:14  [ТС] #15
Цитата Сообщение от Alexandoros Посмотреть сообщение
омг, ну тебе ж уже 2 человека сказали.

friend String operator+(const String &t_s2, const String &t_s3);
String operator+(const String &t_s2, const String &t_s3)

БЕЗ &
я с этим сейчас и разбираюсь, не могу понять почему но когда я убираю "&" у меня вообще бред получается , среда dev-c++

Добавлено через 49 минут 30 секунд
Чуваки всем спасибо, я разобрался все работает!!!!!!
топ можно закрывать
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.08.2009, 17:14
Привет! Вот еще темы с ответами:

Перегрузка оператора operator+() в пользовательском классе (сложение строк) - C++
Хотел научить класс складывать строки, но на моменте освобождения памяти temp происходит ошибка. Поля класса: char* Str, int length...

Класс строк, перегрузка операторов. Как вернуть объект класса - C++
Коротко: # include &quot;MyString.h&quot; void main () { My_String Address; Address = &quot;Link&quot;; Res = Address + &quot;OoO&quot;; } # ifndef...

Перегрузка оператора == для string для структуры - C++
Есть программа #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;fstream&gt; #include &lt;string&gt; #include &lt;stdlib.h&gt; using namespace...

Перегрузка new для модуля - C++
Добрый день, Если у пользователя на руках *.h и *.lib данного модуля, в котором обращение к OC за дин памятью, не возможно...


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

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

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