@svbelov51

Нужна помощь с копированием объекта шаблонного класса. Как правильно реализовать?

Добрый день! Нужно передавать копию объекта Holder<A>в часть кода которая не знает о классе "A" ничего, но знает что такое BaseHolder. Я нашел такое решение:
#include <iostream>
#include <memory>

using namespace std;

class BaseHolder {
public:
	virtual void Set(int i) = 0;
	virtual int Get() = 0;
};

template <typename T>
class Holder: public BaseHolder {
public:
	virtual void Set(int i) {
		if (t == nullptr) {
			t = new T();
		}
		t->Set(i);
	}

	virtual int Get() {
		if (t == nullptr) {
			t = new T();
		}
		return t->Get();
	}
private:
	T *t = nullptr;
};

class A {
public:
	void Set(int i) {
		count = i;
	}
	int Get() {
		return count;
	}
private:
	int count = 0;
};

int main()
{
	int size = sizeof(Holder<A>);
	BaseHolder *h = new Holder<A>;
	
	// В этой части, программа, не должна знать о шаблонном классе.

	BaseHolder *j = (BaseHolder*)malloc(size);
	memcpy(j, h, size);

	h->Set(5);
	j->Set(7);

	cout << "h: " << h->Get() << endl;
	cout << "j: " << j->Get() << endl;

	delete(h);
	delete(j);

	return 0;
}

Подскажите пожалуйста, есть ли тут какие-то ошибки и можно ли сделать как-нибудь по-другому? Суть проблемы в том, что есть большой кусок кода, который неохота делать шаблонным и поэтому я пришел к варианту с наследованием.
  • Вопрос задан
  • 186 просмотров
Решения вопроса 1
tsarevfs
@tsarevfs Куратор тега C++
C++ developer
Не нужны трюки с maloc и memcpy. Тем более что результат скорее всего не тот, что вы ожидаете.
Передавайте указатель или умный указатель BaseHolder.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы