2014-12-14 3 views
2

рассмотрим следующий код:Другой тип "const"?

class Bar 
{ 
public: 
    int GetValue() const { return aVeryImportantValue; } 
    void SetValue(int value) { aVeryImportantValue = value; } 

private: 
    int aVeryImportantValue; 
}; 

class Foo 
{ 
public: 
    Foo(const Bar &bar) : _bar(bar) {} 

    void SetBar(const Bar &bar) { _bar = bar; }//my compiler won't like this 
    int GetValue() const { return _bar.GetValue(); } 

private: 
    const Bar &_bar; 
}; 

Что делать, если я хочу, чтобы иметь возможность «осмотреть» различные объекты Bar через Foo, но и гарантировать, что Foo не будет на самом деле изменить содержимое бара? Является ли это возможным?

+0

Вместо ссылки на const, которую вы пытаетесь изменить (но не можете), можете ли вы использовать указатель const? 'const Bar * _bar;'? – abelenky

ответ

4

Вы можете использовать указатель на константный объект:

const Bar *_bar; 

Вы можете переключить заостренный переменную и быть ренные, что Foo не изменит его состояние.

class Foo 
{ 
public: 
    Foo(const Bar *bar) : _bar(bar) {} 
    void SetBar(const Bar *other) { _bar = other; } 
    int GetValue() const { return _bar->GetValue(); } 

private: 
    const Bar *_bar; 
}; 
3

После инициализации ссылки его нельзя переустановить, чтобы ссылаться на другой объект. Вместо этого вы должны использовать указатель.

2

Ваш код не собирается компилироваться, потому что _bar является ссылкой, которая может быть инициализирована только один раз. Просто избавитесь от функции SetBar, потому что нет смысла пытаться модифицировать объект const или reference.

Смежные вопросы