2016-06-10 9 views
-1

Я хотел бы иметь переменную в моем классе, которая равна const при доступе от public к области и не const при доступе от private или в защищенной области. Я хотел бы избежать использования метода getter, который возвращает ссылку на переменную const. Я попытался возиться с ключевым словом using, но пока ничего не добился. В идеале это будет выглядеть примерно так:Использование переменной с public const modifier

class Foo 
{ 
public: 
    using var = const m_var; // This is of course gibberish 
private: 
    int m_var; 
} 

Я мог бы добавить переменную базового элемента общественного константный, и пусть она указывала на приватную переменную, но путь мой класс получил бы 4 байта больше, что я хотел бы избежать , Компилятор понял бы это и оптимизировал бы эту ссылку?

Любые другие идеи о том, как решить проблему?

+0

«Я бы хотел избежать использования метода getter, который возвращает константную ссылку на переменную». Почему нет? Это рекомендуемый способ сделать это. Ссылка на объект такая же, как и прямой доступ к объекту с точки зрения языка, поэтому одно и то же: – KABoissonneault

+1

И нет, C++ не имеет чего-то вроде свойств C# – KABoissonneault

+0

Геттер-метод разрешил бы проблему, но он также выглядит уродливым: 'object.var.incrementByOne()' vs 'object.getVar(). incrementByOne()'. Несмотря на то, что функциональность такая же, она выглядит скорее как копия переменной возвращается и работает, а не сама фактическая переменная. Я должен добавить, что 'incrementByOne()' (по какой-либо причине) является функцией 'const'. –

ответ

3

Я хотел бы избежать геттер-метода, который возвращает константную ссылку на переменную

Я не знаю, почему вы хотите, чтобы избежать этого. Это звучит, как именно то, что вы хотите (возможно, просто возвращается по значению):

class Foo 
{ 
public: 
    int getVar() const { return m_var; } 
protected: 
    int m_var; 
}; 

Если у вас есть protected или private доступ к Foo, вы можете просто m_var. Если вы этого не сделаете, у вас есть открытый const getVar(), который не позволит вам его изменить.


Нет другого способа сделать это. Вы не можете перегружать права доступа так, как вы можете перегружать const -qualification или ref-qualification, поскольку разрешение перегрузки происходит до проверки доступа. Это запрещает вам делать что-то вроде перегрузки protected и public, где лучше всего подходит перегрузка protected.

Вы также не можете добавлять псевдонимы для переменных без введения фактических ссылок - но в этот момент вы делаете свой класс более крупным, но вы все равно используете разные имена для ссылки на public и protected в любом случае, функция члена-получателя строго лучше.

+1

Вопрос явно задает вопрос «без геттера». Вы можете сделать вывод из комментариев, что OP не любит синтаксис/семантику вызова getter, потому что вы якобы не можете определить, имеете ли вы прямое отношение к значению или копии. Я не согласен с этим, но это еще одна дискуссия. – KABoissonneault

+1

Я не говорю, что ваш ответ - неправильный способ сделать это, я просто говорю, что он не отвечает на вопрос. Очевидно, что OP уже знает, что они могут использовать геттер, поэтому это ничего не добавляет. – KABoissonneault

+0

@KABoissonneault Я не понимаю, какая разница между копией и значением itselft, если значение должно быть const anyhow – user463035818