Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / где здесь ошибка ??? / 10 сообщений из 10, страница 1 из 1
04.04.2007, 16:04
    #34437949
батрак
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
где здесь ошибка ???
Кто-нибудь сможет найти ошибку в ниже следующем коде???
Код: plaintext
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.
#include <tchar.h>
#include <stdio.h>

class MyClass
{	public:
		char *chrArr;
		MyClass(char *_chrArr)
		{	if(_chrArr)
			{	chrArr = new char[strlen(_chrArr)+ 1 ];
				strcpy(chrArr, _chrArr);
			}
		}
		virtual ~MyClass()
		{	if(chrArr) delete chrArr;
		}
		void operator=(const MyClass& src)
		{	memcpy(this, &src, sizeof(MyClass));
		}
};

int _tmain(int argc, _TCHAR* argv[])
{
	MyClass t1("MyText");
	MyClass t2(NULL);
	t2=t1;
	printf(t2.chrArr);
	getchar();

	return  0 ;
}
...
Рейтинг: 0 / 0
04.04.2007, 16:22
    #34438023
blinded
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
где здесь ошибка ???
да как в гарбузе семян
0) в кострукторе МуСlass(const char*)
1) в деструкторе надо вызывать delete [] ...;
2) в операторе присваивания memcpy??? Если хотел просто указатель скопировать то проще написать chrArr = src.chrArr; глубокую копию сделать - так уж копируй из одного буфера в другой
3) в операторе присваивания помнить о буфере и не забыть его реаллокироать
4) не хило было-бы и конструктор копирования поиметь
ну вот на первый взляд
...
Рейтинг: 0 / 0
04.04.2007, 16:23
    #34438028
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
где здесь ошибка ???
батрак пишет:
>
> #include <tchar.h>
> #include <stdio.h>
>
> class MyClass
> { public:
> char *chrArr;


> MyClass(char *_chrArr)

Не инициализируется переменная объекта "chrArr".
> { if(_chrArr)
> { chrArr = new char[strlen(_chrArr)+*1*];
> strcpy(chrArr, _chrArr);
> }
> }
> virtual ~MyClass()
> { if(chrArr) delete chrArr;
> }

operator = написан неправильно. Чтобы так работало , надо его выбростить вообще,
чтобы он не был ни объявлен, ни определен, тогда компилятор сделает то, что ты
хочешь. Но делать это самому так нельзя.

Кроме того, надо перевыделять внутри буфер "chrArr", потому что
таким образом владение буфером будет распространяться с присваиванием
на объект-приемник, а это противоречит логике деструктора.

> void operator=(const MyClass& src)
> {
memcpy(this, &src, sizeof(MyClass));
> }
> };
>
> int _tmain(int argc, _TCHAR* argv[])
> {
> MyClass t1("MyText");
> MyClass t2(NULL);
> t2=t1;
> printf(t2.chrArr);
> getchar();
>
> return *0*;
> }
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
04.04.2007, 16:45
    #34438121
батрак
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
где здесь ошибка ???
MasterZiv
Не инициализируется переменная объекта "chrArr".


исправил.

MasterZiv
> void operator=(const MyClass& src)
> {
memcpy(this, &src, sizeof(MyClass));
> }
Кроме того, надо перевыделять внутри буфер "chrArr", потому что
таким образом владение буфером будет распространяться с присваиванием
на объект-приемник, а это противоречит логике деструктора.



Если не сложно, можно пояснить как перевыделить буффер, почему так нельзя или дать ссылку где можно изучить подобный вопрос?
...
Рейтинг: 0 / 0
04.04.2007, 16:48
    #34438133
батрак
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
где здесь ошибка ???
blindedда как в гарбузе семян
0) в кострукторе МуСlass(const char*)
1) в деструкторе надо вызывать delete [] ...;


спасибо дельные замечания

blinded
2) в операторе присваивания memcpy??? Если хотел просто указатель скопировать то проще написать chrArr = src.chrArr; глубокую копию сделать - так уж копируй из одного буфера в другой
3) в операторе присваивания помнить о буфере и не забыть его реаллокироать


хотель глубокую копию, токо вот не знаю как из одного буфера в другой это сделать, буду признателен, если поможете
...
Рейтинг: 0 / 0
04.04.2007, 17:07
    #34438211
blinded
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
где здесь ошибка ???
батрак blindedда как в гарбузе семян
0) в кострукторе МуСlass(const char*)
1) в деструкторе надо вызывать delete [] ...;


спасибо дельные замечания

blinded
2) в операторе присваивания memcpy??? Если хотел просто указатель скопировать то проще написать chrArr = src.chrArr; глубокую копию сделать - так уж копируй из одного буфера в другой
3) в операторе присваивания помнить о буфере и не забыть его реаллокироать


хотель глубокую копию, токо вот не знаю как из одного буфера в другой это сделать, буду признателен, если поможете
Глубокую копию примерно так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
MyClass& operator=(const MyClass& src)
{
  if (!src.chrArr)
  {
    if (chrArr)
      delete [] chrArr;
    chrArr =  0 ;
    return *this;
  }

  if (chrArr && strlen(src.chrArr) +  1  > sizeof(chrArr))
  {
    delete[] chrArr;
    chrArr =  0 ;
  }

  if (!chrArr)
    chrArr = new char[strlen(src.chrArr) +  1 ];

  memcpy(chrArr, src.chrArr, strlen(srcchrArr) +  1 );
  return *this;
}
...
Рейтинг: 0 / 0
04.04.2007, 17:15
    #34438237
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
где здесь ошибка ???
sizeof(chrArr)?
...
Рейтинг: 0 / 0
04.04.2007, 17:17
    #34438249
батрак
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
где здесь ошибка ???
спасиб ..
...
Рейтинг: 0 / 0
04.04.2007, 17:54
    #34438428
blinded
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
где здесь ошибка ???
maXmosizeof(chrArr)?
Мда маху дал... заменить на strlen
...
Рейтинг: 0 / 0
04.04.2007, 17:56
    #34438436
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
где здесь ошибка ???
батрак пишет:

> Если не сложно, можно пояснить как перевыделить буффер,

Удалить старый и выделить новый так же как и в конструкторе.

почему так
> нельзя

Потому что объект состоит не только из мемберов, а и кое из чего
другого и это другое нельзя копировать через memcpy.

или дать ссылку где можно изучить подобный вопрос?

Думаю в любом учебнике по С++.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / где здесь ошибка ??? / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]