【问题标题】:Dereference operator is not be overloaded取消引用运算符不会被重载
【发布时间】:2020-02-21 09:15:55
【问题描述】:

我已经定义了一个重载取消引用运算符。但是当我尝试使用 -> 时,我希望调用重载取消引用运算符并将指向特定对象的指针返回给我。之后我想访问这个对象的类的成员。 但是,似乎当我使用 -> 时不会调用重载运算符。需要显式调用 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 是一个指针,因此 (q.request)-&gt;getRequest() 取消引用该指针 - 这不涉及调用 operator-&gt;() 函数。将q.request 设为对象(即从模板化ReqData 类中的声明中删除*,您会发现(q.request)-&gt;getRequest() 调用了operator-&gt;(),因此可以按预期编译。

标签: c++ operator-keyword dereference


【解决方案1】:

首先,(q.request)-&gt;getRequest(); 指向 UB。因为q.request是一个指针,被初始化为空指针。

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

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

那么你就可以了

(q.request)->getRequest();

LIVE

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    • 2018-08-04
    • 2013-12-19
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    相关资源
    最近更新 更多