Понимание передачи QScopedPointer по ссылке

Я пытался понять, как передать это как константную ссылку.

У меня следующий класс:

class DBContext : public QObject

В моем классе MainWindow я определяю его следующим образом:

private:
    QScopedPointer<DBContext> dbContext;

Как определяется класс хранилища:

class StorageData : public QObject
{
    Q_OBJECT

public:
    StorageData(QObject *parent = 0);
    ~StorageData();

    void SetDBContext(const QScopedPointer<DBContext> &db_context);

private:
    QScopedPointer<DBContext> dbContext;

В StorageData SetDBContext () я пытаюсь назначить его следующим образом:

void StorageData::SetDBContext(const QScopedPointer<DBContext> &db_context)
{
    dbContext = db_context;
}

Затем в конструкторе MainWindow инициализируем его:

dbContext.reset(new DBContext(this));
StorageData storage;
storage.SetDBContext(dbContext);

Используя следующее в функции StorageData SetDBContext ():

_DBContext = db_context; 

Я получаю сообщение об ошибке:

'QScopedPointer> :: operator =': невозможно получить доступ к закрытому члену, объявленному в классе 'QScopedPointer>'

Обновить

Совет по использованию QSharedPointer и QWeakPointer. Это правильный подход к использованию этих двух указателей? Также правильно ли я использую clear () для классов A и B?

class A
private:
  QWeakPointer<DBContext> dbContext;

void A::~A()
{
     dbContext.clear()
}
void A::SetDBContext(QWeakPointer<DBContext> db_context)
{
    dbContext= db_context;
}

void A::UseCode()
{
    QSharedPointer<DBContext> ptrContext= dbContext.toStrongRef();
    ..
}

class B constructor:
private:
    QSharedPointer<DBContext> dbContext; 

В конструкторе:

B::B()
{
    dbContext.reset(new DBContext(this));
    QWeakPointer<DBContext> ptrDBConnect = dbContext;
    storage.SetDBContext(ptrDBConnect);
}

В деструкторе:

B::~B()
{
    dbContext.clear();
}

person adviner    schedule 19.11.2015    source источник
comment
что такое _DBContext? Это не отображается в вашем коде.   -  person Anon Mail    schedule 19.11.2015
comment
Моя ошибка при наборе текста. Это должен быть dbContext.   -  person adviner    schedule 19.11.2015


Ответы (1)


Из документации на QScopedPointer:

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

Цель QScopedPointer - сохранить время жизни объекта, на который вы указываете, привязанным к области действия QScopedPointer. Если бы вы могли назначить / скопировать его, то это решило бы проблему.

person MahlerFive    schedule 19.11.2015
comment
Какой смарт-указатель Qt лучше всего использовать для перехода к другому классу только по ссылке? Я не хочу, чтобы деструктор вызывался из класса, которому он передан. Я хочу, чтобы он был вызван только из класса, который его инициировал. В этом случае MainWindow - person adviner; 19.11.2015
comment
Один из вариантов - использовать QSharedPointer. Вы можете скопировать их, и только когда все копии выйдут из области видимости, объект будет уничтожен. - person MahlerFive; 19.11.2015
comment
Для меня это звучит как необработанный указатель, если вы вообще не хотите беспокоиться об управлении временем жизни. - person ajshort; 19.11.2015
comment
Если вам нужны не совместное владение, а умные указатели, вы можете передать его как QSharedPointer, но сохранить как QWeakPointer. Или, если вы используете C ++ 11 и хотите передать право собственности, используйте std :: unique_pointer и переместите семантику. - person Frank Osterfeld; 19.11.2015
comment
Я обновил свой код, чтобы использовать QSharePointers и QWeakPointers. Если мой подход верен? - person adviner; 19.11.2015