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

Копии - C++

Восстановить пароль Регистрация
 
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
17.03.2010, 09:22     Копии #1
C++
1
2
3
4
5
6
7
8
9
10
11
class a
{
 ...
 public:
 a (a &o);
 a &operator = (a &o);
 ...
};
....
a o1,o2;
o2=o1;// Здесь вызывается только конструктор, но не оператор. Это нормально?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.03.2010, 09:22     Копии
Посмотрите здесь:

C++ конструктор копии
конструктор копии и операторы C++
Вызов конструктора копии C++
Конструктор копии C++
C++ конструктор копии
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,308
17.03.2010, 09:50     Копии #2
Нет. Приведи код, воспроизводящий данную проблему, поглядим.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
17.03.2010, 11:13  [ТС]     Копии #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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
//=================================================================================================
class TString
{
//-------------------------------------------------------------------------------------------------
 protected:
 public:
//-------------------------------------------------------------------------------------------------
  char              *Data; 
  unsigned long int  Number;
//-------------------------------------------------------------------------------------------------
  void               Clear       (                         );
//-------------------------------------------------------------------------------------------------
 public:     
//-------------------------------------------------------------------------------------------------
                     TString     (                         );                    
                     TString     (TString           &String);                     
//-------------------------------------------------------------------------------------------------
                    ~TString     (                         );
//-------------------------------------------------------------------------------------------------
  TString            operator =  (TString           &String);                    
  TString            operator =  (char              *String);
//-------------------------------------------------------------------------------------------------                    
  friend                    
  istream           &operator >> (istream           &Stream,
                                  TString           &String);                               
//-------------------------------------------------------------------------------------------------
  friend                    
  ostream           &operator << (ostream           &Stream,
                                  TString           &String);                               
//-------------------------------------------------------------------------------------------------
  void               operator += (char               Char  );
//-------------------------------------------------------------------------------------------------
  char              &operator [] (unsigned long int  Index );
//-------------------------------------------------------------------------------------------------  
};
//=================================================================================================
void
TString::            Clear       (                         )
{
 if (Data)
 {
  free(Data);  
 }
 Data  =null;
 Number=0;
}
//-------------------------------------------------------------------------------------------------
TString::            TString     (                         )
{
 Data  =null;
 Number=0;
}
//-------------------------------------------------------------------------------------------------
TString::            TString     (TString           &String)
{
 char *p1;
 char *p2;
 cerr<<"\ncopy\n";
 if (String.Number)
 {  
  Data=(char *)malloc(String.Number+1);
  if (Data)
  {
   Number=String.Number;
   for (p1=String.Data+Number, p2=Data+Number; p2>=Data; --p1, --p2)
   {    
    (*p2)=(*p1);
   }
  }
  else
  {
   Number=0;
  }
 }
 else
 {
  Data  =null;
  Number=0;
 }
}
//-------------------------------------------------------------------------------------------------
TString::           ~TString     (                         )
{
 if (Data)
 {
  free(Data);  
 }
}
//-------------------------------------------------------------------------------------------------
TString
TString::            operator =  (TString            &String)
{
 char *p1;
 char *p2;
 cerr<<"\n=string\n";
 if (String.Number)
 {  
  Data=(char *)malloc(String.Number+1);
  if (Data)
  {
   Number=String.Number;
   for (p1=String.Data+Number, p2=Data+Number; p2>=Data; --p1, --p2)
   {
    (*p2)=(*p1);   
   }
  }
  else
  {
   Number=0;
  }
 }
 else
 {
  this->Clear();
 }
 return *this;
}
//-------------------------------------------------------------------------------------------------
TString
TString::            operator =  (char              *String)
{ 
 char *p1;
 char *p2;
 for (p1=String; p1; ++p1)
 { 
  if ((*p1)=='\0')
  {
   break;
  }
 }
 Number=p1-String+1;
 if (Number)
 {
  Data=realloc (Data, Number);
  if (Data)
  {
   --Number;   
   for (p2=Data+Number; p2>=Data; --p1, --p2)
   {
    (*p2)=(*p1);
   }   
  }  
 }
 return *this;
}
//-------------------------------------------------------------------------------------------------
istream             &operator >> (istream           &Stream,
                                  TString           &String)
{
 char c;
 String.Clear();
 Stream.putback('\0');
 Stream>>c;
 while (Stream.peek()==0);
 while (Stream.peek()!=10)
 {
  Stream>>c;
  String+=c;
 }
 return Stream;
}
//-------------------------------------------------------------------------------------------------
ostream             &operator << (ostream           &Stream,
                                  TString           &String)
{
 char *p;
 char *e;
 if (String.Number)
 {
  for (e=String.Data+String.Number, p=String.Data; p<e; ++p)
  {   
   Stream<<(*p);
  }
 }
 return Stream;
}
//-------------------------------------------------------------------------------------------------
void
TString::            operator += (char               Char  )
{
 char              *Buffer;
 unsigned long int  Number;
 if (Char!=0)
 {
  Number=this->Number+2;
  if (Number)
  {
   Buffer=realloc(Data, Number);  
   if (Buffer)
   {
    this->Number                 =Number-1;   
          Data                   =Buffer;         
          Data   [this->Number  ]='\0';
          Data   [this->Number-1]=Char;
   }
  }
 }
}
//-------------------------------------------------------------------------------------------------
//=================================================================================================
Вывод:
copy
.

Добавлено через 1 час 15 минут
Меня интересует: если с одним типом параметра есть и конструктор, и оператор присваивания то как по стандарту должен вести себя компилятор: присваивать объект, или создавать конструктором.
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
17.03.2010, 11:39     Копии #4
C++
1
2
a o1,o2;
o2=o1;      // здесь вызывается операция присваивания, так как оба объекта созданы
C++
1
2
a o1;
a o2 = o1;  //вызывается конструктор копирования: второй объект создается копированием первого.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
18.03.2010, 08:25  [ТС]     Копии #5
При полном выводе было видно, что оба объекта уже созданы конструктором. Но всёравно вызывается конструктор, судя оп всему, параметра, а оператор игнорируется и вместо него идёт, кажется, побитное копирование. В чём может быть этот глюк? Почему вообще вызывается конструктор, если сказано передать ссылку и какого фига идёт копирование параметра?
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,308
18.03.2010, 10:20     Копии #6
Так где же код, воспроизводящий эту ошибку ???
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
18.03.2010, 10:21  [ТС]     Копии #7
В третьем посте.
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,308
18.03.2010, 10:33     Копии #8
Нет. Этот код не только не воспроизводит проблему, но даже не компилируется.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
18.03.2010, 10:38  [ТС]     Копии #9
У меня компилится. А у тебя что пишет?
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,308
18.03.2010, 11:00     Копии #10
GCC 4.4.0:
main.cpp In member function `void TString::Clear()':
main.cpp 45 error: 'free' was not declared in this scope
main.cpp 47 error: `null' was not declared in this scope
.... (тут прочие ошибки) .....
=== Build finished: 9 errors, 0 warnings ===
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.03.2010, 11:06     Копии
Еще ссылки по теме:

C++ Конструкторы копии и перемещения
C++ Конструктор копии
Мелкая и глубокая копии C++

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

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
18.03.2010, 11:06  [ТС]     Копии #11
Перед этим:
C++
1
2
3
4
5
6
7
8
#define null 0
#define nan 0.0/0.0
//=================================================================================================
#include <iostream.h>
#include <fstream>
#include <exception>
#include <stdexcept>
#include "MyAllocs.hpp" // здесь функция-оболочка char *realloc(char *p, unsigned long int n);
Yandex
Объявления
18.03.2010, 11:06     Копии
Ответ Создать тему
Опции темы

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