2015-11-19 25 views
4

我一直在试图理解如何将它作为const引用传递。了解通过引用传递的QScopedPointer

我有以下类:

class DBContext : public QObject 

在我的课堂主窗口我把它定义为folows:

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; 
} 

然后在主窗口的构造函数初始化:

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

使用下面的StorageData功能SetDBContext():

_DBContext = db_context; 

我得到一个错误:

“QScopedPointer> :: operator =':无法访问在'QScopedPointer'类中声明的私有成员''

更新

以使用QSharedPointer和QWeakPointer的提示。这是使用这两个指针的有效方法吗?我是否也同时在A类& B上正确使用clear()?

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(); 
} 
+0

什么是_DBContext?它没有显示在你的代码中。 –

+0

我输入错误。它应该是dbContext。 – adviner

回答

2

从文档上QScopedPointer

QScopedPointer intentionally has no copy constructor or assignment operator, such that ownership and lifetime is clearly communicated.

QScopedPointer目的我以保持您指向的对象的生命周期与QScopedPointer的范围相关联。如果你可以分配/复制它,那么它会破坏整个观点。

+0

什么Qt智能指针最适合用于通过引用传递给不同的类?我不想从传递给它的类调用析构函数。我只想要它从发起它的课程中调用。在这种情况下,MainWindow – adviner

+1

一种选择是使用'QSharedPointer'。您可以复制它们,并且只有当所有副本超出范围时,该对象才会被销毁。 – MahlerFive

+0

这听起来像只是一个原始指针,如果你不想担心终身控制。 – ajshort