powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / где здесь ошибка ???
10 сообщений из 10, страница 1 из 1
где здесь ошибка ???
    #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
где здесь ошибка ???
    #34438023
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да как в гарбузе семян
0) в кострукторе МуСlass(const char*)
1) в деструкторе надо вызывать delete [] ...;
2) в операторе присваивания memcpy??? Если хотел просто указатель скопировать то проще написать chrArr = src.chrArr; глубокую копию сделать - так уж копируй из одного буфера в другой
3) в операторе присваивания помнить о буфере и не забыть его реаллокироать
4) не хило было-бы и конструктор копирования поиметь
ну вот на первый взляд
...
Рейтинг: 0 / 0
где здесь ошибка ???
    #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
где здесь ошибка ???
    #34438121
батрак
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
Не инициализируется переменная объекта "chrArr".


исправил.

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



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


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

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


хотель глубокую копию, токо вот не знаю как из одного буфера в другой это сделать, буду признателен, если поможете
...
Рейтинг: 0 / 0
где здесь ошибка ???
    #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
где здесь ошибка ???
    #34438237
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sizeof(chrArr)?
...
Рейтинг: 0 / 0
где здесь ошибка ???
    #34438249
батрак
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасиб ..
...
Рейтинг: 0 / 0
где здесь ошибка ???
    #34438428
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmosizeof(chrArr)?
Мда маху дал... заменить на strlen
...
Рейтинг: 0 / 0
где здесь ошибка ???
    #34438436
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
батрак пишет:

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

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

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

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

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

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


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