2015-07-08 5 views
0

Моя цель состояла в том, чтобы реализовать класс, который может быть доступен из любого места, обеспечивая пары значений ключа;Реализация общих настроек

class SharedResources 
{ 
public: 
    static QMap <QString,QVariant> *preferences; 
}; 

//initialization 
SharedResources.preferences = new QMap<QString,QVariant>(); 

//store data 
SharedResources.preferences->insert("some_data",some_data); 

//access data 
some_data = SharedResources.preferences->value("some_data"); 

но этот код не скомпилируется.

Первая ошибка (получил подобное при каждом использовании):

/file:line: error: expected unqualified-id before '.' token 
SharedResources.preferences = new QMap<QString,QVariant>(); 
       ^

Я определенно нарушил некоторые правила C++, но что это такое?

Update: Использование :: ошибки является:

/file:line: error: undefined reference to `SharedResources::preferences' 
+2

Статические элементы - это доступ через '::', а не через.. – user463035818

+0

Правда, спасибо, я думаю, я могу удалить его, так как это слишком тривиально. –

+0

Ну, это все еще не работает. –

ответ

2

В таком случае лучше использовать статически, а не динамически выделяемую память (то есть без new).

Ваша проблема заключается в том, что вы должны объявить и определите ваше статическое поле. В файле заголовка вы только объявить его, она должна быть определена где-то в cpp файл, например:

// this defines the variable, with default ctor (w/out parameters) 
QMap<QString,QVariant> SharedResources::preferences; 

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

+0

Использование статического поля вместо указателя: QMap SharedResources :: preferences = QMap (); –

+0

Я обновил ответ в соответствии с вашим предложением. (Теоретически сокращение ненужного копирования, которое может быть оптимизировано компилятором.) – Werkov

2

Как я уже отмечал в комментарии, статические члены доступны через ::, а не через .

Я думаю, причина в том, что . является оператором, которому нужен объект, в то время как статические члены доступны без объекта.

+0

Может иметь смысл показать скорректированный код, который компилируется, может быть больше, чем просто проблема –

+0

@GlennTeitelbaum Действительно, это было бы лучше, если бы ОП отправил MCVE, потому что я не уверен, где он хочет, чтобы данные инициализации/хранения данных/доступа имели место. – user463035818

+0

Странно, как сложно, сложным проблемам с MCVE уделять меньше внимания, чем простым вопросам без одного –

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