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

标签 c++ operator-keyword dereference

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

相关文章:

c++ - 编写我的第一个模板类- “Undefined symbols”错误

c++ - 如何 boost boost::spirit::x3 键值解析器的性能

c++ - 运算符重载错误 "no match for operator error"

c++ - 这个优先运算符是如何工作的?

rust - Deref 结构到元组需要移动

c++ - 使用模板创建类的新实例,不知道如何处理错误

c++ - 确定预处理器 token 的值

c++ - 对两个不同的类对象使用比较运算符

c++ - C++ 中的取消引用运算符

c++ - 如何清理 _variant_t