Перегрузка оператора - & gt; доступ к членству [дубликат]

Для использования CompareTo требуется любой, кто работает с типами NULL, Value.

objListOrder.Sort((x, y) => x.YourNullableType.Value.CompareTo(y.YourNullableType.Value));

15
задан Codesmith 8 February 2011 в 02:02
поделиться

4 ответа

Оператор -> используется для перегрузки доступа элемента. Небольшой пример:

#include <iostream>
struct A 
{
    void foo() {std::cout << "Hi" << std::endl;}
};

struct B 
{
    A a;
    A* operator->() {
        return &a;
    }
};

int main() {
    B b;
    b->foo();
}

Выводит:

Hi
19
ответ дан gr0v3r 18 August 2018 в 11:14
поделиться
  • 1
    работает ли оператор стрелки, чтобы возвращать члены структуры, как и члены класса? – Codesmith 8 February 2011 в 02:25
  • 2
    Он может возвращать члены структуры так же легко, как и возвращать члены класса. То, что происходит при использовании стрелки, определяется телом функции operator- & gt; (). Линия & quot; return & amp; a; & quot; могут быть изменены, чтобы вернуть все, что вы решите. – Darryl 8 February 2011 в 02:31
class T {
    public:
        const memberFunction() const;
};

// forward declaration
class DullSmartReference;

class DullSmartPointer {
    private:
        T *m_ptr;
    public:
        DullSmartPointer(T *rhs) : m_ptr(rhs) {};
        DullSmartReference operator*() const {
            return DullSmartReference(*m_ptr);
        }
        T *operator->() const {
            return m_ptr;
        }
};

http://en.wikibooks.org/wiki/C++_Programming/Operators/Operator_Overloading#Address_of.2C_Reference.2C_and_Pointer_operators

0
ответ дан Anycorn 18 August 2018 в 11:14
поделиться

Оператор стрелки не имеет входных данных. Технически он может возвращать то, что вам нужно, но должен возвращать то, что либо является указателем, либо может стать указателем посредством цепных -> операторов .

Оператор -> автоматически разыскивает свое возвращаемое значение перед вызовом его аргумента, используя разворот встроенного указателя, а не operator*, поэтому у вас может быть следующий класс:

class PointerToString
{
    string a;

public:
    class PtPtS
    {
    public:
        PtPtS(PointerToString &s) : r(s) {}
        string* operator->()
        {
            std::cout << "indirect arrow\n";
            return &*r;
        }
    private:
        PointerToString & r;
    };

    PointerToString(const string &s) : a(s) {}
    PtPtS operator->()
    {
        std::cout << "arrow dereference\n";
        return *this;
    }
    string &operator*()
    {
        std::cout << "dereference\n";
        return a;
    }
};

Используйте его как:

PointerToString ptr(string("hello"));
string::size_type size = ptr->size();

, который преобразуется компилятором в:

string::size_type size = (*ptr.operator->().operator->()).size();

(с большим количеством .operator->() при необходимости для возврата реального указателя) и должен выводить

arrow dereference
indirect dereference
dereference

Обратите внимание, однако, что вы можете сделать следующее:

PointerToString::PtPtS ptr2 = ptr.operator->();

выполнить онлайн: https://wandbox.org/permlink/Is5kPamEMUCA9nvE

От Stroupstrup:

Преобразование объекта p в указатель p.operator->() не зависит от члена m . В этом смысл, в котором operator->() является унарным постфиксным оператором. Однако новый синтаксис не вводится, поэтому после имени ->

18
ответ дан cztchoice 18 August 2018 в 11:14
поделиться
  • 1
    Этот код не компилируется на достойном компиляторе. – Sebastian Redl 30 March 2015 в 17:01
  • 2
    @SebastianRedl, вы правы. Я обновил объяснение и пример, чтобы он компилировался. – Daniel Gallagher 3 April 2015 в 14:09

Оператор «стрелка» может быть перегружен:

a->b

будет переведен в

return_type my_class::operator->()
0
ответ дан Foo Bah 18 August 2018 в 11:14
поделиться
  • 1
    Это не так просто, return_type{}->()->()->() ... ->() должен быть указателем на то, чтобы это был допустимый код. – alfC 13 May 2017 в 01:37
Другие вопросы по тегам:

Похожие вопросы: