[英]Confused as to why placement matters within header file
鉴于:
class AlbumDataService
{
public:
explicit AlbumDataService(QSqlDatabase& database);
void init() const;
void addAlbum(Album& album) const;
void updateAlbum(const Album& album) const;
void removeAlbum(int id) const;
std::unique_ptr<std::vector<std::unique_ptr<Album>>> albums() const;
private:
QSqlDatabase& mDatabase;
};
AlbumDataService::AlbumDataService(QSqlDatabase& database) :
mDatabase(database)
{
}
我对以下内容为什么会离开mDatabase感到困惑,在上面的代码中为null
class DatabaseManager
{
public:
static void debugQuery(const QSqlQuery& query);
static DatabaseManager& instance();
~DatabaseManager();
const AlbumDataService albumService;
protected:
DatabaseManager(const QString& path = DATABASE_FILENAME);
DatabaseManager& operator =(const DatabaseManager& rhs);
private:
std::unique_ptr<QSqlDatabase> mDatabase;
};
但在这种情况下不是:
class DatabaseManager
{
public:
static void debugQuery(const QSqlQuery& query);
static DatabaseManager& instance();
~DatabaseManager();
protected:
DatabaseManager(const QString& path = DATABASE_FILENAME);
DatabaseManager& operator =(const DatabaseManager& rhs);
private:
std::unique_ptr<QSqlDatabase> mDatabase;
public:
const AlbumDataService albumService;
};
即使实现了DatabaseManager(const QString&); 两者之间没有变化
DatabaseManager::DatabaseManager(const QString& path) :
mDatabase(new QSqlDatabase(QSqlDatabase::addDatabase("QSQLITE"))),
albumService(*mDatabase)
{
mDatabase->setDatabaseName(path);
bool openStatus = mDatabase->open();
qDebug() << "Database connection: " << (openStatus ? "OK" : "Error");
albumService.init();
}
构造类时,首先要构造顺序,即初始化任何基类,然后按照它们在类定义中出现的顺序初始化数据成员。 不考虑它们在构造函数的初始化列表中出现的顺序。
这个严格的规则是有道理的,因为从语法上讲,初始化数据成员然后调用基类的构造函数没有什么不妥,但可能导致严重破坏。
看到您的公共albumService
成员需要一个完全构建的mDatabase
,您将不得不以您在第二类定义中不太难看的方式来安排它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.