gpt4 book ai didi

c++ - 解引用运算符不会被重载

转载 作者:行者123 更新时间:2023-12-02 10:35:54 27 4
gpt4 key购买 nike

我定义了一个重载解除引用运算符。但是,当我尝试使用->时,我希望调用重载解除引用运算符,并将指向特定对象的指针返回给我。之后,我要访问此对象的类的成员。
但是,当我使用->时,似乎不会调用重载运算符。需要显式调用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是一个指针,并且被初始化为null指针。

对于您的问题,q.request不应该是指针。例如

template<typename T>
class ReqData
{
public:
GenericRequest<T> request;
};

然后你可以
(q.request)->getRequest();

LIVE

关于c++ - 解引用运算符不会被重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60335435/

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