C ++指针算术。没有运营商" +"匹配这些操作数

时间:2016-02-09 14:11:41

标签: c++ pointers deep-copy pointer-arithmetic

我试图将一个类的深层副本预制成另一个类。使用VS2015。

下面的*(clsOriginalToCopy + lngIndex);是我得到错误的地方,我不知所措。

for (lngIndex = 0; lngIndex < lngSize; lngIndex += 1)
{
    *(this + lngIndex) = *(clsOriginalToCopy + lngIndex);
}

修改

错误C2784&#39; std :: basic_string&lt; _Elem,_Traits,_Alloc&gt; std :: operator +(std :: basic_string&lt; _Elem,_Traits,_Alloc&gt;&amp;&amp;,const _Elem)&#39;:无法推断&#39; std :: basic_string&lt; _Elem,_Traits,_Alloc&gt的模板参数; &安培;&安培;&#39;来自&#39; const CResizableArray&#39;作业8 - DeepCopy 479

修改

MCVE。它希望我添加更多细节,以便享受

中的摘录

&#34; Hitchhikers指导银河系&#34;

“例如,在地球上,人类总是认为他比海豚更聪明,因为他已经取得了如此多的成就 - 轮子,纽约,战争等等 - 而所有的海豚曾经做过的都是淤泥在水中玩得很开心。但相反,海豚一直认为它们比人类聪明得多 - 原因完全相同。“ - 道格拉斯亚当斯,搭便车的银河系指南

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);
    }
}

来自讲师的回复

&#34; this&#34;关键字是指向当前活动实例的指针,在本例中是CResizableArray的实例。

你有&#34;这+ lngIndex&#34;这是试图添加一个整数。如果您有一个实例数组并且想要跳转到列表中有一个索引的实例,那将是有意义的。但是你没有一系列实例。你有一个碰巧在其中有数组的实例。

所以,你试图在课堂之外上下移动。你真正想要做的是在课堂上里面上下移动。

来自讲师的回复

1 个答案:

答案 0 :(得分:0)

首先,在你提供的代码中我没有看到operator +,所以编译器是绝对正确的。

我不明白的第二点是*(clsOriginalToCopy + lngIndex)表达......你的operator +应该返回什么?指针?为什么不参考(考虑你的operator =)?

尝试重新设计您的课程,可能并不真正需要operator +,只有DeepCopy实施中的某些更改才能解决问题