Я пытаюсь выполнить глубокую копию одного класса в другой. Использование VS2015.C++ Указатель арифметики. No Operator «+» Совпадает с этими операндами
ниже на * (clsOriginalToCopy + lngIndex); где я получаю ошибку, я в недоумении.
for (lngIndex = 0; lngIndex < lngSize; lngIndex += 1)
{
*(this + lngIndex) = *(clsOriginalToCopy + lngIndex);
}
редактировать
Ошибка станд C2784»:: basic_string < _Elem, _Traits, _Alloc> станд :: оператор + (Std :: basic_string < _Elem, _Traits, _Alloc> & &, константный _Elem) ': не может вывести аргумент шаблона для 'станд :: basic_string < _Elem, _Traits, _Alloc> & &' из 'Домашней Const CResizableArray' 8 - DeepCopy 479
Редакция
MCVE. Он хочет, чтобы я добавить больше деталей, так наслаждайтесь этот отрывок из
«Автостопом по Галактике»
«, например, на планете Земля, человек всегда считал, что он был умнее дельфинов, потому что он имел так много - колесо, Нью-Йорк, войны и т. д., в то время как все дельфины когда-либо делали, это было грязно в воде, хорошо проводив время. Но и наоборот, дельфины всегда считали, что они были гораздо умнее человека, по тем же причинам « . - Дуглас Адамс, Автостопом по Галактике
CResizableArray::CResizableArray()
{
Initialize(0, 0);
}
CResizableArray::CResizableArray(long lngSize)
{
Initialize(lngSize, 0);
}
CResizableArray::CResizableArray(long lngSize, long lngValue)
{
Initialize(lngSize, lngValue);
}
void CResizableArray::Initialize(long lngSize, long lngValue)
{
m_lngArraySize = 0;
m_palngValues = 0;
SetSize(lngSize, lngValue);
}
void CResizableArray::operator = (const CResizableArray &clsOriginalToCopy)
{
if (this != &clsOriginalToCopy)
{
CleanUp();
DeepCopy(clsOriginalToCopy);
}
}
CResizableArray::~CResizableArray()
{
CleanUp();
}
void CResizableArray::CleanUp()
{
SetSize(0, 0);
}
void CResizableArray::SetSize(long lngNewSize)
{
SetSize(lngNewSize, 0);
}
void CResizableArray::SetSize(long lngNewSize, long lngValue)
{
long* palngNewValues = 0;
long lngIndex = 0;
long lngStop = 0;
if (lngNewSize < 0) lngNewSize = 0;
if (lngNewSize > 100000) lngNewSize = 100000;
palngNewValues = new long[lngNewSize];
for (lngIndex = 0; lngIndex < lngStop; lngIndex += 1)
{
*(palngNewValues + lngIndex) = lngValue;
}
if (lngNewSize < m_lngArraySize) lngStop = lngNewSize;
else lngStop = m_lngArraySize;
for (lngIndex = 0; lngIndex < lngStop; lngIndex += 1)
{
*(palngNewValues + lngIndex) = *(m_palngValues + lngIndex);
}
if (m_palngValues != 0)
{
delete[] m_palngValues;
m_palngValues = 0;
}
m_palngValues = palngNewValues;
m_lngArraySize = lngNewSize;
}
void CResizableArray::DeepCopy(const CResizableArray &clsOriginalToCopy)
{
long lngSize = 0;
long lngIndex = 0;
lngSize = clsOriginalToCopy.GetSize();
SetSize(lngSize);
for (lngIndex = 0; lngIndex < lngSize; lngIndex += 1)
{
*(this + lngIndex) = *(clsOriginalToCopy + lngIndex);
}
}
ответ от инструктора
«Это» ключевое слово является указателем на текущий активный экземпляр, который в этом случае является экземпляром CResizableArray.
У вас есть "this + lngIndex", который пытается добавить к нему целое число. Это имело бы смысл, если бы у вас был массив экземпляров, и вы хотите перейти к экземпляру с индексом, расположенным дальше по списку. Но у вас нет массива экземпляров. У вас есть экземпляры, в которых есть массив внутри него.
Итак, вы пытаетесь двигаться вверх и вниз за пределами класса. То, что вы действительно хотите сделать, это перемещение вверх и вниз внутри класса.
ответ от инструктора
Пожалуйста, опубликовать [mcve] (Http: // StackOverflow.com/help/mcve) –
, пожалуйста, напишите [mcve] – NathanOliver
Какой тип clsOriginalCopy? Он должен работать, если это указатель, а lngIndex - целочисленный тип, но если clsOriginalCopy - это объект, он не будет работать. –