取消引用运算符不会被重载
Dereference operator is not be overloaded
我定义了一个重载取消引用运算符。但是当我尝试使用 -> 时,我希望重载取消引用运算符被调用并且 return 我指向特定对象的指针。之后我想访问这个对象的 class 的成员。
但是,当我使用 -> 时,似乎不会调用重载运算符。需要显式调用 olverloading 运算符 ->
看看下面的例子
#include <iostream>
#include <string>
using namespace std;
template<typename T>
class GenericRequest
{
public:
GenericRequest()
{
m_request = new T();
}
~GenericRequest()
{
if (m_request)
{
delete m_request;
}
}
T& operator *()
{
return *m_request;
}
T* operator ->()
{
return m_request;
}
private:
T* m_request;
};
class SpecificRequest
{
public:
inline const std::string& getRequest() const {
return m_request;
}
inline void setRequest(const std::string& request) {
m_request = request;
}
private:
std::string m_request;
};
template<typename T>
class ReqData
{
public:
ReqData()
:request(NULL)
{
}
~ReqData()
{
if (NULL != request)
{
delete request;
}
}
GenericRequest<T>* request;
};
int main()
{
ReqData<SpecificRequest> q;
//(q.request)->getRequest();-->This call generates error
q.request->operator->()->getRequest();
return 0;
}
首先,(q.request)->getRequest();
通往UB。因为q.request
是一个指针,被初始化为空指针。
对于你的问题,q.request
不应该是指针。例如
template<typename T>
class ReqData
{
public:
GenericRequest<T> request;
};
那么你可以
(q.request)->getRequest();
我定义了一个重载取消引用运算符。但是当我尝试使用 -> 时,我希望重载取消引用运算符被调用并且 return 我指向特定对象的指针。之后我想访问这个对象的 class 的成员。 但是,当我使用 -> 时,似乎不会调用重载运算符。需要显式调用 olverloading 运算符 -> 看看下面的例子
#include <iostream>
#include <string>
using namespace std;
template<typename T>
class GenericRequest
{
public:
GenericRequest()
{
m_request = new T();
}
~GenericRequest()
{
if (m_request)
{
delete m_request;
}
}
T& operator *()
{
return *m_request;
}
T* operator ->()
{
return m_request;
}
private:
T* m_request;
};
class SpecificRequest
{
public:
inline const std::string& getRequest() const {
return m_request;
}
inline void setRequest(const std::string& request) {
m_request = request;
}
private:
std::string m_request;
};
template<typename T>
class ReqData
{
public:
ReqData()
:request(NULL)
{
}
~ReqData()
{
if (NULL != request)
{
delete request;
}
}
GenericRequest<T>* request;
};
int main()
{
ReqData<SpecificRequest> q;
//(q.request)->getRequest();-->This call generates error
q.request->operator->()->getRequest();
return 0;
}
首先,(q.request)->getRequest();
通往UB。因为q.request
是一个指针,被初始化为空指针。
对于你的问题,q.request
不应该是指针。例如
template<typename T>
class ReqData
{
public:
GenericRequest<T> request;
};
那么你可以
(q.request)->getRequest();