Настройка QSharedPointer

Я исхожу из фона С# и все еще не понимаю умных указателей С++ и Qt. Это должен быть основной вопрос:

В myClass.h

QSharedPointer<AccessFlags> m_flags;

В myClass.cpp я пытаюсь установить (установлено ли правильное слово?) указатель m_flags

if(m_flags.isNull())
    m_flags = new AccessFlags();


class AccessFlags{
public:
     QHash<QString,int> flags;
     AccessFlags();  //The dictionary is setup in the constructor
};

Компилятор жалуется, что «нет совпадения для 'operator=' в.. Как мне установить указатель?


person DarwinIcesurfer    schedule 06.11.2012    source источник
comment
Почему после m_flags стоит .?   -  person David Schwartz    schedule 06.11.2012
comment
опечатка. Не копировал и не вставлял код.   -  person DarwinIcesurfer    schedule 06.11.2012


Ответы (2)


Вы пытаетесь назначить необработанный указатель на QSharedPointer в строке

m_flags = new AccessFlags();

Вы, вероятно, хотите что-то вроде

m_flags = QSharedPointer<AccessFlags>(new AccessFlags);
person Fraser    schedule 06.11.2012

Рассмотрите возможность использования std::shared_ptr вместо QSharedPointer, если вы работаете с современным C++11. компилятор (например, GCC 4.6 или выше и MSVC 10.0).

Во-первых, это стандарт, а во-вторых, вы можете использовать std::make_shared для инициализации вашего указателя, что может быть быстрее! (Например, в MSVS2010/2012 выделение происходит только один раз для make_shared вместо двух выделений: одно для нового и одно для внутреннего счетчика).

person Eugene Mamin    schedule 06.11.2012
comment
Существует статический метод create, который делает то же самое, что и std::make_shared, поэтому здесь нет никакой выгоды. И если весь проект использует классы QT, нет причин создавать беспорядок со стандартными классами, а затем мучиться с преобразованием объектов одного класса в другой. - person rightaway717; 06.05.2017
comment
Для справки: метод create доступен только в Qt5. - person tobilocker; 25.09.2018