частные неконстантные и публичные функции-члены const - сосуществуют в мире?

StackOverflow https://stackoverflow.com/questions/1201295

  •  05-07-2019
  •  | 
  •  

Вопрос

Я пытаюсь создать класс с двумя методами с одинаковым именем, используемыми для доступа к закрытому члену.Один метод является общедоступным и имеет значение const, другой - частный и неконстантный (используется дружественным классом для изменения члена посредством возврата по ссылке).

К сожалению, я получаю ошибки компиляции (используя g ++ 4.3):При использовании неконстантного объекта для вызова метода g ++ жалуется, что неконстантная версия моего метода является частной, хотя существует общедоступная (const) версия.

Это кажется странным, потому что, если частная неконстантная версия не существует, все компилируется нормально.

Есть ли какой-нибудь способ заставить это работать?Компилируется ли он на других компиляторах?

Спасибо.

Пример:

class A
{
public:
    A( int a = 0 ) : a_(a) {}
public:
    int   a() const { return a_; }
private:
    int & a()       { return a_; } /* Comment this out, everything works fine */
    friend class B;
private:
    int a_;
};


int main()
{
    A       a1;
    A const a2;

    cout << a1.a() << endl; /* not fine: tries to use the non-const (private) version of a() and fails  */
    cout << a2.a() << endl; /* fine: uses the const version of a() */
}
Это было полезно?

Решение

Разрешение перегрузки происходит перед проверкой доступа, поэтому, когда вы вызываете метод a для неконстантного A, неконстантный элемент выбирается как более подходящий.Затем компилятор завершает работу с ошибкой из-за проверки доступа.

Нет никакого способа "заставить это работать", моей рекомендацией было бы переименовать закрытую функцию.Есть ли какая-либо необходимость в личном аксессуаре?

Другие советы

Он будет выбирать только const версия, если объект объявлен, равна const, в противном случае он выберет не-const версия (даже если это приводит к ошибке).

Это должно сработать:

cout << ((const A*)&a1)->a() << endl;

или это:

A const& ra1 = a1;
cout << ra1.a() << endl;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top