LINUX.ORG.RU

С++ перегрузка


0

2

Здравствуйте. Есть такой код:

#include <iostream>

struct A
{
    int a;

    int& getA()
    {  
        std::cout << "non-const" << std::endl;
        return a;
    }

    const int& getA() const
    {  
        std::cout << "const" << std::endl;
        return a;
    }

};

int main(void)
{
    A a = {0};

    const int& i = a.getA();

    std::cout << i << std::endl;
}

При выполнении на экран выводится «non-const». Мне нужно, чтобы при выборе перегруженного метода приоритет был у константного метода. Можно ли каким-нибудь костылём этого добиться?

Мне это нужно для Qt Implicit Sharing. В некоторых местах используются конструкции такого вида: «foo.getA() = 5», они должны использовать неконстрантный метод getA. Во всех остальных случаях желательно использовать константный метод.



Последнее исправление: elverion (всего исправлений: 3)

Ответ на: A const a={0}; от staseg

Да это можно, но хотелось бы не трогать вызывающий код.

elverion
() автор топика

>В некоторых местах используются конструкции такого вида: «foo.getA() = 5»

Ну вообще-то foo.setA(5) для такого используют обычно. Не знаю как в Qt, но все же.

Absurd ★★★
()
Ответ на: комментарий от Absurd

Я сильно упростил задачу, на самом деле вместо int список, и используется он примерно так: a.getList().append(«qwe»); Как и положено вызывается detach(). А вот в таких случаях: «a.getList().count()», detach'а не хотелось бы.

elverion
() автор топика

>foo.getA() = 5

Пусть getA возвращает объект, в котором есть оператор преобразования в int и реализован оператор присваивания. Первый метод будет возвращать A::a, второй - устанавливать ее.

А вообще foo.getBar()=baz - это адское извращение, поубивал бы.

staseg ★★★★★
()

Если посмотреть на QVector, там есть три метода:

const T & at ( int i ) const
T & operator[] ( int i )
const T & operator[] ( int i ) const

И комментарий к одному из примеров:
at() can be faster than operator[](), because it never causes a deep copy to occur.
Если хочешь const наверняка, делай отдельный метод (getConstA).

rival ★★
()

При выполнении на экран выводится «non-const». Мне нужно, чтобы при выборе перегруженного метода приоритет был у константного метода. Можно ли каким-нибудь костылём этого добиться?

Выводится non-const, т.к. возвращаемое значение не участвует в разрешении перегрузки. Метод выбирается только по типу объекта А и пофиг кому ты присваиваешь значение функции. И ты никак это не изменишь. Используй разные имена. Qt же использует at() и operator[].

Pavval ★★★★★
()

Функции не перегружаются по типу возвращаемого параметра. Учите матчасть.

anonymous
()
Ответ на: комментарий от Pavval

>Метод выбирается только по типу объекта А

Да, спасибо, теперь буду знать.

elverion
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.