Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.10.2018, 09:09   #1
katya_bars
Новичок
Джуниор
 
Регистрация: 03.10.2018
Сообщений: 4
По умолчанию Как правильно скопировать класс

Здравствуйте.

Есть такая конструкция:
Код:
class BaseClass
{
public:
	int var1;
	int var2;
public:
	BaseClass();
	virtual ~BaseClass();

	int  func1();
	...
	int  func20();
};

class ExClass : public BaseClass
{
public:
	int exvar1;
public:
	ExClass();
	virtual ~ExClass();

	int  exfunc1();
	...
	int  exfunc5();
};

void SomeProc(BaseClass * pSrc);
{
	BaseClass * pDest = NULL;
	pDest = new ExClass();

	memcpy(pDest, pSrc, sizeof(ExClass));
	
}
При использовании внешнего статического анализатора получаю сообщение, что memcpy использовать не рекомендуется из-за возможности повреждения виртуальных таблиц класса pDest.

Собственно вопрос, как правильно скопировать данные из pSrc в pDest в процедуре SomeProc.

Последний раз редактировалось katya_bars; 03.10.2018 в 09:16.
katya_bars вне форума Ответить с цитированием
Старый 03.10.2018, 09:39   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Код:
pDest = new ExClass(*pSrc);
waleri вне форума Ответить с цитированием
Старый 03.10.2018, 09:57   #3
katya_bars
Новичок
Джуниор
 
Регистрация: 03.10.2018
Сообщений: 4
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Код:
pDest = new ExClass(*pSrc);
спасибо за ответ. так пробовали, но так получаем ошибку при компиляции:
Код:
1>.\tests.cpp(555) : error C2664: ExClass::ExClass(const ExClass &): невозможно преобразовать параметр 1 из 'BaseClass' в 'const ExClass &'
1>        Причина: невозможно преобразовать 'BaseClass' в 'const ExClass'
1>        Для выполнения данного преобразования нет доступного оператора преобразования, определенного пользователем, или вызов оператора невозможен
.. может как-то через static_cast / dynamic_cast можно?
katya_bars вне форума Ответить с цитированием
Старый 03.10.2018, 10:01   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Так не используйте BaseClass если нужен ExClass.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 03.10.2018, 10:20   #5
katya_bars
Новичок
Джуниор
 
Регистрация: 03.10.2018
Сообщений: 4
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Так не используйте BaseClass если нужен ExClass.
в том то и дело что в дальнейшем BaseClass нужен что бы был.

пока сделали таким образом, что бы компилировалось
Цитата:
pDest = new ExClass( * dynamic_cast<ExClass*>(pSrc));
может есть вариант лучше?
katya_bars вне форума Ответить с цитированием
Старый 03.10.2018, 10:27   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Напишите, конструктор ExClass(BaseClass&) или озвучьте задачу.
p51x вне форума Ответить с цитированием
Старый 03.10.2018, 10:42   #7
katya_bars
Новичок
Джуниор
 
Регистрация: 03.10.2018
Сообщений: 4
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Напишите, конструктор ExClass(BaseClass&)
этих классов "ExClass" порядка 20 будет, не хотелось этого делать, но видимо это единственно верное решение.
Всем спасибо за ответы.
Хорошего дня.
katya_bars вне форума Ответить с цитированием
Старый 03.10.2018, 15:11   #8
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

не слушай никого.
я научу тебя, как правильно скопировать класс.
открываешь файлик с классом в вижуал студии.
нажимаешь: ctrl + a, затем: ctrl + c.
затем открываешь любой другой файлик и нажимаешь: ctrl + v
и вуаля! класс скопирован!
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как решать этот пример на C++: Создать класс Triad (тройка чисел); определить методы увеличения полей на 1. Определить производный класс Date с полями: год, месяц и день... DOSTON Помощь студентам 0 15.02.2017 21:58
Как правильно использовать класс в классе milenium Общие вопросы C/C++ 7 07.05.2011 10:55
Как правильно выбрать класс вида. KemanSR Общие вопросы C/C++ 1 08.05.2010 20:04
как скопировать? Bat{CMD}_Men Операционные системы общие вопросы 4 09.11.2009 11:35
Как правильно скопировать данные с одного текстового файла в другой? Dem80 Общие вопросы C/C++ 2 06.03.2009 22:17