Вот что я хочу создать:
class Theme
{
public:
Theme();
bool isValid() const;
QString name() const;
private:
QString m_name;
};
class ThemeManager
{
public:
ThemeManager();
~ThemeManager();
void setCurrentTheme(const Theme& theme);
const Theme& currentTheme() const;
const Theme& theme(const QString& name) const;
private:
Theme& m_currentTheme;
QSet<Theme> m_availableThemes;
};
Вот сложная часть:
const Theme& ThemeManager::theme(const QString& name) const
{
for (const Theme& theme : m_availableThemes)
{
if (name == theme.name())
{
return theme;
}
}
return Theme();
}
Вот чего я хочу достичь:
ThemeManager m;
const Theme& t = theme("monokai");
if (t.isValid()) {
// Theme is valid
} else {
// Theme is not valid
}
ThemeManagers
хранит список тем и ссылку на текущую.Я хочу использовать ссылки вместо указателей.Теперь, если запрашиваемая тема отсутствует в списке тем менеджера, я хотел бы вернуть ссылку на недопустимую, которую я могу проверить с помощью Theme::isValid
.Я не хотел бы использовать отдельный член, например Theme m_invalidTheme;
только для этой цели.
Мой вопрос: нет ли способа переместить временный объект наружу из области действия ThemeManager::theme
?Так что t
из t.isValid()
не является висячей ссылкой, которая нарушает код?