鉴于:

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/

10-15 06:29