我试图将一个类的深层副本预制成另一个类。使用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;这是试图添加一个整数。如果您有一个实例数组并且想要跳转到列表中有一个索引的实例,那将是有意义的。但是你没有一系列实例。你有一个碰巧在其中有数组的实例。
所以,你试图在课堂之外上下移动。你真正想要做的是在课堂上里面上下移动。
来自讲师的回复
答案 0 :(得分:0)
首先,在你提供的代码中我没有看到operator +
,所以编译器是绝对正确的。
我不明白的第二点是*(clsOriginalToCopy + lngIndex)
表达......你的operator +
应该返回什么?指针?为什么不参考(考虑你的operator =
)?
尝试重新设计您的课程,可能并不真正需要operator +
,只有DeepCopy
实施中的某些更改才能解决问题