Оператор разыменования не должен быть перегружен - PullRequest
1 голос
/ 21 февраля 2020

Я определил оператор разыменования перегрузки. Но когда я попытался использовать ->, я ожидал, что вызывается оператор разыменования с перегрузкой и возвращает мне указатель на конкретный c объект. После этого я хочу получить доступ к члену класса этого объекта. Однако кажется, что когда я использую -> оператор перегрузки не вызывается. Нужно, чтобы explicity вызвал оператор 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;
}

1 Ответ

0 голосов
/ 21 февраля 2020

Во-первых, (q.request)->getRequest(); приводит к UB. Поскольку q.request является указателем и инициализируется нулевым указателем.

По вашему вопросу, q.request не должно быть указателем. например,

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

, тогда вы можете

(q.request)->getRequest();

LIVE

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...