2016-02-09 11 views
-6

Я пытаюсь выполнить глубокую копию одного класса в другой. Использование 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", который пытается добавить к нему целое число. Это имело бы смысл, если бы у вас был массив экземпляров, и вы хотите перейти к экземпляру с индексом, расположенным дальше по списку. Но у вас нет массива экземпляров. У вас есть экземпляры, в которых есть массив внутри него.

Итак, вы пытаетесь двигаться вверх и вниз за пределами класса. То, что вы действительно хотите сделать, это перемещение вверх и вниз внутри класса.

ответ от инструктора

+1

Пожалуйста, опубликовать [mcve] (Http: // StackOverflow.com/help/mcve) –

+1

, пожалуйста, напишите [mcve] – NathanOliver

+2

Какой тип clsOriginalCopy? Он должен работать, если это указатель, а lngIndex - целочисленный тип, но если clsOriginalCopy - это объект, он не будет работать. –

ответ

0

Прежде всего, в коде вы предоставили я не вижу operator +, поэтому компилятор абсолютно прав.

Второй момент, который я не понимаю, - это *(clsOriginalToCopy + lngIndex) выражение ... Что должен вернуть ваш operator +? Указатель? Почему бы не ссылаться (учитывая ваш operator =)?

Попробуйте перестроить свой класс, возможно, operator + не очень нужны и только некоторые изменения в DeepCopy реализации будет решить вопрос