鉴于:
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
,因此很遗憾,您将不得不以与第二类定义不太一样的方式来排列它们。
关于c++ - 为何对头文件中的放置很重要感到困惑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42605642/