gpt4 book ai didi

c++ - 无法将 int 分配给返回类的成员 int

转载 作者:行者123 更新时间:2023-11-30 00:58:00 24 4
gpt4 key购买 nike

不能 100% 确定我的问题是否措辞正确,因为我没有完全理解我的问题。

对于我的类(class),我需要创建自己的智能指针来自行清理。

到目前为止,这是我的代码:

标题:

class Test
{
public:
Test()
{
m_iTest1 = 4;
m_iTest2 = 3;
m_iTest3 = 2;
m_iTest4 = 1;
}

Test (int a, int b, int c, int d)
{
m_iTest1 = a;
m_iTest2 = b;
m_iTest3 = c;
m_iTest4 = d;
}

Test(const Test& a_oTest)
{
m_iTest1 = a_oTest.m_iTest1;
m_iTest2 = a_oTest.m_iTest2;
m_iTest3 = a_oTest.m_iTest3;
m_iTest4 = a_oTest.m_iTest4;
}

~Test(){;}

int m_iTest1;
int m_iTest2;
int m_iTest3;
int m_iTest4;
};

template<class T>
class SmartData
{
public:
template<class T> friend class SmartPointer;

SmartData();
SmartData(const T& a_oData);
~SmartData();

T operator * () const;
unsigned int GetCount(){return m_uiCount;}

protected:
void IncrementCount(){++m_uiCount;}

void DecrementCount();

void DeleteThis();

unsigned int m_uiCount;
T* m_poData;
};

template<class T>
class SmartPointer
{
public:
SmartPointer();
SmartPointer(SmartData<T>& a_oSmartData);
SmartPointer(const SmartPointer& a_oSmartPointer);
~SmartPointer();

SmartPointer<T>& operator = (const SmartPointer<T>& a_oSmartPointer);

T operator *() const;
SmartData<T>* operator ->() const;

unsigned int GetCount() const;

private:
SmartData<T>* m_poSmartData;
};

#include "smartpointer.inl"

内联文件:

template<class T>
SmartData<T>::SmartData()
{
m_uiCount = 0;
m_poData = new T();
}

template<class T>
SmartData<T>::SmartData(const T& a_oData)
{
m_uiCount = 0;
m_poData = new T(a_oData);
}

template<class T>
SmartData<T>::~SmartData()
{
if (m_poData)
{
delete m_poData;
}
}

template<class T>
T SmartData<T>::operator * () const
{
return *m_poData;
}

template<class T>
void SmartData<T>::DecrementCount()
{
if (m_uiCount - 1 == 0 || m_uiCount == 0)
{
DeleteThis();

return;
}

--m_uiCount;
}

template<class T>
void SmartData<T>::DeleteThis()
{
if (m_poData)
{
delete m_poData;
m_poData = 0;
}
}

template<class T>
SmartPointer<T>::SmartPointer()
{
m_poSmartData = new SmartData<T>();
m_poSmartData->IncrementCount();
}

template<class T>
SmartPointer<T>::SmartPointer(SmartData<T>& a_oSmartData)
{
m_poSmartData = &a_oSmartData;
m_poSmartData->IncrementCount();
}

template<class T>
SmartPointer<T>::SmartPointer(const SmartPointer& a_oSmartPointer)
{
m_poSmartData = a_oSmartPointer.a_oSmartData;
m_poSmartData->IncrementCount();
}

template<class T>
SmartPointer<T>::~SmartPointer()
{
m_poSmartData->DecrementCount();
m_poSmartData = 0;
}

template<class T>
SmartPointer<T>& SmartPointer<T>::operator = (const SmartPointer<T>& a_oSmartPointer)
{
m_poSmartData = a_oSmartPointer.m_poSmartData;
m_poSmartData->IncrementCount();
}

template<class T>
T SmartPointer<T>::operator *() const
{
return *m_poSmartData->m_poData;
}

template<class T>
SmartData<T>* SmartPointer<T>::operator ->() const
{
return m_poSmartData;
}

template<class T>
unsigned int SmartPointer<T>::GetCount() const
{
return m_poSmartData->m_uiCount;
}

主要.cpp

void SomeFunction1(SmartData<Test>& a_SmartData)
{
SmartPointer<Test> oSmartPointer2(a_SmartData);
}

void main()
{
SmartData<int> oSmartData1(5);

if (1)
{
SmartPointer<int> oSmartPointer1(oSmartData1);

int iTemp1 = oSmartPointer1->GetCount();
int iTemp2 = *oSmartPointer1;
int iTemp3 = *oSmartData1;
}

if (1)
{
SmartData<int> oSmartData2(5);
}

SmartData<Test> oSmartData3;

(*oSmartData3).m_iTest1 = 5; //Does not work

if (1)
{
SmartData<Test> oSmartData4(oSmartData3);

SomeFunction1(oSmartData3);

//oSmartData4 still exits
}
}

一切正常,数据自行清理,我没有泄漏...除了一行:

(*oSmartData3).m_iTest1 = 5;

我正在使用 visual studio 进行编译,当我放置“.”时在“(*oSmartData3)”之后...“m_iTest1”正确出现。除了我得到一个错误:错误 C2106:“=”:左操作数必须是左值

我不确定为什么这不起作用或需要更改什么才能起作用。

最佳答案

仔细观察 SmartData 中 operator*() 的声明:

T operator * () const;

这意味着此运算符正在返回类型 T 的对象,它是 m_poSmartData->m_poData 的拷贝。在这种情况下它是一个临时对象:

(*oSmartData3).m_iTest1 = 5; //Does not work

当然,你不能给临时对象赋值,因为它不是左值。在此处阅读有关什么是左值和右值的更多信息:http://publib.boulder.ibm.com/infocenter/comphelp/v7v91/index.jsp?topic=%2Fcom.ibm.vacpp7a.doc%2Flanguage%2Fref%2Fclrc05lvalue.htm

我建议您返回对 m_poSmartData->m_poData 的引用 在 operator*() 中(如果我没有正确理解您要执行的操作)。

关于c++ - 无法将 int 分配给返回类的成员 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7074015/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com